以下是用于在coldfusion中加密的代码
<cfset strBase64Value = encrypt(strValue,24 character key,AES) />
它正在生成像714FEA9A9A2184769CA49D5133F08580
这样的加密值,这对我来说似乎很奇怪,因为它只是大写和数字。
我应该使用哪种C#库来正确解密它?
同时查看this information,默认情况下它似乎使用UUEncode算法进行编码。
我应该要求加密器使用Base64作为编码参数吗?
答案 0 :(得分:6)
正在生成
等加密值714FEA9A9A2184769CA49D5133F08580
然后他们正在使用&#34; Hex&#34;而不是默认&#34; UUEncode&#34;。要么&#34; hex&#34;或&#34; base64&#34;很好。只要你们都同意编码,它就没关系了。
您可以使用RijndaelManaged来解密字符串。但是,ColdFusion和C#的默认加密设置略有不同。使用加密功能:
NB:尽管名称不同,但对于SUN提供商,PKCS5Padding
(CF / Java)对应PaddingMode.PKCS7
(C#)。 As mentioned in this thread,Java中的&#34; ... SUN提供程序表示[s] PKCS#5,其中应使用PKCS#7 - &#34; PKCS5Padding&#34;应该是&#34; PKCS7Padding&#34;。从仅有8字节块密码(例如(三重)DES对称密码)开始,这是遗留下来的。&#34;
因此,您需要确保调整C#设置以匹配。考虑到这一点,只需解码加密文本from hex和来自base64的密钥字符串。使用slightly ugly example in the 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>
使用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
mode而不是ECB
。您只需要与CF开发人员协调这些更改。
答案 1 :(得分:1)
如果有人遇到与JAVA类似的问题,我只是使用&#34; Hex&#34;来实现加密和解密先前在coldfusion中加密/解密的字符串。和&#34;三重奏&#34;。这是我的代码:
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);
}