FalconSSO/FAuth/Extensions/Decryptor/EncryptyWorker.cs

106 lines
3.8 KiB
C#
Raw Normal View History

2020-04-01 10:54:48 +08:00
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,
};
}
}
}