encryption - 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
参数的存在。
但如果我尝试点击率:
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 个字节,就像明文一样。
我不知道为什么
解决方案
CTR 模式使分组密码(如 AES)表现为流密码。您得到的结果是预期的 - 输入数据的大小将等于输出数据的大小。
CBC 逐块操作,这是强制填充方案的原因。CTR 将计数器值的块传递给 AES,仍然遵守块大小,但随后获取输出块并将其与明文异或。
在上述情况下,将通过 AES 传递两个完整的 128 位块以生成密钥流,但仅使用该密钥流的 128 + 16 位(18 字节)并与您的明文进行异或运算,生成相等的密文长度。
推荐阅读
- java - InfluxDB 的请求 选择时间 > 时间戳
- python - Bash 脚本手动执行 Python,但不是从 cron
- ruby - 无法解析加密文本的 JSON
- qt - QHBoxLayout 的宽度不正确
- airflow - 气流:用户界面中未显示日志
- winforms - 如何使用 ReactiveUI 和 winforms 绑定到用户控件
- excel - 为什么用“<=”运算符比较日期时excel不能正常工作?
- hibernate - Spring Data 和 Hibernate 中的不受控制的删除
- javascript - javascript字符串中每两个单词换行
- python - 在 csv 文件中添加填充以使数据框对 pandas 可读