Я хочу сгенерировать случайную строку длиной 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 (вероятно, из-за преобразования между байтом и строкой). Как я могу это исправить?