我想在python3中为加密目的(AES加密)生成一个16字节长的随机字符串。 urandom(n)
似乎是获取真实随机字符的方法:
os.urandom(N):
返回一串适合的随机字节 加密使用。
由于我需要一个16字节的随机字符串,我认为这可以帮我完成工作:编辑我现在包含了一个更复杂的例子,展示了我遇到的问题。
from os import urandom
from Crypto.Cipher import AES
from base64 import b64encode
import sys
rnd=urandom(16)
rnd_bytes=b64encode(rnd).decode('utf-8')
print(sys.getsizeof(rnd_bytes))
print(len(rnd_bytes))
print(type(rnd_bytes))
AESencrypter=AES.new('my key',AES.MODE_CBC,rnd_bytes)
注意:我使用this answer将urandom 字节转换为字符串。输出是:
73
24
文件 " /User/test.py" ;,第14行,in AESencrypter = AES.new('我的kes',AES.MODE_CBC,rnd_bytes)文件" /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/加密/密码/ AES.py&#34 ;, 第95行,新的 返回AESCipher(key,* args,** kwargs)文件" /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/AES.py" , 第59行,在 init 中 blockalgo.BlockAlgo。 init (self,_AES,key,* args,** kwargs)文件 " /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/blockalgo.py" ;, 第141行,在 init 中 self._cipher = factory.new(key,* args,** kwargs)ValueError:IV必须是16个字节长
如您所见,长度不是16(可能是因为字节和字符串之间的转换)。我该如何解决这个问题?
答案 0 :(得分:3)
你从urandom()
得到的是你要求的长度:
>>> rnd = os.urandom(16)
>>> rnd
b'\xf0\xe9ZG3\xf0(\xd2\xc3\x04/\xf1\xae\x0b-\xb4'
>>> len(rnd)
16
所以按原样使用。
如果你用base-64编码它就不再是16字节了。这是因为base-64(1)将每组3个字节编码为4个字节(因此它们都是可打印字符)和(2)将数据填充到3个字节的倍数,这两个字节都会使它更长。这解释了您报告的24的长度。
请勿使用sys.getsizeof()
来发现数据的长度。这将返回Python内部数据结构的大小。