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

时间:2016-04-10 11:50:34

标签: java c# encryption

加密文本在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));
    } 
}

但是,当尝试解密时,收到错误消息:BAD DATA

我在哪里错过了?

1 个答案:

答案 0 :(得分:0)

您没有在Java中使用MD5,因此您不应该在.NET中使用它来计算哈希值。

您的密钥应该是使用特定的编码生成的,您应该在.NET中使用它。

请注意,java KeySpec和用于TripleDESCryptoServiceProvider的密钥存在一些根本区别。正如Microsfot所提到的https://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledescryptoserviceprovider.aspx

Triple DES仅支持 "密钥长度从128位到192位,增量为64位"

因此,您需要在分配之前适当地转换密钥。为此,您可以使用Array.Resize方法,如下所示。

byte[] TDESKey = Encoding.UTF8.GetBytes(Passphrase);
System.Array.Resize(ref TDESKey , 192 / 8);

希望这会有所帮助。