Я работаю над программой шифрования с Pycryptodome в Python 3.6. Я пытаюсь зашифровать файл, а затем расшифровать его и проверить тег MAC.Когда я проверяю это, выдается ошибка
import os
from Crypto.Cipher import AES
нагрудник, импортированный Cryptodome
aad = b'any thing'
nonce = b'\xde\xe2G\xca\xe8Lq9\xeb\x8b\x84\xe7'
key = b'\xde\xe9\xad\xe9\x14_\x07\x1aq7C\\\xd7\x9c\xae\xfcJ\x1c%\xec\xe6C\xbe\xf0eO\xfaJ1\x08\x0c\xae'
Я устанавливаю одноразовый номер и ключ как константу, только чтобы начать сначала.тогда я буду использовать nonce = get_random_bytes (12) уникальным для каждого файла.
def encrypt(filename):
chunksize = 64 * 1024
outputFile = "(encrypted)" + filename
filesize = str(os.path.getsize(filename))
cipher = AES.new(key, AES.MODE_GCM, nonce)
cipher.update(aad)
with open(filename, 'rb') as infile:
with open(outputFile, 'wb') as outfile:
outfile.write(filesize.encode('utf-8'))
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += ' '.encode('utf-8') * (16 - (len(chunk) % 16))
ciphertext,sender_tag = cipher.encrypt_and_digest(chunk)
print (sender_tag)
outfile.write(ciphertext)
часть дешифрования с использованием decrypt_and_verify, поэтому не нужно беспокоиться о том, что произойдет сначала при расшифровке или проверке
def decrypt(filename,received_tag):
chunksize = 64 * 1024
outputFile = "(clear)"+ filename
cipher = AES.new(key, AES.MODE_GCM, nonce)
cipher.update(aad)
with open(filename, 'rb') as infile:
with open(outputFile, 'wb') as outfile:
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
clearmessage = cipher.decrypt_and_verify(chunk, b'received_tag')
outfile.write(clearmessage)
outfile.truncate()
def Main():
choice = input("Would you like to (E)ncrypt or (D)ecrypt?: ")
if choice == 'E':
filename = input("File to encrypt: ")
#password = input("Password: ")
encrypt(filename)
print ("Done.")
elif choice == 'D':
filename = input("File to decrypt: ")
#password = input("Password: ")
received_tag = input("enter received tag:")
decrypt(filename,received_tag)
print ("Done.")
else:
print ("No Option selected, closing...")
if __name__ == '__main__':
Main()
И это ошибка:
raise ValueError("MAC check failed")
ValueError: MAC check failed
Я не знаю, где я все испортил.кстати, я получаю тег, похожий на b '\ x1c \ xd1 \ xd8 \ x1a6 \ x07 \ xf3G \ x8c_s \ x94 "* (b'
Обновление: я исправил ошибку в коде sender_tag,ciphertext = cipher.encrypt_and_digest (чанк), состоящий из зашифрованного текста, sender_tag = cipher.encrypt_and_digest (чанк), но проблема все еще сохраняется