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