我正在使用此功能使用AES加密/解密数据,因为它看起来简单干净(googl'ed代码)
public static string Encrypt(string toEncrypt)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // 256-AES key
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7; // better lang support
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string Decrypt(string toDecrypt)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73"); // AES-256 key
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7; // better lang support
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
我正在尝试加密数据“测试垃圾”,这就是我收到的内容:
YfhyS3GE / liPCaXR0cMHfQ ==
但是,我在很多在线加密/解密上尝试了相同的密钥/短语,所有这些都在返回
U2FsdGVkX184u0 / vPgA / B0rxofp5Iuqm7hfn4 + QZAhg =
任何人都可以告诉我什么是错的吗?
答案 0 :(得分:1)
首先是您的代码存在的一些问题。显然谷歌并不总是返回最好的代码。
// 256-AES key
byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73");
然后你比较一些在线aes加密/解密服务,你会看到差异。那是因为他们可能(希望)工作不同。
这里最重要的是你的两种方法是匹配的,你可以往返数据。但是,良好的加密将使用不同的方式来获得密钥和IV。
我不确定为什么你会看到不同(较小)长度的加密数据,但这取决于整个设置列表:密钥长度,填充模式等。
答案 1 :(得分:1)
“3a8114db34d5623d4fd1ee0fb0ga7a73”是十六进制编码的128位密钥,而不是utf8编码的256位密钥。
那说简单干净并不一定意味着正确。例如,您使用的代码使用随机IV,但不以有线格式包含它,您将永远无法解密您加密的内容。
我有一个剪切和粘贴样式的简单代码示例,我尝试不断更新并审核使用AES进行身份验证加密:
Modern Examples of Symmetric Authenticated Encryption of a string. C#