К сожалению, реализации Bouncy Castle и Oracle/Java не доступны онлайн. То есть сетевые свойства базового шифрования режима CTR не сохраняются. Онлайн в этом контексте означает, что байты напрямую шифруются/дешифруются, когда они приходят. Это может быть связано с тем, как обрабатывается шифрование и как обрабатываются теги аутентификации.
AES-CTR может быть реализован несколькими способами. Вы можете сначала зашифровать счетчик, а затем напрямую XOR с открытым текстом/зашифрованным текстом, когда он прибудет. Вы также можете сначала буферизовать открытый текст, а затем, когда у вас есть полный блок, создать счетчик, зашифровать его, а затем выполнить операцию XOR над полным блоком открытого текста. У этого были преимущества в том смысле, что он больше напоминал другие режимы работы, такие как CBC. Кроме того, вам, возможно, не придется буферизировать ключевой поток в памяти все это время.
Тег аутентификации также может обрабатываться по-разному. Здесь есть в основном три варианта. Вы можете просто рассматривать тег аутентификации как отдельный объект по отношению к зашифрованному тексту. Это позволяет вам сохранить онлайн-свойства режима CTR и, на мой взгляд, должно быть предпочтительным вариантом. Вы также можете увидеть его как часть зашифрованного текста, но в этом случае вы потеряете онлайн-свойства во время расшифровки; вам нужно знать, где заканчивается зашифрованный текст, прежде чем вы сможете обработать последнее количество байтов, составляющих тег аутентификации. Таким образом, вам нужно будет буферизовать как минимум размер в байтах тега аутентификации. Наконец, во время расшифровки вы можете захотеть вернуть только байты открытого текста после проверки байтов открытого текста. В этом случае вам нужно будет буферизовать весь зашифрованный текст и вернуть открытый текст за один раз.
Поскольку проблемы с тегом аутентификации связаны только с расшифровкой, вполне вероятно, что Bouncy будет просто буферизоваться из-за того, как реализован CTR. Вам действительно нужно вызвать doFinal
, как Роберт уже упоминал в комментариях, чтобы получить последний блок зашифрованного текста, а также тег аутентификации. Возможно, шифрование еще не выполнено, потому что процедура шифрования также остается несколько симметричной процедуре дешифрования.
person
Maarten Bodewes
schedule
09.04.2016
doFinal(..)
для последнего обрабатываемого блока данных. - person Robert   schedule 09.04.2016doFinal()
, что необходимо для создания тега аутентификации. - person zaph   schedule 18.04.2016