【问题标题】:python generate fixed size (16 bytes) real random stringpython生成固定大小(16字节)的真实随机字符串
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-05
    • 2019-02-07
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多