FalconSSO/FAuth/Extensions/Decryptor/EncryptyWorker.cs
2020-04-01 10:54:48 +08:00

106 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace FAuth.Extensions.Decryptor
{
/// <summary>
/// 加密帮助类
/// </summary>
public class EncryptyWorker
{
/// <summary>
/// 补位填充方式
/// </summary>
public PaddingMode Padding { get; set; }
/// <summary>
/// 加密算法模式
/// </summary>
public CipherMode Cipher { get; set; }
/// <summary>
/// 初始化向量
/// </summary>
public byte[] IV { get; set; }
/// <summary>
/// 加密字符串获取Base64密文
/// </summary>
/// <param name="key">加密key</param>
/// <param name="str">要加密的字符串</param>
public string Encrypty(string key,string str) {
if(key.Length < 8) {
throw new Exception("加密用的key长度为8位");
}
byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0,8));
byte[] bStr = Encoding.UTF8.GetBytes(str);
var desc = createProvider();
using(var mStream = new MemoryStream()) {
using(var cStream = new CryptoStream(mStream,desc.CreateEncryptor(bKey,IV),CryptoStreamMode.Write)) {
cStream.Write(bStr,0,bStr.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
}
}
/// <summary>
/// 从Base64密文解密获取字符串
/// </summary>
/// <param name="key">加密键</param>
/// <param name="str">密文</param>
public string DesCrypty(string key,string str) {
if(key.Length < 8) {
throw new Exception("加密用的key长度为8位");
}
var bStr = Convert.FromBase64String(str);
byte[] bKey = Encoding.UTF8.GetBytes(key.Substring(0,8));
var desc = createProvider();
using(var mStream = new MemoryStream()) {
using(var cStream = new CryptoStream(mStream,desc.CreateDecryptor(bKey,IV),CryptoStreamMode.Write)) {
cStream.Write(bStr,0,bStr.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
private DESCryptoServiceProvider createProvider() {
var desc = new DESCryptoServiceProvider();
desc.Padding = this.Padding;
desc.Mode = this.Cipher;
return desc;
}
private static EncryptyWorker Deshelper { get; set; }
private EncryptyWorker() { }
/// <summary>
/// 重用模式获取默认加密帮助器
/// </summary>
public static EncryptyWorker GetHelper() {
if(Deshelper == null) {
byte[] IV = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08 };
Deshelper = GetHelper(PaddingMode.PKCS7,CipherMode.CBC,IV);
}
return Deshelper;
}
/// <summary>
/// 生成新的加密帮助器
/// </summary>
/// <param name="padding">补位方式</param>
/// <param name="cipher">加密算法模式</param>
/// <param name="IV">初始化向量</param>
public static EncryptyWorker GetHelper(PaddingMode padding,CipherMode cipher,byte[] IV) {
return new EncryptyWorker {
Cipher = cipher,
IV = IV,
Padding = padding,
};
}
}
}