Размер обычного текста AES 128 CTR не кратен размеру блока

Я прочитал, что режим AES 128 CTR должен работать с блоками по 16 байт ( 128 бит), как в режиме CBC.

действительно, если я попытаюсь с помощью openssl закодировать 18-байтовый открытый текст с помощью:

max@jarvis:~$ printf 0123456789abcdefgh | openssl enc -e -nopad -nosalt -aes-128-cbc -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 | hd
bad decrypt
140670739715200:error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length:../crypto/evp/evp_enc.c:425:
00000000  14 f5 fe 74 69 66 f2 92  65 1c 22 88 bb ff 46 09  |...tif..e."...F.|
00000010
max@jarvis:~$ printf 0123456789abcdefgh | openssl enc -e  -nosalt -aes-128-cbc -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 | hd
00000000  14 f5 fe 74 69 66 f2 92  65 1c 22 88 bb ff 46 09  |...tif..e."...F.|
00000010  c2 ae b2 99 18 cd 6e ee  55 92 77 d9 e8 f3 1f bf  |......n.U.w.....|
00000020

шифротекст составляет 16 или 32 байта, в зависимости от наличия параметра -nopad.

но если я попробую CTR:

max@jarvis:~$ printf 0123456789abcdefgh | openssl enc -e -nopad -nosalt -aes-128-ctr -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 | hd
00000000  56 d8 79 e7 db bf 1a 0c  b0 75 9b 3b a9 50 4e 48  |V.y......u.;.PNH|
00000010  3f 8a                                             |?.|
00000012
max@jarvis:~$ printf 0123456789abcdefgh | openssl enc -e  -nosalt -aes-128-ctr -K 00000000000000000000000000000000 -iv 00000000000000000000000000000000 | hd
00000000  56 d8 79 e7 db bf 1a 0c  b0 75 9b 3b a9 50 4e 48  |V.y......u.;.PNH|
00000010  3f 8a                                             |?.|
00000012

зашифрованный текст составляет 18 байтов, как и открытый текст, в каждом случае.

я не могу понять почему


person mastupristi    schedule 16.07.2019    source источник


Ответы (2)


В режиме CTR блочный шифр (например, AES) ведет себя как потоковый шифр. Полученные результаты ожидаемы — размер входных данных будет равен размеру выходных данных.

CBC работает блок за блоком, что требует схемы заполнения. CTR передает блоки значения счетчика в AES, по-прежнему учитывая размер блока, но затем берет выходной блок и выполняет операцию XOR с открытым текстом.

В приведенном выше случае два полных 128-битных блока будут переданы через AES для создания потока ключей, но только 128 + 16 бит (18 байтов) этого потока ключей используются и подвергаются операции XOR с вашим открытым текстом, создавая зашифрованный текст равного длина.

person Luke Joshua Park    schedule 16.07.2019

AES 128 CTR очень НЕ похож на AES 128 CBC, и страница википедии, на которую вы ссылаетесь, очень ясно показывает это. Обратите внимание, как открытый текст вводится в блок шифрования в режиме CBC, но никогда не проходит через блок шифрования в режиме CTR.

Шифрование CTR выполняется путем взятия одноразового номера, счетчика блоков (CTR!) и ключа и их шифрования для создания блока псевдослучайных данных, который очень трудно угадать, который называется потоком ключей. Поток ключей подвергается операции XOR с открытым текстом для получения зашифрованного текста. XOR выполняется побайтно, поэтому вы можете обрезать ключевой поток, чтобы он соответствовал длине открытого текста. Обратите внимание, что открытый текст никогда не подвергается шифрованию блочным шифром AES. Блочный шифр используется как односторонняя функция для генерации псевдослучайного ключевого потока. CTR можно использовать с различными источниками потока ключей, а не только с блоком шифрования AES.

CBC запускается для первого блока путем операции xor-ed открытого текста со случайным вектором инициализации (IV), а затем фактической передачи его через шифрование блочного шифра AES. Зашифрованный текст из предыдущего блока используется как новый IV для последующего блока, т. е. IV никогда не используется повторно.

person Kuba hasn't forgotten Monica    schedule 17.07.2019