python生成固定大小(16字节)的实随机字符串

python生成固定大小(16字节)的实随机字符串,python,python-3.x,random,byte,Python,Python 3.x,Random,Byte,我想在python3中生成一个16字节长的随机字符串用于加密(AES加密)uradom(n)似乎是获取真正随机字符的方法: os.Uradom(n): 返回一个由n个随机字节组成的字符串,该字符串适用于 加密使用 由于我需要一个16字节的随机字符串,我想这可以帮我完成这项工作:EDIT我现在提供了一个更复杂的示例,演示了我遇到的问题 from os import urandom from Crypto.Cipher import AES from base64 import b64encode

我想在python3中生成一个16字节长的随机字符串用于加密(AES加密)
uradom(n)
似乎是获取真正随机字符的方法:

os.Uradom(n):

返回一个由n个随机字节组成的字符串,该字符串适用于 加密使用

由于我需要一个16字节的随机字符串,我想这可以帮我完成这项工作:EDIT我现在提供了一个更复杂的示例,演示了我遇到的问题

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)
注意:我用于将urandom字节转换为字符串。输出为:

七十三

二十四

文件 “/User/test.py”,第14行,在 AESCEncrypter=AES.new('my kes',AES.MODE_CBC,rnd_字节)文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/Crypto/Cipher/AES.py”, 第95行,纽约 返回AESCiper(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.\u cipher=factory.new(key,*args,**kwargs)值错误:IV必须为16字节长


如您所见,长度不是16(可能是因为字节和字符串之间的转换)。我如何解决这个问题?

您从
uradom()
得到的是您要求的长度:

>>> 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内部数据结构的大小。

这并没有告诉您对象的长度…
getsizeof
没有给出对象所持有的值的确切大小。它返回整个对象的大小,包括所有属性、名称空间等。我应该使用什么来代替?如果我使用
rnd_bytes
作为需要16字节长输入的加密函数,我会收到一个错误:“ValueError:Value必须是16字节长”,那么您能给出一个答案吗?请改用
len