Мне нужно расшифровать файл в Java. Файл был зашифрован в C# с помощью RijndaelManaged. Это настройки C# для шифрования (суммированные и не упомянутые - это значения по умолчанию):
var crypto = new RijndaelManaged();
crypto.GenerateKey();
crypto.BlockSize = crypto.KeySize;
crypto.IV = crypto.Key;
crypto.Padding = PaddingMode.Zeros;
мой java код, который выдает ошибку:
java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long
:
Key aesKey = new SecretKeySpec(key, "AES");
Cipher cipher2 = Cipher.getInstance("AES/CBC/noPadding");
byte[] iv = key;
IvParameterSpec ivspec = new IvParameterSpec(iv);
cipher2.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));
byte[] decryptedFile = cipher2.doFinal(buildFile);
Я вижу 2 проблемы, касающиеся кода C#:
- сгенерированный ключ составляет 256 бит. Затем устанавливается размер блока 256 бит, но стандарт - 128 бит. Насколько мне известно, Java может использовать только размер блока 128 бит, как следует из сообщения об ошибке. По крайней мере, я не узнал, как установить размер блока.
- Rijndael использует
PaddingMode.Zeros
, что эквивалентно Padding для Cipher?
имейте в виду, что Я не могу изменить код C#
Есть ли вообще способ расшифровать его в Java?
Обновление - Решение Наконец-то мне удалось расшифровать файл, используя BouncyCastle , предложенный Topaco в комментариях. BouncyCastle включает RijndaelEngine
, как и часть C#. Это позволяет установить размер блока в 256 бит.
Чтобы ответить на мой 2. вопрос: PaddinMode.Zeros
равно new ZeroBytePadding()
Полный код:
import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.RijndaelEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.paddings.ZeroBytePadding;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
...
private byte[] decryptPart(byte[] part, byte[] key) throws Exception {
BlockCipher engine = new RijndaelEngine(key.length * 8);
PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(engine),
new ZeroBytePadding());
KeyParameter keyParam = new KeyParameter(key);
CipherParameters cipherParams = new ParametersWithIV(keyParam, key);
cipher.init(false, cipherParams);
byte[] output = new byte[cipher.getOutputSize(part.length)];
int tam = cipher.processBytes(part, 0, part.length, output, 0);
try {
cipher.doFinal(output, tam);
} catch (Exception ce) {
ce.printStackTrace();
}
return output;
}