2016-11-10 12 views
0
private static byte[] encryptData(ByteArrayOutputStream data, byte[] symmetricKey) throws EncryptionException { 
     try { 
      SecretKey secKey = new SecretKeySpec(symmetricKey, "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      cipher.init(Cipher.ENCRYPT_MODE, secKey); 
      return cipher.doFinal(data.toByteArray()); 
     } catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | 
       InvalidKeyException | 
       BadPaddingException e) { 
      throw new EncryptionException(e); 
     } 
    } 

У меня возникла ситуация, когда мне нужно зашифровать данные с помощью .NET и дешифровать одни и те же данные с помощью JAVA. По сути, мне нужно переписать вышеупомянутый метод шифрования в .NET.Симметричное шифрование в C# напоминает JAVA

public byte[] Encrypt(byte[] key, byte[] plainText) 
     { 
      using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider()) 
      { 
       using (ICryptoTransform encryptor = aesProvider.CreateEncryptor(key, magicIV)) 
       { 
        using (MemoryStream ms = new MemoryStream()) 
        { 
         using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
         { 
          cs.Write(plainText, 0, plainText.Length); 
         } 
         byte[] cipherText = ms.ToArray(); 
         return cipherText; 
        } 
       } 
      } 
     } 

Вышеупомянутый код, который я использовал где-то, имеет мандаты IV, которые JAVA не просит. Что такое IV, используемый в JAVA-коде?

Я пробовал много ссылок, которые не работали. Symmetric Encryption between .NET and Java

Пожалуйста, помогите

+1

Stackoverflow не является кодовым письмом. Такие вопросы, как ваш, должны быть закрыты как * слишком широкие *. –

+0

Возможно, вы должны полностью удалить вышеуказанный код. Это далеко не безопасно. –

ответ

2

Если ваш текущий код Java дешифрования также не просит капельницу (и ваш дешифрования возвращает те же данные, зашифрованные), то Cipher.getInstance("AES") возвращается объект, используя режим ECB блока.

Симметричные алгоритмы .NET по умолчанию для режима блока CBC, для которого требуется IV.

У вас есть несколько вариантов:

  • Набор aesProvider.Mode = CipherMode.ECB перед вызовом CreateEncryptor.
  • Передача aesProvider.IV по параметру IV CreateEncryptor. Свойство IV сделает криптографически случайное значение для первого прочитанного, если оно не установлено.
    • Вам необходимо передать эти данные в процедуру дешифрования, которая затем должна использовать «AES/CBC/PKCS5Padding» и установить значение IV, однако это делается на Java.
    • Одним из распространенных способов транспорта является просто добавление данных в шифротекст, а затем просто отбирать первые 16 байтов при дешифровке.
    • НЕ используйте фиксированное значение для IV, потому что это почти то же самое, что и ECB.