У нас возникают проблемы с расшифровкой строки в 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 и ColdFusion не очень хорошо играют
.. без удачи. Вот наш код 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#">
UPDATE:
Решение, если вы последуете комментариям, должно было измениться:
<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#">