Python генерирует реальную случайную строку фиксированного размера (16 байт) - PullRequest
0 голосов
/ 05 мая 2018

Я хочу сгенерировать случайную строку длиной 16 байтов для целей шифрования (шифрование AES) в python3. urandom(n), кажется, способ получить реальные случайные символы:

os.urandom (п):

Возвращает строку из 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)

Примечание: я использовал этот ответ для преобразования urandom byte в строку . Выход:

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 (ключ, * 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 (ключ, * args, ** kwargs) ValueError: IV должна иметь длину 16 байт

Как видите, длина не равна 16 (вероятно, из-за преобразования между байтом и строкой). Как я могу это исправить?

1 Ответ

0 голосов
/ 05 мая 2018

То, что вы получите от 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.

...