python generate fixed size (16 bytes) real random string
我想在python3中生成一个16字节长的随机字符串用于加密(AES加密)。
os.urandom(n):
Return a string of n random bytes suitable for
cryptographic use.
因为我需要一个16个字节的随机字符串,所以我认为这将为我完成工作:编辑我现在包括一个更复杂的示例,演示了我遇到的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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字节转换为字符串。 输出为:
73
24
File
"/User/test.py", line 14, in
AESencrypter=AES.new('my kes',AES.MODE_CBC,rnd_bytes) File"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/AES.py",
line 95, in new
return AESCipher(key, *args, **kwargs) File"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/AES.py",
line 59, in init
blockalgo.BlockAlgo.init(self, _AES, key, *args, **kwargs) File
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/Crypto/Cipher/blockalgo.py",
line 141, in init
self._cipher = factory.new(key, *args, **kwargs) ValueError: IV must be 16 bytes long
如您所见,该长度不是16(可能是由于字节和字符串之间的转换)。 我该如何解决?
您从
1 2 3 4 5 | >>> 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。
不要使用