在Coldfusion中加密并在C#中解密

bug*_*xer 1 c# encryption coldfusion

这是用于在coldfusion中加密的代码

<cfset strBase64Value = encrypt(strValue,24 character key,AES) />
Run Code Online (Sandbox Code Playgroud)

它产生的加密值714FEA9A9A2184769CA49D5133F08580对我来说似乎很奇怪,因为它只是大写和数字.

我应该用什么C#库来正确解密它?

同时查看此信息,默认情况下它似乎使用UUEncode算法进行编码.

我应该要求加密器使用Base64作为编码参数吗?

Lei*_*igh 6

它正在生成加密值,如 714FEA9A9A2184769CA49D5133F08580

然后他们使用"Hex",而不是默认的"UUEncode"."hex"或"base64"都可以.只要你们都同意编码,它就没关系了.

您可以使用RijndaelManaged来解密字符串.但是,ColdFusion和C#的默认加密设置略有不同.使用加密功能:

  • "AES"是"AES/ECB/PKCS5Padding"的简称
  • "ECB"模式不使用IV
  • 键字符串始终是base64编码的

注意:尽管名称不同,但对于SUN提供商,PKCS5Padding(CF/Java)对应于PaddingMode.PKCS7(C#).正如在这个帖子中所提到的,"Java中的SUN提供程序指示[s] PKCS#5应该使用PKCS#7 - "PKCS5Padding"应该是"PKCS7Padding".这是一个遗留下来的时间只有8个可以使用诸如(三重)DES对称密码之类的字节块密码. "

因此,您需要确保调整C#设置以匹配.考虑到这一点,只需从十六进制解码加密文本和从base64 解码密钥字符串.使用API中稍微丑陋的示例,只需调整算法设置以匹配encrypt()函数使用的设置:

使用ColdFusion加密

<cfscript>
    plainText     = "Nothing to see";
    // 128 bit key base64 encoded
    keyInBase64   = "Y25Aju8H2P5DR8mY6B0ezg==";
    // "AES" is short for "AES/ECB/PKCS5Padding"
    encryptedText = encrypt(plainText, keyInBase64, "AES", "hex");
    WriteDump( encryptedText );
    // result: 8889EDF02F181158AAD902AB86C63951 
</cfscript>
Run Code Online (Sandbox Code Playgroud)

用C#解密

byte[] bytes = SomeMethodToConvertHexToBytes( encryptedText );
byte[] key = Convert.FromBase64String( keyInBase64 );

string decryptedText = null;

using (RijndaelManaged algorithm = new RijndaelManaged())
{

    // initialize settings to match those used by CF
    algorithm.Mode = CipherMode.ECB;
    algorithm.Padding = PaddingMode.PKCS7;
    algorithm.BlockSize = 128;
    algorithm.KeySize = 128;
    algorithm.Key = key;

    ICryptoTransform decryptor = algorithm.CreateDecryptor();

    using (MemoryStream msDecrypt = new MemoryStream(bytes))
    {
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
        {
           using (StreamReader srDecrypt = new StreamReader(csDecrypt))
           {

               decryptedText = srDecrypt.ReadToEnd();
           }
        }
    }
}

Console.WriteLine("Encrypted String: {0}", encryptedText);
Console.WriteLine("Decrypted String: {0}", decryptedText);
Run Code Online (Sandbox Code Playgroud)

请记住,您可以(也可能应该)调整设置,例如使用更安全的CBC模式而不是ECB.您只需要与CF开发人员协调这些更改.