使用 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