Как я могу сделать для Rijndael-256 с BouncyCastle API? - PullRequest
0 голосов
/ 21 мая 2018

Древний PHP-парень написал код шифрования для Rijndael-256 (!AES256) / ECB / NoPadding.

Я пробовал это.

PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
        new RijndaelEngine(256), new ZeroBytePadding());
cipher.init(encrypt, new KeyParameter(Arrays.copyOf(KEY.getBytes(UTF_8), 16)));
byte[] source = supplier.get();
byte[] target = new byte[cipher.getOutputSize(source.length)];
int offset = cipher.processBytes(source, 0, source.length, target, 0);
cipher.doFinal(target, offset);

Но шифрование всегда добавляет отступы.Да, я знаю, что использовал ZeroBytePadding.

Как я могу решить эту проблему?Мне не удалось найти хорошие ссылки.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я делюсь своим (возможным) решением на основе принятого ответа.

BufferedBlockCipher cipher =
    new BufferedBlockCipher(new RijndaelEngine(256));
cipher.init(encrypt, new KeyParameter(Arrays.copyOf(KEY.getBytes(UTF_8), 16)));
byte[] source = supplier.get();
byte[] target = new byte[cipher.getOutputSize(source.length)];
int offset = cipher.processBytes(source, 0, source.length, target, 0);
try {
    offset += cipher.doFinal(target, offset);
} catch (InvalidCipherTextException icte) {
    // if padding is expected and not found
    //throw new RuntimeException(icte);
}
target = Arrays.copyOf(target, offset);

Хотя я не уверен.

0 голосов
/ 22 мая 2018

Если шифрование действительно не добавляет заполнение, просто инициализируйте шифр следующим образом:

new BufferedBlockCipher(new RijndaelEngine(256))

Имейте в виду, что вызов doFinal выдает DataLengthException, если данные, которые вы пытаетесьdecrypt на самом деле не выровнен по блокам.

Кстати, это также хорошая привычка проверять возвращаемое значение doFinal (сколько байт было выведено), поскольку getOutputSize может быть завышенным.

...