【发布时间】:2018-05-05 14:46:45
【问题描述】:
我想在 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)
注意:我使用this answer 将urandom byte 转换为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” , 第 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 must be 16 bytes long
如你所见,长度不是 16 (可能是因为字节和字符串之间的转换)。我该如何解决?
【问题讨论】:
-
这不是告诉你对象的长度...
-
-
我应该改用什么?如果我将
rnd_bytes用于需要 16 字节长输入的加密函数,我会收到错误消息:“ValueError: Value must be 16 bytes long” -
那你能给个minimal reproducible example吗?
-
改用
len。
标签: python python-3.x random byte