Я сам реализую режим CBC. И я использую AES как функцию E для каждого блока CBC.AES. javax.crypto.Cipher возвращает пустой массив в режиме дешифрования
Вот мой код шифрования:
public static List<Byte> encrypt(List<Byte> bytes, byte[] key) throws Exception {
byte[] bytesArray = BytesConverter.toByteArray(bytes);
SecretKey secretKey = new SecretKeySpec(key, AES);
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return BytesConverter.toByteList(cipher.update(bytesArray));
}
Я использую update
, потому что я не хочу, чтобы добавить AES площадку. Я делаю это сам для последнего блока в начале CBC algorythm.
Когда я хочу расшифровать блок cyphertext, я использую ту же функцию с Cipher.DECRYPTION_MODE.
public static List<Byte> decrypt(List<Byte> bytes, byte[] key) throws Exception {
byte[] bytesArray = BytesConverter.toByteArray(bytes);
SecretKey secretKey = new SecretKeySpec(key, AES);
Cipher cipher = Cipher.getInstance(AES);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return BytesConverter.toByteList(cipher.update(bytesArray));
}
проблемы является то, что Cipher.update
в режиме дешифрования возвращает пустой массив байтов для ввода, которое было зашифровано с помощью метода encrypt
.
Я смущен. Что не так?
Обратите внимание, что 'List' будет потреблять примерно в 16 раз больше памяти, чем массив байтов из-за бокса. –
SLaks
@SLaks, который зависит от реализации 'BytesConverter.toByteList', но я полагаю, что используются либо LinkedList, либо ArrayList, и вы наверняка были бы правы в этих случаях. И нет никакого смысла использовать «Список». Посмотрите на 'java.nio.ByteBuffer', если вам нужна оболочка. –
@owlstead Мне просто нужен подсписок. Вот почему я использую List. –