ValueError:AES密钥长度必须为16,24或32个字节

时间:2015-12-16 14:59:44

标签: python encryption

此代码片段有效,然后以

开始失败
  

ValueError:AES密钥长度必须为16,24或32字节

这是在Python 3.3.5中。

from Crypto.Cipher import AES

salt = '!%F=-?Pst970'
key32 = [ ' ' if i >= len(self.salt) else self.salt[i] for i in range(32) ]
bkey32 = str(key32).encode('utf-8')

cipher = AES.new(bkey32, AES.MODE_ECB)

AES构造函数失败,标题中列出了ValueError。

bkey32是:

b"['!', '%', 'F', '=', '-', '?', '\\x7f', 'P', 's', 't', '9', '7', '0', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']"

我将其视为32个字节。我做错了什么?

2 个答案:

答案 0 :(得分:3)

您正在创建列表的str表示,您需要join列表内容:

key32 = "".join([ ' ' if i >= len(salt) else salt[i] for i in range(32) ])
bkey32 = key32.encode('utf-8')

str.join创建一个连接的字符串:

In [19]: "".join([ ' ' if i >= len(salt) else salt[i] for i in range(32) ])
Out[19]: '!%F=-?Pst970           

或使用str.format

salt = '!%F=-?Pst970'
key32 = "{: <32}".format(salt).encode("utf-8")
cipher = AES.new(key32, AES.MODE_ECB)

答案 1 :(得分:2)

通过在列表对象上调用str,该字符串成为列表表示形式;包括[],引用字符。

只需使用bytes.ljust获取32个字节:

salt = b'!%F=-?Pst970'
bkey32 = salt.ljust(32)[:32]   # [:32] is unnecessary if you're sure `salt` is less than 32
# bkey32 => b'!%F=-?Pst970                    '