PyCryptodome проверяет сам nonce, или это до программиста? - PullRequest
0 голосов
/ 21 апреля 2020

Я работал над реализацией PyCryptodome и заметил, что он, похоже, не противостоит атакам воспроизведения - даже при том, что я включаю случайно генерируемый одноразовый номер в каждое сообщение.

Вот соответствующий код расшифровки:

def decrypt_message(data):
    key = get_key()
    nonce, tag, ciphertext = [i for i in (data[:16],data[16:32],data[32:])]
    cipher = AES.new(key, AES.MODE_EAX, nonce)
    message = cipher.decrypt_and_verify(ciphertext, tag)
    return(message)

И вот шифрование, которое я использую:

data = 'This message is encrypted!'.encode()
cipher = AES.new(key, AES.MODE_EAX, mac_len=16)
ciphertext, tag = cipher.encrypt_and_digest(data)
message = cipher.nonce + tag + ciphertext
sock.sendall(message)

Когда я выполняю этот код, он работает нормально, но если я изменяю код отправки с message = cipher.nonce + tag + ciphertext до message = <previous message> ... все равно работает нормально. Получатель с удовольствием расшифрует одно и то же сообщение снова и снова, даже если одноразовый номер точно такой же. Правильно ли я реализую некоторые функции PyCryptodome, или мне решать, действительно ли одноразовый номер уникален?

...