3DES-在C中解密加密文本(通过JAVA)#
情况如下:3DES-在C中解密加密文本(通过JAVA)#,java,c#-2.0,3des,Java,C# 2.0,3des,情况如下: 加密文本是用JAVA完成的(我们根本没有JAVA背景) 方法为3DES 填充的是PKCS#5 基数64 解密将使用C#,以下是代码: public static string DecryptString(string Message, string Passphrase) { byte[] Results; UTF8Encoding UTF8 = new UTF8Encoding(); MD5CryptoService
public static string DecryptString(string Message, string Passphrase)
{
byte[] Results;
UTF8Encoding UTF8 = new UTF8Encoding();
MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
byte[] DataToDecrypt = Convert.FromBase64String(Message);
try
{
ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
HashProvider.Clear();
}
return UTF8.GetString(Results);
}
但是,当尝试解密时,收到错误消息:坏数据
我在哪里失踪了
提前谢谢
添加,以下是加密的工作原理:
<cffunction name="getToken" returntype="String" output="false">
<cfscript>
plainText = getPlainText();
rawSecretKey = CreateObject("java","sun.misc.BASE64Decoder").decodeBuffer(variables.encryptionKey);
secretKeySpec = CreateObject("java","javax.crypto.spec.SecretKeySpec").init(rawSecretKey,"DESEDE");
cipher = CreateObject("java","javax.crypto.Cipher").getInstance("DESEDE");
cipher.init(Cipher.ENCRYPT_MODE, secretkeySpec);
encrypted = cipher.doFinal(plainText.getBytes()); // a byte array (a binary in CF)
return URLEncodedFormat(ToString(ToBase64(encrypted)));
</cfscript>
</cffunction>
明文=获取明文();
rawSecretKey=CreateObject(“java”,“sun.misc.BASE64Decoder”).decodeBuffer(variables.encryptionKey);
secretKeySpec=CreateObject(“java”,“javax.crypto.spec.secretKeySpec”).init(rawSecretKey,“DESEDE”);
cipher=CreateObject(“java”、“javax.crypto.cipher”).getInstance(“DESEDE”);
cipher.init(cipher.ENCRYPT_模式,secretkeySpec);
加密=cipher.doFinal(明文.getBytes());//字节数组(CF中的二进制)
返回URLEncodedFormat(ToString(ToBase64(加密));
更新:
这个问题已经解决了。问题是需要从Base64转换密钥。答案是:
而不是:
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
这样做:
byte[] TDESKey = Convert.FromBase64String(Passphrase);
这就解决了这个问题。那么,pkcs是5还是7?除此之外,看起来不错。我所做的是在编码过程中的每一步之后打印一个字符串,这允许在解码过程中定位问题。啊,在这种情况下,PKCS#7与#5.Alex兼容,谢谢你的建议。我调试它时,错误发生在这一行:Results=Decryptor.TransformFinalBlock(DataToDecrypt,0,DataToDecrypt.Length)@用户610271:如果你自己已经解决了你的问题,那么就回答并接受它。