Django Python: Почему расшифровка файла не удается?

Я использую https://github.com/eblocha/django-encrypted-files для шифрования файлов, загружаемых через Django. Он использует AES в режиме CTR для шифрования файлов через обработчик загрузки.

Я пытаюсь вручную протестировать шифрование и расшифровку файлов, загружая файл через форму Django, затем получая файл по FTP и расшифровывая его локально.

Но я обнаружил, что не могу расшифровать файл локально с помощью оболочки python; расшифрованный файл такой же, как и зашифрованный, за исключением того, что зашифрованный файл имеет примерно на 15 символов больше в начале файла.

Я установил криптографию 36.0.1 https://pypi.org/project/cryptography/ локально, и pip обновлен.

Вот что я пытаюсь сделать:

$ python3
>>> AES_KEY = b'\x1......8f\xdd' // same key as in Django
>>> AES_KEY.hex()
'1a3ef8c....7e8fdd'             // output
>>> full = open ("decrypt.txt", 'rb')
>>> save=open("decrypted.txt", "wb")
>>> read = full.read()
>>> save.write(read[16:])
>>> read[:16].hex()
'69djeu....9b'                 // output
>>> exit()

На этом этапе сохраняется файл decrypted.txt, но он такой же, как и зашифрованный файл, за исключением того, что в зашифрованном файле примерно на 15 символов больше в начале файла.

Как расшифровать файл decrypt.txt в decrypted.txt?

Можно ли локально использовать другую библиотеку Python, отличную от криптографии?

В процессе шифрования IV и шифротекст объединяются: IV || ciphertext. При расшифровке используется случайный IV, что неверно. Вместо этого должен применяться IV шифрования. Для этого IV и шифротекст должны быть разделены.
. Кроме того, необходимо вызвать методы update() и finalize(), которые выполняют собственно расшифровку.

Следующий код по сути соответствует вашему коду, дополненному недостающими частями:

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

# Read ciphertext
openfile = open("encrypted.txt", 'rb')
read = openfile.read()
openfile.close()

# Separate IV and ciphertext; decrypt
iv = read[:16]
ciphertext = read[16:]
key = b'\x1a>\xf8\xcd\xe2\x8e_~V\x14\x98\xc2\x1f\xf9\xea\xf8\xd7c\xb3`!d\xd4\xe3+\xf7Q\x83\xb5~\x8f\xdd'
cipher = Cipher(algorithms.AES(key), modes.CTR(iv))
decryptor = cipher.decryptor()
decrypted = decryptor.update(ciphertext) + decryptor.finalize()

# Store decrypted data
savefile = open("decrypted.txt", "wb")
savefile.write(decrypted)
savefile.close()

Этот код успешно расшифровывает шифротекст в связанном файле (используя размещенный ключ).

Вернуться на верх