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