3DES(DESede)-在C语言中解密加密文本(由JAVA完成)#
加密文本是用JAVA完成的(我们根本没有JAVA背景) 解密将使用C#,下面是代码3DES(DESede)-在C语言中解密加密文本(由JAVA完成)#,java,c#,encryption,Java,C#,Encryption,加密文本是用JAVA完成的(我们根本没有JAVA背景) 解密将使用C#,下面是代码 public static string DecryptString(string Message, string Passphrase) { byte[] Results; UTF8Encoding UTF8 = new UTF8Encoding(); MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvide
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));
// byte[] TDESKey = UTF8.GetBytes(Passphrase);
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
TDESAlgorithm.Key = TDESKey;
// TDESAlgorithm.Mode = CipherMode.CTS;
TDESAlgorithm.Padding = PaddingMode.Zeros;
byte[] DataToDecrypt = Convert.FromBase64String(Message);
try
{
ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
HashProvider.Clear();
}
return Encoding.UTF8.GetString(Results);
}
加密的Java代码是
public String encryptData(String privateKey, String rawData)
{
Cipher cipher = null;
try
{
cipher = Cipher.getInstance(DESEDE_ENCRYPTION_SCHEME);
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(privateKey));
byte[] plainText = rawData.getBytes(UNICODE_FORMAT);
byte[] encryptedText = cipher.doFinal(plainText);
return new String(Base64.encodeBase64(encryptedText));
}
}
但是,当尝试解密时,收到错误消息:坏数据
我在这里遗漏了什么?您没有在Java中使用MD5,因此您不应该在.NET中使用它来计算散列 您的密钥应该使用特定的编码生成,并且应该在.NET中使用相同的编码 请注意,java
KeySpec
和用于TripleDescriptionServiceProvider
的密钥之间存在一些基本的区别。正如Microsfot所提到的
Triple-DES仅支持“密钥长度从128位到192位,增量为64位”
因此,您需要在分配前适当地转换密钥。为此,可以使用Array.Resize方法,如下所示
byte[] TDESKey = Encoding.UTF8.GetBytes(Passphrase);
System.Array.Resize(ref TDESKey , 192 / 8);
希望这会有所帮助。您没有在Java中使用MD5,因此您不应该在.NET中使用它来计算散列 您的密钥应该使用特定的编码生成,并且应该在.NET中使用相同的编码 请注意,java
KeySpec
和用于TripleDescriptionServiceProvider
的密钥之间存在一些基本的区别。正如Microsfot所提到的
Triple-DES仅支持“密钥长度从128位到192位,增量为64位”
因此,您需要在分配前适当地转换密钥。为此,可以使用Array.Resize方法,如下所示
byte[] TDESKey = Encoding.UTF8.GetBytes(Passphrase);
System.Array.Resize(ref TDESKey , 192 / 8);
希望这会有所帮助。AFAIK,
DESEDE\u ENCRYPTION\u SCHEME
以ECB
模式返回3DES实例,而.NET的TripleDESCryptoServiceProvider()
默认为CBC
模式。设置TDESAlgorithm.Mode=CipherMode.ECB
如何准确定义DESEDE\u加密方案?其他问题:a)Oracle JCE提供程序不支持填充模式.Zeros
。你必须使用BouncyCastle。b) 您没有在Java中进行任何MD5密钥派生。此外,不要通过单个MD5调用派生密钥。如果您有密码,则需要使用适当的方案,如PBKDF2或Argon2.AFAIK,DESEDE_ENCRYPTION_方案
以ECB
模式返回3DES实例,而.NET的TripleDESCryptoServiceProvider()
默认为CBC
模式。设置TDESAlgorithm.Mode=CipherMode.ECB
如何准确定义DESEDE\u加密方案?其他问题:a)Oracle JCE提供程序不支持填充模式.Zeros
。你必须使用BouncyCastle。b) 您没有在Java中进行任何MD5密钥派生。此外,不要通过单个MD5调用派生密钥。如果您有密码,则需要使用适当的方案,如PBKDF2或Argon2。