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

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

 

它正在生成加密值,如714FEA9A9A2184769CA49D5133F08580 ,这对我来说似乎很奇怪,因为它只是大写和数字。

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

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

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

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

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

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

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

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

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

使用ColdFusion加密

  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  

用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); 

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

如果有人与JAVA有类似的问题,我只是使用“Hex”和“tripledes”实现了在coldfusion中加密/解密的字符串的加密和解密。 这是我的代码:

 private static final String PADDING = "DESede/ECB/PKCS5Padding"; private static final String UTF_F8 = "UTF-8"; private static final String DE_SEDE = "DESede"; private String secretKey; public String encrypt(String message) throws Exception { secretKey = getSecretKey(); final byte[] secretBase64Key = Base64.decodeBase64(secretKey); final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE); final Cipher cipher = Cipher.getInstance(PADDING); cipher.init(Cipher.ENCRYPT_MODE, key); final byte[] plainTextBytes = message.getBytes(); final byte[] cipherText = cipher.doFinal(plainTextBytes); return Hex.encodeHexString(cipherText); } public String decrypt(String keyToDecrypt) throws Exception { secretKey = getSecretKey(); byte[] message = DatatypeConverter.parseHexBinary(keyToDecrypt); final byte[] secretBase64Key = Base64.decodeBase64(secretKey); final SecretKey key = new SecretKeySpec(secretBase64Key, DE_SEDE); final Cipher decipher = Cipher.getInstance(PADDING); decipher.init(Cipher.DECRYPT_MODE, key); final byte[] plainText = decipher.doFinal(message); return new String(plainText, UTF_F8); }