Encryption 使用bash-openssl使用纯文本密钥进行AES加密
我正在尝试使用AES CBC加密字符串。联机工具()的输出与bash openssl命令不匹配。谁能帮我解决我做错了什么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 模式-
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