C# 和 ColdFusion AES 加密不匹配
C# and ColdFusion AES Encryption not matching
我必须在 C# 中加密 url 查询字符串并传递给 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# 结果:
- 十六进制 =
89F9F3C55CD232362FE1E14240C479BE5B56210FF3913E7B6BA4BCD3C87F9AA7
- Base64 =
ifnzxVzSMjYv4eFCQMR5vltWIQ/zkT57a6S808h/mqc=
(来自评论...)
这是字符编码如何产生大差异的完美示例。
信不信由你,这只是因为在 C# 代码中使用了错误的编码。 Encoding.Unicode
使用 UTF-16, whereas CF's Encrypt function always uses UTF-8(非常不同)。因此,C# 代码加密的值与 CF 完全不同。因此会出现不同的结果,以及为什么 C# 字符串(十六进制)的长度比从 CF 返回的字符串长。
使用 Encoding.UTF8.GetBytes() 而不是 Encoding.Unicode.GetBytes()
,结果将匹配:
byte[] plainText = Encoding.UTF8.GetBytes("top secret");
我必须在 C# 中加密 url 查询字符串并传递给 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# 结果:
- 十六进制 =
89F9F3C55CD232362FE1E14240C479BE5B56210FF3913E7B6BA4BCD3C87F9AA7
- Base64 =
ifnzxVzSMjYv4eFCQMR5vltWIQ/zkT57a6S808h/mqc=
(来自评论...)
这是字符编码如何产生大差异的完美示例。
信不信由你,这只是因为在 C# 代码中使用了错误的编码。 Encoding.Unicode
使用 UTF-16, whereas CF's Encrypt function always uses UTF-8(非常不同)。因此,C# 代码加密的值与 CF 完全不同。因此会出现不同的结果,以及为什么 C# 字符串(十六进制)的长度比从 CF 返回的字符串长。
使用 Encoding.UTF8.GetBytes() 而不是 Encoding.Unicode.GetBytes()
,结果将匹配:
byte[] plainText = Encoding.UTF8.GetBytes("top secret");