我正在尝试使用AES CBC加密字符串。联机工具(http://aes.online-domain-tools.com/)和bash openssl命令的输出不匹配。任何人都可以帮我解决我做错的事吗?
key = 12345678912345678912345678912345
iv="e90e89a2277f4f3b6a2080d27f734266" #using the one generated by online tool
openssl enc -aes-256-cbc -in input.txt -out output.txt -K $key -iv $iv
编辑 - 有关网站上所选设置的更多信息 -
Input type - plain text
Function - AES
Mode - CBC
Key - (plain) - 12345678912345678912345678912345
Init Vector - e9 0e 89 a2 27 7f 4f 3b 6a 20 80 d2 7f 73 42 66
答案 0 :(得分:2)
两个
openssl aes-128-cbc -d -in odt-IV-e90e89a2277f4f3b6a2080d27f734266.dat -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad
和
openssl enc -aes-128-cbc -d -in odt-IV-e90e89a2277f4f3b6a2080d27f734266.dat -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad
为我的在线计算器生成的文件
输入类型:文字
输入(明文):TESTTESTTESTTEST
功能:AES
模式:CBC
Key(HEX):12345678912345678912345678912345
初始化。矢量:e90e89a2277f4f3b6a2080d27f734266
操作:ENCRYPT
编辑:
我确认在线工具有zero padding,但openssl需要PKCS#5 (also known as PKCS#7)填充:
所有分组密码通常使用PKCS#5填充,也称为 标准块填充:这允许基本的完整性或 密码检查要执行。但是自从随机的机会 通过测试的数据优于256中的1,这不是很好 测试
因此需要以下参数:
-nopad禁用标准块填充
参见例如here
请注意,您的输出纯文本最多有15个额外的二进制零字节(\x00
)
EDIT2:
(对不起,我误解了这个问题,以为你想查看在线工具的结果)
执行与在线工具相同的操作:
echo -n "TESTTESTTESTTEST" | openssl aes-128-cbc -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-1.dat
这个使用echo -n
来提供输入数据。如果您没有处理能够满足此要求的系统,则必须准备一个文件input.txt
,其中包含字符串TESTTESTTESTTEST
(请检查其长度是否为16个字节 - 即没有换行符结束)。然后使用-in input.txt
选项:
openssl aes-128-cbc -in input.txt -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-2.dat
当消息不是块大小对齐时(即它的长度不能被16整除而没有余数),你必须应用zero padding(追加到那么多二进制零,以使其对齐)
所以到encrypt the string "TESTTESTTEST"(它的长度是12,你必须添加4个二进制零来阻止它对齐到16):
echo -ne "TESTTESTTEST\x00\x00\x00\x00" | openssl aes-128-cbc -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-3.dat
(-e
中的echo
可以解释\x00
工作的反斜杠转义符
EDIT3(奖金一):
使用shell执行零填充:
input="TESTTESTTEST"
( echo -n "${input}" ; head -c 15 /dev/zero ) | head -c "$((((${#input}+15)/16)*16))" | openssl aes-128-cbc -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-4.dat