2015-11-01 185 views
0

我想使用AES CBC加密字符串。在线工具的输出(http://aes.online-domain-tools.com/)和bash openssl命令不匹配。任何人都可以帮我解决我做错了什么?使用纯文本密钥使用bash openssl进行AES加密

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

+0

为什么你想要它匹配?无论如何,如果您对OpenSSL命令行工具有问题,那么您需要在[su]上提出问题。 –

+0

我一直在使用在线工具进行POC工作,现在当我想要编写所有东西时,输出不匹配。这就是为什么。我在ruby/python中也尝试了OpenSSL gems/libraries,他们也给出了不同的结果。所以我很确定我有一个根本的错误。 – Umang

+1

是的,密钥应该是十六进制编码的。目前,您的密钥长度为32个字符,由数字1至9组成,因此它*可以被解释为十六进制,但是这会导致一个128位的密钥,这将是AES-128而不是AES-256。 –

回答

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

  • Init。矢量:e90e89a2277f4f3b6a2080d27f734266

  • 操作:加密


编辑:

我证实,在线工具确实zero padding,但OpenSSL的预计PKCS#5 (also known as PKCS#7)填充:

所有分组密码通常使用PKCS#5填充也是已知的作为 标准块填充:这允许执行基本完整性或 密码检查。然而,由于随机的数据通过测试的机会要好于256中的1,所以它不是一个很好的 测试。

因此,需要以下参数:

-nopad禁用标准块填充

参见例如here


当心,你的输出明文将有多达15个额外的二进制的0字节(\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 

(在echo-e使得反斜线的解释转义为\x00工作)


EDIT3(奖金一个):

为了执行使用壳零填充:

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 
+0

有一个问题 - 当我们想要加密时,为什么你要做-d,我的要求是将您的具体示例输出为b5 \t e227 \t 717dab8a9f03c4e8a5f6e20296。我拥有的密钥是明文。 – Umang

+0

@Umang对不起,误解了你...请参阅更新后的答案 – vlp

+1

@Umang关于明文密钥 - 您必须将其转换为十六进制例如'echo -n“12345678912345678912345678912345”| xxd -ps -c32'并使用'aes-256-cbc'而不是'aes-128-cbc' – vlp

相关问题