2016-04-10 2 views
1

зашифрованный текст делается в Java (который у нас нет никакого JAVA фона вообще)3DES (DESede) - Расшифровать зашифрованный текст (сделано по JAVA) в C#

дешифрования будет находиться в 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)); 
    } 
} 

Однако, когда пытался расшифровать, получил сообщение об ошибке: Неверные данные

Где я здесь отсутствую?

+0

AFAIK, 'DESEDE_ENCRYPTION_SCHEME' возвращает экземпляр 3DES в режиме« ECB », тогда как .NET« TripleDESCryptoServiceProvider() »по умолчанию используется в режиме« CBC ». Установите 'TDESAlgorithm.Mode = CipherMode.ECB' –

+3

Как именно определяется' DESEDE_ENCRYPTION_SCHEME'? Другие проблемы: a) Поставщик Oracle JCE не поддерживает 'PaddingMode.Zeros'. Вам нужно будет использовать BouncyCastle. b) Вы не делаете вывод ключей MD5 в Java. Кроме того, не извлекайте ключ через один вызов MD5. Если у вас есть пароли, вам нужно использовать правильную схему, такую ​​как PBKDF2 или Argon2. –

ответ

0

Вы не используете MD5 в Java, поэтому вы не должны использовать его в своем .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); 

Надеюсь, это поможет.

Смежные вопросы