Я пишу сервер приложений и решил использовать AES128 / CTR / NoPadding для безопасных соединений, поскольку он считается достаточно безопасным без необходимости расширять байты до границы блока, и я подумал, что это хорошо подходит для TCP, который логически цельный поток.
Проблема в том, что Cipher.update () не возвращает зашифрованный блок до тех пор, пока у него не будет полного 16-байтового блока, потому что CTR в основном основан на блочном шифре, хотя имитирует потоковый шифр. Я должен читать данные из TCP-сокета и обрабатывать сообщения, как только они приходят, но я не могу получить самый последний блок, потому что он все еще накапливается и его размер меньше 16 байт. И я не могу просто ждать, потому что мы не знаем, когда будет отправлено следующее сообщение. Конечно, я мог бы вызвать Cipher.doFinal (), чтобы получить остаток, но это означало бы конец потока (соединение) и объект Cipher будет повторно инициализирован.
Я подумал, что было бы неплохо, если бы был способ подсмотреть переходящие остатки. CTR просто выполняет операцию XOR для простого текста с потоком ключей, поэтому я должен иметь возможность получить зашифрованные данные независимо от остальных байтов в блоке. Есть ли хороший способ решения этой проблемы? Я подумываю написать оболочку, которая шифрует поддельный простой текст с нулями, чтобы заранее получить поток ключей и выполнять XOR вручную, но мне интересно, как другие люди решили эту проблему.
Обновить
Разрабатываю приложение для Android и оказалось, что это проблема ВМ Dalvik. Как указали Роберт и Моннан ниже, у Java SE нет этой проблемы, по крайней мере, с поставщиком по умолчанию. Думаю, мне придется написать класс-оболочку или изменить режим на CFB8, чтобы обойти эту проблему. (CTR8 не работал) Спасибо за все ответы!
AES128/CTR/NoPadding
, по крайней мере, с поставщиком по умолчанию. Я только что попробовал, Java 7 Oracle (но, возможно, моя установка запуталась, и я использую OpenJDK, все возможно). - person maaartinus   schedule 13.10.2014