C#AES函数未返回预期结果

时间:2013-01-11 15:00:06

标签: c# encryption aes

我正在使用此功能使用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 =

任何人都可以告诉我什么是错的吗?

2 个答案:

答案 0 :(得分:1)

首先是您的代码存在的一些问题。显然谷歌并不总是返回最好的代码。

  • 您正在通过UTF8编码获取密钥,这很愚蠢。这会产生一个非常弱的键:
 // 256-AES key
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes("3a8114db34d5623d4fd1ee0fb0ga7a73");
  • 您正在使用CBC模式,但IV(未明确)设置。

然后你比较一些在线aes加密/解密服务,你会看到差异。那是因为他们可能(希望)工作不同。

这里最重要的是你的两种方法是匹配的,你可以往返数据。但是,良好的加密将使用不同的方式来获得密钥和IV。

我不确定为什么你会看到不同(较小)长度的加密数据,但这取决于整个设置列表:密钥长度,填充模式等。

答案 1 :(得分:1)

“3a8114db34d5623d4fd1ee0fb0ga7a73”是十六进制编码的128位密钥,而不是utf8编码的256位密钥。

那说简单干净并不一定意味着正确。例如,您使用的代码使用随机IV,但不以有线格式包含它,您将永远无法解密您加密的内容。

我有一个剪切和粘贴样式的简单代码示例,我尝试不断更新并审核使用AES进行身份验证加密:

Modern Examples of Symmetric Authenticated Encryption of a string. C#