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

时间:2018-05-05 14:46:46

标签: python python-3.x random byte

我想在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(可能是因为字节和字符串之间的转换)。我该如何解决这个问题?

1 个答案:

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