Я сам реализую режим CBC. И я использую AES в качестве функции E для каждого блока CBC.
Вот мой код шифрования:
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.
Когда я хочу расшифровать блок зашифрованного текста, я использую ту же функцию с 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<Byte>
будет потреблять примерно в 16 раз больше памяти, чем байтовый массив из-за упаковки. - person SLaks   schedule 05.10.2014BytesConverter.toByteList
, но я предполагаю, что используется либо LinkedList, либо ArrayList, и вы, безусловно, правы в этих случаях. И практически нет причин использоватьList
. Посмотрите наjava.nio.ByteBuffer
, если вам нужна оболочка. - person Maarten Bodewes   schedule 06.10.2014ByteBuffer
. Обратите внимание, что обработкаposition
иlimit
вByteBuffer
требует некоторого привыкания, внимательно прочитайте API, если вы идете по этому пути. - person Maarten Bodewes   schedule 06.10.2014