【发布时间】:2012-02-08 15:22:59
【问题描述】:
我们很难在 ColdFusion 中解密之前使用 3DES 和 C# 加密的字符串。这是我们最初用来加密字符串的代码:
public static string EncryptTripleDES(string plaintext, string key)
{
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();
DES.Key = hashMD5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(key));
DES.Mode = CipherMode.ECB;
ICryptoTransform DESEncrypt = DES.CreateEncryptor();
byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(plaintext);
string EncString = Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
EncString = EncString.Replace("+", "@@12");
return EncString;
}
我们已尝试使用此处的建议:
TripleDES Encryption - .NET and ColdFusion not playing nice
..没有运气。这是我们的 CF 代码和错误:
<cfset variables.theKey = "blahblah" />
<cfset variables.theAlgorithm = "DESede/CBC/PKCS5Padding">
<cfset variables.theEncoding = "Base64">
<cfset strTest = decrypt(#DB.PASSWORD#, variables.theKey, variables.theAlgorithm, variables.theEncoding)>
错误返回:尝试加密或解密输入字符串时出错:''无法解码字符串“blahblah”
所以,看起来它是在尝试解密密钥而不是字符串,但这不是 ColdFusion 中解密函数的概述方式。有什么想法吗?
更新:尝试使用以下 CF 代码,但返回的错误仍然是“尝试加密或解密您的输入字符串时发生错误:未正确填充最终块。”
<cfset dbPassword = "Hx41SYUrmnFPa31QCH1ArCHN1YOF8IAL">
<cfset finalText = replace(dbPassword, "@@12", "+", "all")>
<cfset theKey = "abcdefgh">
<cfset theKeyInBase64 = toBase64(theKey)>
<cfset hashedKey = hash( theKeyInBase64, "md5" )>
<cfset padBytes = left( hashedKey, 16 )>
<cfset keyBytes = binaryDecode( hashedKey & padBytes , "hex" )>
<cfset finalKey = binaryEncode( keyBytes, "base64" )>
<cfset decrypted = decrypt( finalText, finalKey, "DESede/ECB/PKCS5Padding", "base64" )>
Decrypted String: <cfdump var="#decrypted#">
更新:
如果你遵循 cmets 的解决方案是改变:
<cfset hashedKey = hash( theKeyInBase64, "md5" )>
收件人:
<cfset hashedKey = hash( theKey, "md5" )>
最后的代码是这样的:
<cfset dbPassword = "Hx41SYUrmnFPa31QCH1ArCHN1YOF8IAL">
<cfset finalText = replace(dbPassword, "@@12", "+", "all")>
<cfset theKey = "abcdefgh">
<cfset hashedKey = hash( theKey, "md5" )>
<cfset padBytes = left( hashedKey, 16 )>
<cfset keyBytes = binaryDecode( hashedKey & padBytes , "hex" )>
<cfset finalKey = binaryEncode( keyBytes, "base64" )>
<cfset decrypted = decrypt( finalText, finalKey, "DESede/ECB/PKCS5Padding", "base64" )>
Decrypted String: <cfdump var="#decrypted#">
【问题讨论】:
-
DESede/CBC/PKCS5Padding 不是有效算法。如果您安装了 ColdFusion 标准版,那么您可以使用以下内容:CFMX_COMPAT、AES、BLOWFISH、DES 和 DESEDE。如果您有 Enterprise,那么您还有 DES-EDE、DESX、RC2、RC4、RC5 和 PBE。所以我会尝试 DESEDE。
-
如果这不起作用,请尝试在 CF 中对其进行加密,看看是否会产生与 C# 相同的问题,因为有时这些问题是空格或大写,因为算法肯定与我的相同让 C# 和 CF 多次通信加密字符串。
-
当我们在 DESEDE 中替换时,不幸的是,我们得到了完全相同的错误。
-
@baynezy - “DESede/CBC/PKCS5Padding”完全有效。 CF 允许单独使用算法名称,或算法 + 反馈模式 + 填充方案。
标签: c# asp.net coldfusion 3des