Невозможно расшифровать, используя TripleDES в .NET, зашифрованный в Java - PullRequest
0 голосов
/ 19 декабря 2011

У нас есть клиент Java, который отправляет нам некоторые зашифрованные данные 1. Случайная строка шифруется с использованием RSA и открытого ключа, который мы предоставили им в автономном режиме.2. используя ключ, сгенерированный на шаге 1, они шифруют данные, используя alg_tripleDES_CBC = http://www.w3.org/2001/04/xmlenc#tripledes-cbc

Мне удалось расшифровать ключ с 1-го шага, как это ... это работает.

public static string DecryptKey(string encryptedKey)
    {
        X509Certificate2 cert = new X509Certificate2("c:\\test.pfx", "test");
        RSACryptoServiceProvider privateKeyProvider = (RSACryptoServiceProvider)cert.PrivateKey;

        string decryptedKey = System.Text.Encoding.UTF8.GetString(privateKeyProvider.Decrypt(Convert.FromBase64String(encryptedKey), false));

        return decryptedKey;

    }

И у меня есть этот код для дешифрования данных с использованием ключа, сгенерированного с 1-го шага.

 public static string DecryptString(string Message, string Passphrase)
    {
        byte[] Results;
        System.Text.UTF8Encoding UTF8 = new System.Text.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);
    }

И второй шаг завершается неудачей с этим исключением.

   System.Security.Cryptography.CryptographicException: Bad Data.

   at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
   at System.Security.Cryptography.Utils._DecryptData(SafeKeyHandle hKey, Byte[] data, Int32 ib, Int32 cb, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode PaddingMode, Boolean fDone)
   at System.Security.Cryptography.CryptoAPITransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
   at ConsoleApplication3.Program.DecryptString(String Message, String Passphrase) in C:\Documents and Settings\rjaladi\Desktop\ConsoleApplication3\ConsoleApplication3\Program.cs:line 66
   at ConsoleApplication3.Program.Main(String[] args) in C:\Documents and Settings\rjaladi\Desktop\ConsoleApplication3\ConsoleApplication3\Program.cs:line 22 

Что это такое?нужно проверить с нашим клиентом?Я знаю, что с параметрами, которые мы передаем в TDES, что-то не так.Любая помощь?

РЕДАКТИРОВАТЬ: Соответствующий код Java, который шифрует сообщение.

public String encryptText(String plainText) throws Exception{

  byte[] plaintext = plainText.getBytes();
  byte[] tdesKeyData = key;
  byte[] myIV = initializationVector;

  Cipher c3des = Cipher.getInstance(""DESede/CBC/NoPadding"");
  SecretKeySpec    myKey = new SecretKeySpec(tdesKeyData, "DESede");
  IvParameterSpec ivspec = new IvParameterSpec(myIV);
     c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);
  byte[] cipherText = c3des.doFinal(plaintext);
  sun.misc.BASE64Encoder obj64=new sun.misc.BASE64Encoder();
  return obj64.encode(cipherText);
 }

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Возможно, это не удастся:

TDESAlgorithm.Mode = CipherMode.ECB;

Вы должны использовать CBC-шифр, если вы использовали CBC для шифрования Java.И в любом случае не рекомендуется использовать ECB, потому что он имеет некоторые недостатки в безопасности.

1 голос
/ 20 декабря 2011

Ваше исключение добавляется в _DecryptData(...), который, как я заметил, включает в себя параметр PaddingMode.Заполнение в конце этого последнего блока будет проверено и будет выдано сообщение об ошибке, если будет найдено неправильное заполнение.Я предлагаю вам проверить, кто отправляет данные, чтобы увидеть, какой режим заполнения они используют.Вам нужно будет использовать тот же режим заполнения при расшифровке.

Как говорит @klartrex, вы не должны использовать режим ECB, он пропускает информацию;см. здесь для (буквальной) иллюстрации.Вместо этого используйте режим CBC или CTR, если вы можете убедить другой конец сделать это.

...