0

读到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参数的存在。

但如果我尝试点击率:

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 个字节,就像明文一样。

我不知道为什么

4

2 回答 2

4

CTR 模式使分组密码(如 AES)表现为流密码。您得到的结果是预期的 - 输入数据的大小将等于输出数据的大小。

CBC 逐块操作,这是强制填充方案的原因。CTR 将计数器值的块传递给 AES,仍然遵守块大小,但随后获取输出块并将其与明文异或。

在上述情况下,将通过 AES 传递两个完整的 128 位块以生成密钥流,但仅使用该密钥流的 128 + 16 位(18 字节)并与您的明文进行异或运算,生成相等的密文长度。

于 2019-07-16T20:40:55.707 回答
0

AES 128 CTR 与 AES 128 CBC 非常不同,您链接到的维基百科页面非常清楚。请注意明文如何在 CBC 模式下注入加密块,但在 CTR 模式下从不通过加密块。

CTR 加密是通过获取一个随机数、一个块计数器 (CTR!) 和密钥来完成的,并对它们进行加密以制作一个非常难以猜测的伪随机数据块,称为密钥流。密钥流与明文进行异或运算,以获得密文。XOR 是按字节完成的,因此您可以截断密钥流以匹配明文的长度。请注意,明文永远不会受到 AES 分组密码加密。分组密码用作生成伪随机密钥流的单向函数。CTR 可以与各种密钥流源一起使用,而不仅仅是 AES 加密块。

对于第一个块,CBC 是通过将明文与随机初始化向量 (IV) 进行异或运算来启动的,然后实际上将其传递给 AES 块密码加密。来自前一个块的密文被用作后续块的新IV,即永远不会重用IV。

于 2019-07-17T19:04:13.980 回答