RaUI/Source/MyDb/SafeCheck/AES.cs
2020-11-28 15:03:57 +08:00

110 lines
3.9 KiB
C#
Raw Permalink 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.Text;
using System.Security.Cryptography;
using System.IO;
namespace rySafe
{
/// <summary>
/// AES加密解密类
/// </summary>
public class AES
{
//默认密钥向量
private static readonly byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// AES加密算法
/// </summary>
/// <param name="plainText">明文字符串</param>
/// <param name="strKey">密钥</param>
/// <returns>返回加密后的密文字节数组</returns>
public static byte[] AESEncrypt(string plainText, string strKey)
{
//分组加密算法
SymmetricAlgorithm des = Rijndael.Create();
byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
//设置密钥及密钥向量
des.Key = Encoding.UTF8.GetBytes(strKey);
des.IV = _key1;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组
cs.Close();
ms.Close();
return cipherBytes;
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="cipherText">密文字节数组</param>
/// <param name="strKey">密钥</param>
/// <returns>返回解密后的字符串</returns>
public static byte[] AESDecrypt(byte[] cipherText, string strKey)
{
SymmetricAlgorithm des = Rijndael.Create();
des.Key = Encoding.UTF8.GetBytes(strKey);
des.IV = _key1;
byte[] decryptBytes = new byte[cipherText.Length];
MemoryStream ms = new MemoryStream(cipherText);
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);
cs.Read(decryptBytes, 0, decryptBytes.Length);
cs.Close();
ms.Close();
return decryptBytes;
}
/// <summary>
/// 加密
/// </summary>
/// <param name="data"></param>
/// <param name="pass"></param>
/// <returns></returns>
public static string Encode(string data,string pass)
{
byte[] encryptBytes = AESEncrypt(data, ConvertKey(pass));
return Convert.ToBase64String(encryptBytes);
//将加密后的密文转换为Base64编码以便显示可以查看下结果
}
/// <summary>
/// 解码
/// </summary>
/// <param name="data"></param>
/// <param name="pass"></param>
/// <returns></returns>
public static string Decode(string data, string pass)
{
try
{
//解密
byte[] decryptBytes = AESDecrypt(Convert.FromBase64String(data), ConvertKey(pass));
//将解密后的结果转换为字符串,也可以将该步骤封装在解密算法中
string result = Encoding.UTF8.GetString(decryptBytes);
return result.Replace("\0", "");
}
catch
{
return "";
}
}
/// <summary>
/// 转换密钥到合法密钥
/// </summary>
/// <param name="pass"></param>
/// <returns></returns>
public static string ConvertKey(string pass)
{
string sxStr = MD5Sha1.GetMD5(pass);
if (sxStr.Length > 32)
{
return sxStr.Substring(0, 32);
}
else
{
return (sxStr + sxStr).Substring(0, 32);
}
}
}
}