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

python generate fixed size (16 bytes) real random string

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

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(可能是由于字节和字符串之间的转换)。 我该如何解决?


您从urandom()返回的长度是您要求的长度:

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。

不要使用sys.getsizeof()来发现数据的长度。 那将返回Python内部数据结构的大小。