OpenSSL解密AES 256位(base64)加密密码-错误的最终块长度

时间:2018-09-25 07:43:20

标签: bash encryption openssl aes

我正在尝试使用OpenSSL解密aes-256-cdc编码的密码

#!/usr/bin/env bash

ak=BgL0cPoZQ4wZWOWl5mXBhlMsNbbZL2zvsWZXjuGy4Iw=
iv=cGEvcGWzE8t7CS3wbeoUFQ==
pass=RCQm23YHOCg3nxOl7CcQ7w==

#change format from base64 into hex
AES_KEY=$(echo "${ak}" | openssl base64 -d | xxd -p |tr -d '\n')
AES_IV=$(echo "${iv}" | openssl base64 -d | xxd -p)
ENCODED_PASSWORD=$(echo "${pass}" | openssl base64 -d | xxd -p)

echo "AES_KEY ${AES_KEY}"
echo "AES_IV ${AES_IV}"
echo "ENCODED_PASSWORD ${ENCODED_PASSWORD}"

#set password file
echo "${ENCODED_PASSWORD}" > in.txt

#decode password
openssl enc -nosalt -aes-256-cbc -d -iv ${AES_IV} -K ${AES_KEY} -in in.txt

这会导致错误消息

AES_KEY 0602f470fa19438c1958e5a5e665c186532c35b6d92f6cefb166578ee1b2e08c
AES_IV 70612f7065b313cb7b092df06dea1415
ENCODED_PASSWORD 53b7adff6e85baedfa9dab80109ad67d
▒▒▒▒▒▒`$;▒▒▒▒%▒O▒Q▒▒▒S▒▒<7 7
                            bad decrypt
32624:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518:
0602f470fa19438c1958e5a5e665c186532c35b6d92f6cefb166578ee1b2
e08c

我认为问题是es-key(ak)里面有换行符,我正尝试用

删除它
|tr -d '\n'

密码应解码为

password

3 个答案:

答案 0 :(得分:3)

否,in.txt的编码有问题。它根本不应该是文本,应该是 binary

原则上,如果您使用echo -n抑制密文中的最后一行行尾,也不会出现此错误。但是,解密仍然会失败,因为它期望二进制而不是编码二进制值。

如果要保留文件,可能需要将in.txt的名称更改为in.bin。您还应该能够使用标准输入(openssl)将密文简单地传递到stdin中。在这种情况下,您可能需要先对其进行编码以将其存储在shell变量中,然后进行 decode ,然后再将其传递到openssl进行解密。

对于二进制文件,请使用cat而不是echo

答案 1 :(得分:2)

如果您的 $pass 很长(可能超过 32 个字符),请务必使用 openssl -A 选项,原因在 openssl 手册中有说明。 使用 -A 选项,对于加密,base64 编码的字符串不会被分割成段;对于解密,读取整行以使用 base64 进行解码。

代码示例:

plaintxt='hello world"
pass=$(echo ${plaintxt} | openssl enc -aes-128-cbc  -a -K ${AES_KEY} -iv ${AES_IV} -A )    
echo "decoded password is: "
echo ${pass} | openssl enc -aes-128-cbc -d -a -K ${AES_KEY} -iv ${AES_IV} -A

答案 2 :(得分:1)

这按预期工作:

#!/usr/bin/env bash
#base64 encoded aes key, iv and password
ak=BgL0cPoZQ4wZWOWl5mXBhlMsNbbZL2zvsWZXjuGy4Iw=
iv=cGEvcGWzE8t7CS3wbeoUFQ==
pass=OfOXO+ruKFTCsBwGHynXwA==

#change format from base64 into hex, for openssl to consume, xxd -p -c32 is taking care of wrapping of the new lines
AES_KEY=$(echo ${ak} | openssl base64 -d | xxd -p -c32)
AES_IV=$(echo ${iv} | openssl base64 -d | xxd -p -c32)

echo "AES_KEY ${ak}"
echo "AES_IV ${iv}"
echo "encoded password ${pass}"
echo "decoded password is: "
echo ${pass} | openssl enc -aes-256-cbc -d -a -K ${AES_KEY} -iv ${AES_IV}

说明:

openssl enc -aes-256-cbc -d

使用aes-256-cbc算法解码

-a   

在我们的例子中,这意味着openssl将接受base64编码的密码

-K 

aes键

-iv

aes iv