Расшифровка байтов, зашифрованных RijndaelManaged .NET с использованием Java - PullRequest
5 голосов
/ 22 мая 2011

Я пытаюсь расшифровать что-то, что было зашифровано с помощью RijndaelManaged из .NET / C #, с использованием Java для расшифровки.

Программа на C # не моя;Я не могу изменить это, чтобы быть более совместимым.Но я знаю, как это шифрование:

byte[] bytes = new UnicodeEncoding().GetBytes(password); // edit: built-in is 8chars
FileStream fileStream = new FileStream(outputFile, FileMode.Create);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
CryptoStream cryptoStream = new CryptoStream((Stream) fileStream,
    rijndaelManaged.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);

Я не знаю, как расшифровать это на стороне Java.Ближайшая полезная вещь, которую я нашел, - это это сообщение в блоге , но в нем мало реальных деталей, и я не смог реализовать расшифровщик.

Редактировать: я идиот и теперь имеюэто работает.

UnicodeEncoding - это UTF-16LE, а я использовал UTF-8.Переключение на правильную кодировку при подключении пароля исправило программу.

Мне также нужно было получить BouncyCastle и выполнить Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");

finaledit: вот код для расшифровки по умолчанию Поток RijndaelManaged из .NET в Java, при условии, что он был создан с использованием необработанного пароля в качестве ключа:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
String password = "kallisti"; // only 8, 12, or 16 chars will work as a key
byte[] key = password.getBytes(Charset.forName("UTF-16LE"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"),
    new IvParameterSpec(key));
return cipher; // then use CipherInputStream(InputStream, Cipher)

И помните: если вы управляете концом C #, не используйте необработанный пароль кактвой ключ!

1 Ответ

3 голосов
/ 22 мая 2011

Это возможно с использованием стандартной расшифровки AES. Rijndel - просто расширенный набор AES, который более слаб с определенными опциями. См. Поддержка Rijndael в Java для получения более подробной информации.

Из ответа, приведенного в связанном вопросе:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post
byte[] iv = null ; //Ditto
byte[] plaintext = null; //Whatever you want to encrypt/decrypt
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//You can use ENCRYPT_MODE or DECRYPT_MODE
cipher.calling init(Cipher.DECRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] ciphertext = cipher.doFinal(plaintext);
...