使用 bash openssl 使用纯文本密钥进行 AES 加密
AES encryption with plain text key using bash openssl
我正在尝试使用 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
两者都
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
为我使用在线计算器生成的文件工作 the following settings:
输入类型:文本
输入(明文):TESTTESTTESTTEST
函数:AES
模式:CBC
密钥(十六进制):12345678912345678912345678912345
初始化。矢量:e90e89a2277f4f3b6a2080d27f734266
操作:加密
编辑:
我确认在线工具确实 zero padding, but openssl expects PKCS#5 (also known as PKCS#7) 填充:
All the block ciphers normally use PKCS#5 padding also known as
standard block padding: this allows a rudimentary integrity or
password check to be performed. However since the chance of random
data passing the test is better than 1 in 256 it isn't a very good
test.
因此需要以下参数:
-nopad disable standard block padding
参见例如here.
请注意,您的输出明文将有多达 15 个额外的二进制零字节 (\x00
)
编辑 2:
(不好意思我误解了问题,以为你想查看在线工具的结果)
要执行与在线工具相同的操作:
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
(echo
中的 -e
启用反斜杠转义的解释以使 \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
我正在尝试使用 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
两者都
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
为我使用在线计算器生成的文件工作 the following settings:
输入类型:文本
输入(明文):TESTTESTTESTTEST
函数:AES
模式:CBC
密钥(十六进制):12345678912345678912345678912345
初始化。矢量:e90e89a2277f4f3b6a2080d27f734266
操作:加密
编辑:
我确认在线工具确实 zero padding, but openssl expects PKCS#5 (also known as PKCS#7) 填充:
All the block ciphers normally use PKCS#5 padding also known as standard block padding: this allows a rudimentary integrity or password check to be performed. However since the chance of random data passing the test is better than 1 in 256 it isn't a very good test.
因此需要以下参数:
-nopad disable standard block padding
参见例如here.
请注意,您的输出明文将有多达 15 个额外的二进制零字节 (\x00
)
编辑 2:
(不好意思我误解了问题,以为你想查看在线工具的结果)
要执行与在线工具相同的操作:
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
(echo
中的 -e
启用反斜杠转义的解释以使 \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