bla*_*ack -1 python random byte python-3.x
我想在python3中生成一个16字节长的随机字符串用于加密目的(AES加密)。urandom(n)似乎是获得真正随机字符的方法:
os.urandom(n):
返回适合加密使用的 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)
Run Code Online (Sandbox Code Playgroud)
注意:我使用此答案将 urandom字节转换为string。输出是:
73
24
文件“/User/test.py”,第 14 行,在 AESencrypter=AES.new('my kes',AES.MODE_CBC,rnd_bytes) 文件“/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”,第 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 must be 16 bytes long
如您所见,长度不是 16(可能是因为字节和字符串之间的转换)。我该如何解决?
你得到的urandom()是你要求的长度:
>>> rnd = os.urandom(16)
>>> rnd
b'\xf0\xe9ZG3\xf0(\xd2\xc3\x04/\xf1\xae\x0b-\xb4'
>>> len(rnd)
16
Run Code Online (Sandbox Code Playgroud)
所以按原样使用它。
如果您以 base-64 对其进行编码,它将不再是 16 个字节。那是因为 base-64 (1) 将每组 3 个字节编码为 4 个字节(以便它们都是可打印的字符)并且 (2) 将您的数据填充为 3 个字节的倍数,这两者都使其更长。这解释了您报告的 24 的长度。
不要sys.getsizeof()用于发现数据的长度。这将返回 Python 内部数据结构的大小。
| 归档时间: |
|
| 查看次数: |
7010 次 |
| 最近记录: |