Я работал над реализацией 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, или мне решать, действительно ли одноразовый номер уникален?