Как AES/GCM обрабатывает данные, размер которых меньше размера блока?

Я использую библиотеку надувных замков для шифрования и дешифрования в С#, и мне было интересно, как работать с простым текстом, размер которого меньше размера блока. ?

вот что я сделал до сих пор:

AesFastEngine engine = new AesFastEngine();
GcmBlockCipher cipher = new GcmBlockCipher(engine);
AeadParameters param = new AeadParameters(new KeyParameters(key), 128, iv, null);
cipher.Init(true, parameters);

byte[] encData = new byte[plain.Length];
cipher.ProcessBytes(plain, 0, plain.Length, encData, 0);

когда простые данные меньше размера блока, он ничего не делает.


person Community    schedule 09.04.2016    source источник
comment
Вы должны вызвать doFinal(..) для последнего обрабатываемого блока данных.   -  person Robert    schedule 09.04.2016
comment
AES/GCM не требует заполнения, он использует режим CTR (счетчик). Как утверждает @Robert, вам нужно вызвать doFinal(), что необходимо для создания тега аутентификации.   -  person zaph    schedule 18.04.2016


Ответы (1)


К сожалению, реализации Bouncy Castle и Oracle/Java не доступны онлайн. То есть сетевые свойства базового шифрования режима CTR не сохраняются. Онлайн в этом контексте означает, что байты напрямую шифруются/дешифруются, когда они приходят. Это может быть связано с тем, как обрабатывается шифрование и как обрабатываются теги аутентификации.

AES-CTR может быть реализован несколькими способами. Вы можете сначала зашифровать счетчик, а затем напрямую XOR с открытым текстом/зашифрованным текстом, когда он прибудет. Вы также можете сначала буферизовать открытый текст, а затем, когда у вас есть полный блок, создать счетчик, зашифровать его, а затем выполнить операцию XOR над полным блоком открытого текста. У этого были преимущества в том смысле, что он больше напоминал другие режимы работы, такие как CBC. Кроме того, вам, возможно, не придется буферизировать ключевой поток в памяти все это время.

Тег аутентификации также может обрабатываться по-разному. Здесь есть в основном три варианта. Вы можете просто рассматривать тег аутентификации как отдельный объект по отношению к зашифрованному тексту. Это позволяет вам сохранить онлайн-свойства режима CTR и, на мой взгляд, должно быть предпочтительным вариантом. Вы также можете увидеть его как часть зашифрованного текста, но в этом случае вы потеряете онлайн-свойства во время расшифровки; вам нужно знать, где заканчивается зашифрованный текст, прежде чем вы сможете обработать последнее количество байтов, составляющих тег аутентификации. Таким образом, вам нужно будет буферизовать как минимум размер в байтах тега аутентификации. Наконец, во время расшифровки вы можете захотеть вернуть только байты открытого текста после проверки байтов открытого текста. В этом случае вам нужно будет буферизовать весь зашифрованный текст и вернуть открытый текст за один раз.

Поскольку проблемы с тегом аутентификации связаны только с расшифровкой, вполне вероятно, что Bouncy будет просто буферизоваться из-за того, как реализован CTR. Вам действительно нужно вызвать doFinal, как Роберт уже упоминал в комментариях, чтобы получить последний блок зашифрованного текста, а также тег аутентификации. Возможно, шифрование еще не выполнено, потому что процедура шифрования также остается несколько симметричной процедуре дешифрования.

person Maarten Bodewes    schedule 09.04.2016