3DES(DESede)-在C语言中解密加密文本(由JAVA完成)#

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

加密文本是用JAVA完成的(我们根本没有JAVA背景)

解密将使用C#,下面是代码

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。