You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
4.1 KiB
104 lines
4.1 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Security.Cryptography;
|
|
using System.Threading.Tasks;
|
|
using System.IO;
|
|
|
|
namespace FangYar.Common
|
|
{
|
|
public class AesCommon
|
|
{
|
|
const string AES_IV = "6603750123433742";
|
|
/// AES加密算法
|
|
/// </summary>
|
|
/// <param name="input">明文字符串</param>
|
|
/// <param name="key">密钥(32位)</param>
|
|
/// <returns>字符串</returns>
|
|
public static string EncryptByAES(string input, string key)
|
|
{
|
|
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
|
|
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
|
|
{
|
|
aesAlg.Key = keyBytes;
|
|
aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16));
|
|
|
|
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
|
|
using (MemoryStream msEncrypt = new MemoryStream())
|
|
{
|
|
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
|
|
{
|
|
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
|
|
{
|
|
swEncrypt.Write(input);
|
|
}
|
|
byte[] bytes = msEncrypt.ToArray();
|
|
return ByteArrayToHexString(bytes);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// AES解密
|
|
/// </summary>
|
|
/// <param name="input">密文字节数组</param>
|
|
/// <param name="key">密钥(32位)</param>
|
|
/// <returns>返回解密后的字符串</returns>
|
|
public static string DecryptByAES(string input, string key)
|
|
{
|
|
byte[] inputBytes = HexStringToByteArray(input);
|
|
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 32));
|
|
using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
|
|
{
|
|
aesAlg.Key = keyBytes;
|
|
aesAlg.IV = Encoding.UTF8.GetBytes(AES_IV.Substring(0, 16));
|
|
|
|
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
|
|
using (MemoryStream msEncrypt = new MemoryStream(inputBytes))
|
|
{
|
|
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Read))
|
|
{
|
|
using (StreamReader srEncrypt = new StreamReader(csEncrypt))
|
|
{
|
|
return srEncrypt.ReadToEnd();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 将指定的16进制字符串转换为byte数组
|
|
/// </summary>
|
|
/// <param name="s">16进制字符串(如:“7F 2C 4A”或“7F2C4A”都可以)</param>
|
|
/// <returns>16进制字符串对应的byte数组</returns>
|
|
public static byte[] HexStringToByteArray(string s)
|
|
{
|
|
s = s.Replace(" ", "");
|
|
byte[] buffer = new byte[s.Length / 2];
|
|
for (int i = 0; i < s.Length; i += 2)
|
|
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
|
|
return buffer;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 将一个byte数组转换成一个格式化的16进制字符串
|
|
/// </summary>
|
|
/// <param name="data">byte数组</param>
|
|
/// <returns>格式化的16进制字符串</returns>
|
|
public static string ByteArrayToHexString(byte[] data)
|
|
{
|
|
StringBuilder sb = new StringBuilder(data.Length * 3);
|
|
foreach (byte b in data)
|
|
{
|
|
//16进制数字
|
|
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
|
|
//16进制数字之间以空格隔开
|
|
//sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
|
|
}
|
|
return sb.ToString().ToUpper();
|
|
}
|
|
}
|
|
}
|
|
|