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()
Этот код успешно расшифровывает шифротекст в связанном файле (используя размещенный ключ).