1

我正在使用此函数使用 AES 加密/解密数据,因为它看起来简单干净(谷歌代码)

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==

但是,我在许多在线 aes 加密/解密上尝试了相同的密钥/短语,并且所有这些都返回

U2FsdGVkX184u0/vPgA/B0rxofp5Iuqm7hfn4+QZAhg=

谁能真正告诉我怎么了?

4

2 回答 2

1

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

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

然后你与一些在线AES加密/解密服务进行比较,你会发现不同之处。那是因为他们可能(希望)工作不同。

这里的主要内容是您的 2 种方法是匹配的,您可以往返您的数据。但是一个好的加密会使用不同的方式来获取 Key 和 IV。

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

于 2013-01-11T15:04:57.717 回答
1

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

这就是说简单和干净并不一定意味着正确。例如,您使用的代码确实使用了随机 IV,但未将其包含在有线格式中,您将永远无法解密您加密的内容。

我有一个剪切和粘贴样式的简单代码示例,我尝试保持最新并查看它使用使用 AES 的经过身份验证的加密:

字符串的对称认证加密的现代示例。C#

于 2013-01-11T15:06:28.077 回答