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

Encryption 使用bash-openssl使用纯文本密钥进行AES加密,encryption,openssl,cryptography,aes,Encryption,Openssl,Cryptography,Aes,我正在尝试使用AES CBC加密字符串。联机工具()的输出与bash openssl命令不匹配。谁能帮我解决我做错了什么 key=12345678912345678912345678912345 iv=“e90e89a2277f4f3b6a2080d27f734266”#使用在线工具生成的工具 openssl enc-aes-256-cbc-in input.txt-out output.txt-K$key-iv$iv 编辑-有关网站上所选设置的详细信息- 输入类型-纯文本 函数-AES 模式-

我正在尝试使用AES CBC加密字符串。联机工具()的输出与bash openssl命令不匹配。谁能帮我解决我做错了什么

key=12345678912345678912345678912345
iv=“e90e89a2277f4f3b6a2080d27f734266”#使用在线工具生成的工具
openssl enc-aes-256-cbc-in input.txt-out output.txt-K$key-iv$iv

编辑-有关网站上所选设置的详细信息-

输入类型-纯文本
函数-AES
模式-CBC
键-(普通)-12345678912345678912345678912345
初始向量-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

使用以下工具为在线计算器生成的文件“为我工作”:

  • 输入类型:文本

  • 输入(纯文本):testtest

  • 功能:AES

  • 模式:CBC

  • 键(十六进制):12345678912345678912345678912345

  • 初始化。向量:e90e89a2277f4f3b6a2080d27f734266

  • 操作:加密


编辑:

我确认在线工具确实如此,但openssl希望:

所有分组密码通常使用PKCS#5填充,也称为 标准块填充:这允许基本的完整性或 要执行的密码检查。但是由于随机的机会 通过测试的数据比256分之一好这不是一个很好的选择 测试

因此,需要以下论点:

-nopad禁用标准块填充

见例


请注意,您的输出明文最多会有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
,其中包含字符串
testtest
(请检查其长度是否为16字节,即末尾没有换行符)。然后使用input.txt中的
-in
选项:

openssl aes-128-cbc -in input.txt -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-2.dat

当消息未按块大小对齐时(即其长度不能被16整除,没有余数),您必须应用(在末尾附加许多二进制零,以使其按块对齐)

因此,要(其长度为12,必须添加4个二进制零才能将其块对齐到16):

(回声中的
-e
可以解释反斜杠转义,使
\x00
起作用)


编辑3(奖金一):

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

你为什么想让它匹配?无论如何,如果您对OpenSSL命令行工具有问题,那么您需要在上问这个问题。我一直在使用在线工具开发POC,现在当我想对所有内容进行编码时,输出不匹配。这就是为什么。我还尝试了ruby/python中的OpenSSL gems/库,它们也给出了不同的结果。所以我很确定我犯了一个根本性的错误。是的,密钥应该是十六进制编码的。目前,您的密钥长度为32个字符,由数字1到9组成,因此可以将其解释为十六进制,但这将导致生成一个128位密钥,它将是AES-128而不是AES-256。您是否建议使用-AES-128-cbc?我试过了,但输出仍然不匹配。不,我建议您对密钥进行十六进制编码,如果您想要AES-256。此外,您还没有提供有关您在站点上选择了哪些设置的任何信息,因此这只是猜测。一个问题-当我们想要加密时,您为什么要执行-d?我的要求是通过您的具体示例获得输出b5 e227 717dab8a9f03c4e8a5f6e20296。我的钥匙是明文的。@Umang抱歉,误解了你的意思…请查看更新的answer@Umang关于明文中的键——您必须将其转换为十六进制,例如,
echo-n“12345678123456781234567891345”| xxd-ps-c32
并使用
aes-256-cbc
而不是
aes-128-cbc
只需注意:在线工具也会对键执行零填充,即产生相同的结果。谢谢!没有比这更好的解释了。真的很感激!:)
echo -ne "TESTTESTTEST\x00\x00\x00\x00" | openssl aes-128-cbc -e -K "12345678912345678912345678912345" -iv "e90e89a2277f4f3b6a2080d27f734266" -nopad > odt-IV-e90e89a2277f4f3b6a2080d27f734266-3.dat
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