AES128-CBC“坏幻数”和“错误读取输入文件”

时间:2016-10-22 03:41:45

标签: bash encryption openssl cryptography aes

我正在尝试使用以下消息解密文件(part444.txt):

y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik=

这是在CBC模式下128位AES下的base64编码加密文本。它没有填充。 IV是加密文本的前16个字节,密钥是h4ckth1sk3yp4d16

我知道人们从Base64的问题中收到了错误的幻数错误,但现在我得到了“错误读取输入文件”,并且不确定从何处开始。

我试过了:

openssl enc -base64 -d part444.txt | openssl aes-128-cbc -d -k h4ckth1sk3yp4d16

为什么我遇到错误“bad magic number”“错误读取输入文件”

1 个答案:

答案 0 :(得分:7)

这对openssl来说有点痛苦,因为openssl的加密会假设填充并从输入的密码中导出一个盐渍密钥,你必须故意关闭。

在python中使用PyCrypto更容易做,这些假设没有做到。

>>> import base64
>>> data = base64.b64decode('y2EdLtmNQsZkvwwf8jf3fM6c1thfzF0sQfblayGIBik=')
>>> from Crypto.Cipher import AES
>>> aes_crypter = AES.new('h4ckth1sk3yp4d16',  AES.MODE_CBC, data[:16])
>>> aes_crypter.decrypt(data[16:]) # this gives the encrypted secret.

可以使用openssl执行此操作,但您必须读取base64编码数据 - 取出前16个字节并将其记为$IV(将其编码回openssl期望的十六进制) ,开始读取前16后的所有字节,并将其记为$CIPHERTEXT(并说在base64中重新编码)。类似于$KEY,您必须将其从ASCII转换为十六进制的字节。假设您将这些存储在变量中,那么以下内容将起作用:

IV=`base64 -d part444.txt | xxd -p -l 16`
CIPHERTEXT=`base64 -d part444.txt | cut -b 17- | base64`
KEY=`echo -n h4ckth1sk3yp4d16 |xxd -p`

echo $CIPHERTEXT | openssl aes-128-cbc -d -a  -nopad -K $KEY -iv $IV && echo ""

注意base64 -d将base64解码为二进制(使用GNU coreutils中的base64;在BSD上替换为base64 -D),base64 b64对二进制数据进行编码,cut -b 17-从第17次读取数据字节到文件末尾,xxd -p将二进制转换为十六进制。