Основная проблема с вашим кодом заключается в том, что вы не указали одноразовый номер для AES.new()
.OCB требует одноразового номера;если вы не предоставите один, случайный одноразовый номер будет создаваться каждый раз, когда вы создаете новый объект AES, и поэтому расшифровка не удастся.
Из документов :
nonce
(строка байтов): неповторяемое значение длиной от 1 до 15 байтов. Если нетВ настоящее время будет создан случайный одноразовый номер рекомендуемой длины (15 байт).
У вас есть два варианта: либо создать одноразовый номер и передать его в AES.new()
(при шифровании и дешифровании), либо использовать случайный одноразовый номер, созданный AES
во время шифрования.
Далее, OCB - это аутентифицированный алгоритм шифрования, но, похоже, вы не проверяете MAC.Это важно, потому что MAC проверяет целостность зашифрованного текста.
Методы шифрования и дешифрования AES
принимают и возвращают байты.Вы можете преобразовать открытый текст (если это текст) в строку с .decode()
.Если вы хотите преобразовать зашифрованный текст в строку, вам придется сначала кодировать его base64, чтобы кодировать необработанные байты в символы ASCII (просто не забудьте декодировать перед расшифровкой).b64encode()
также возвращает байты, но может быть легко преобразован в строку.
Например,
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from base64 import b64encode
key = get_random_bytes(16) # A 16 byte key for AES-128
nonce = get_random_bytes(15)
message = "A really secret message. Not for prying eyes.".encode()
cipher = AES.new(key, AES.MODE_OCB, nonce=nonce)
ciphertext, mac = cipher.encrypt_and_digest(message)
cipher = AES.new(key, AES.MODE_OCB, nonce=nonce)
plaintext = cipher.decrypt_and_verify(ciphertext, mac)
print(b64encode(ciphertext).decode())
#CSwHy3ir3MZ7yvZ4CzHbgYOsKgzhMqjq6wEuutU7vJJTJ0c38ExWkAY1QkLO
print(plaintext.decode())
#A really secret message. Not for prying eyes.
Обратите внимание, что если .decrypt_and_verify()
не удается проверить MAC, исключение ValueError
будетподнят, так что вы можете использовать блок try-Кроме.Значения nonce
и mac
не являются секретными, и их безопасно хранить рядом с зашифрованным текстом.
Наконец, если вы планируете получить ключ из ключевой фразы, вам следует использовать KDF на основе пароля.KDF создают сильные ключи, используют соли и итерации, и они очень устойчивы к атакам с применением силы.Функции KDF вы найдете в Crypto.Protocol.KDF
.