147 lines
4.6 KiB
C#
147 lines
4.6 KiB
C#
using System.Security.Cryptography;
|
||
using System.Text;
|
||
|
||
namespace AxibugEmuOnline.Server.Common
|
||
{
|
||
public static class AESHelper
|
||
{
|
||
static byte[] currKey;
|
||
static byte[] currIV;
|
||
|
||
public static void LoadKeyIVCfg(string key, string vi)
|
||
{
|
||
try
|
||
{
|
||
currKey = CommaSeparatedStringToByteArray(key);
|
||
currIV = CommaSeparatedStringToByteArray(key);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine("aeskeyvi 配置错误"+ex.Message);
|
||
}
|
||
}
|
||
|
||
public static void LoadKeyIVCfg(byte[] key, byte[] vi)
|
||
{
|
||
currKey = key;
|
||
currIV = key;
|
||
}
|
||
|
||
public static void GenAesKeyIV()
|
||
{
|
||
Aes aes = Aes.Create();
|
||
aes.KeySize = 128;
|
||
aes.Mode = CipherMode.CBC;
|
||
aes.Padding = PaddingMode.PKCS7;
|
||
aes.GenerateKey();
|
||
aes.GenerateIV();
|
||
|
||
string key = ByteArrayToCommaSeparatedString(aes.Key);
|
||
Console.WriteLine("key:");
|
||
Console.WriteLine(key);
|
||
string vi = ByteArrayToCommaSeparatedString(aes.IV);
|
||
Console.WriteLine("iv:");
|
||
Console.WriteLine(vi);
|
||
|
||
byte[] temp = new byte[255];
|
||
for (byte i = 0; i < temp.Length; i++)
|
||
temp[i] = i;
|
||
byte[] EncodeData = Encrypt(temp, aes.Key, aes.IV);
|
||
byte[] DecodeData = Decrypt(EncodeData, aes.Key, aes.IV);
|
||
|
||
bool bOk = true;
|
||
if (temp.Length != DecodeData.Length)
|
||
{
|
||
bOk = false;
|
||
}
|
||
else
|
||
{
|
||
for (int i = 0; i < temp.Length; i++)
|
||
{
|
||
if (temp[i] != DecodeData[i])
|
||
{
|
||
bOk = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
Console.WriteLine($"密钥和填充加解密验证:{bOk}");
|
||
}
|
||
|
||
public static string ByteArrayToCommaSeparatedString(byte[] byteArray)
|
||
{
|
||
if (byteArray == null)
|
||
throw new ArgumentNullException(nameof(byteArray));
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
|
||
for (int i = 0; i < byteArray.Length; i++)
|
||
{
|
||
sb.Append(byteArray[i]);
|
||
|
||
// 不是最后一个元素时,添加逗号
|
||
if (i < byteArray.Length - 1)
|
||
{
|
||
sb.Append(",");
|
||
}
|
||
}
|
||
|
||
return sb.ToString();
|
||
}
|
||
|
||
public static byte[] CommaSeparatedStringToByteArray(string commaSeparatedString)
|
||
{
|
||
if (string.IsNullOrEmpty(commaSeparatedString))
|
||
throw new ArgumentNullException(nameof(commaSeparatedString));
|
||
|
||
// 去除字符串两端的空格,并按逗号分割
|
||
string[] byteStrings = commaSeparatedString.Trim().Split(',');
|
||
|
||
// 将每个字符串转换成byte,并存储到数组中
|
||
byte[] byteArray = byteStrings.Select(byteString =>
|
||
{
|
||
if (!byte.TryParse(byteString, out byte result))
|
||
throw new FormatException($"无法将字符串 '{byteString}' 解析为字节。");
|
||
return result;
|
||
}).ToArray();
|
||
|
||
return byteArray;
|
||
}
|
||
|
||
public static byte[] Encrypt(byte[] toEncryptArray)
|
||
{
|
||
return Encrypt(toEncryptArray, currKey, currIV);
|
||
}
|
||
|
||
public static byte[] Encrypt(byte[] toEncryptArray, byte[] keyArray, byte[] ivArray)
|
||
{
|
||
Aes rDel = Aes.Create();
|
||
rDel.Key = keyArray;
|
||
rDel.IV = ivArray;
|
||
rDel.Mode = CipherMode.CBC;
|
||
rDel.Padding = PaddingMode.PKCS7;
|
||
ICryptoTransform cTransform = rDel.CreateEncryptor();
|
||
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
|
||
return resultArray;
|
||
}
|
||
|
||
public static byte[] Decrypt(byte[] toDecrypt)
|
||
{
|
||
return Decrypt(toDecrypt, currKey, currIV);
|
||
}
|
||
|
||
public static byte[] Decrypt(byte[] toDecrypt, byte[] keyArray, byte[] ivArray)
|
||
{
|
||
Aes rDel = Aes.Create();
|
||
rDel.Key = keyArray;
|
||
rDel.IV = ivArray;
|
||
rDel.Mode = CipherMode.CBC;
|
||
rDel.Padding = PaddingMode.PKCS7;
|
||
ICryptoTransform cTransform = rDel.CreateDecryptor();
|
||
byte[] resultArray = cTransform.TransformFinalBlock(toDecrypt, 0, toDecrypt.Length);
|
||
return resultArray;
|
||
}
|
||
|
||
}
|
||
} |