C#和ColdFusion AES加密不匹配

时间:2015-08-11 15:18:44

标签: algorithm c#-4.0 encryption coldfusion aes

我必须在C#中加密url查询sting并传递给ColdFusion页面。有人帮我在C#.net中使用AES算法编写加密代码,这相当于以下的ColdFusion函数吗?提前谢谢。

<cfset strLink = Encrypt("top secret", "WTq8zYcZfaWVvMncigHqwQ==", "AES","Hex")>

CF结果:

  • strLink = 91E72250B8A7EDBC4E5AF37F04E6AB5B

我在C#中尝试了以下代码,但结果不匹配。

        byte[] plainText = Encoding.Unicode.GetBytes("top secret");

        byte[] key = Convert.FromBase64String("WTq8zYcZfaWVvMncigHqwQ==");
        RijndaelManaged algorithm = new RijndaelManaged();
        algorithm.Mode = CipherMode.ECB;
        algorithm.Padding = PaddingMode.PKCS7;
        algorithm.BlockSize = 128;
        algorithm.KeySize = 128;
        algorithm.Key = key;
        string result;
        using (ICryptoTransform encryptor = algorithm.CreateEncryptor())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(plainText, 0, plainText.Length);
                    cryptoStream.FlushFinalBlock();
                   result = Convert.ToBase64String(memoryStream.ToArray());
                }
            }
        }
        return result;

C#结果:

  • HEX = 89F9F3C55CD232362FE1E14240C479BE5B56210FF3913E7B6BA4BCD3C87F9AA7
  • Base64 = ifnzxVzSMjYv4eFCQMR5vltWIQ/zkT57a6S808h/mqc=

1 个答案:

答案 0 :(得分:2)

(来自评论......)

这是字符编码如何产生差异的完美示例。

信不信由你,只是因为在C#代码中使用了错误的编码。 Encoding.Unicode使用UTF-16,而CF的加密功能始终使用UTF-8(非常不同)。因此,C#代码加密的值与CF完全不同。因此,不同的结果,以及为什么C#字符串(十六进制)的长度比从CF返回的长度长。

使用Encoding.UTF8.GetBytes()代替Encoding.Unicode.GetBytes(),结果将匹配:

byte[] plainText = Encoding.UTF8.GetBytes("top secret");