使用bash openssl使用纯文本密钥进行AES加密

时间:2015-11-01 10:19:20

标签: encryption openssl cryptography aes

我正在尝试使用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

1 个答案:

答案 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

使用the following settings

为我的在线计算器生成的文件
  • 输入类型:文字

  • 输入(明文):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