Django PyCryptodome Расшифровка AES - ValueError: Padding is incorrect
Я пытаюсь зашифровать входящие файлы и затем расшифровать их. Я следовал документации о том, как использовать AES с режимом CBC для расшифровки и шифрования.
Мой взгляд на загрузку и шифрование файла:
@router.post("/upload_files")
def upload_files(request, file: UploadedFile = File(...)):
save_file = operations.aes_encryption(user_id=request.auth.id,file=request.FILES.get('file'))
def aes_encryption(self,user_id,file):
user = UserQueries.get_user(id=user_id)
key: bytes = bytes(user.key, "utf-8")
path: str = user.path
save_file = self._encrypt_file(file,key,path,user)
return save_file
def _encrypt_file(self,file,key,path,user):
file_content = file.read()
cipher = AES.new(key, AES.MODE_CBC)
ct_bytes = cipher.encrypt(pad(file_content, AES.block_size))
iv = b64encode(cipher.iv).decode('utf-8')
ct = b64encode(ct_bytes).decode('utf-8')
with open(str(settings.BASE_STORAGE_DIR)+"/"+path+file.name,"wb") as f:
f.write(ct.encode('utf-8'))
return save_metadata
Этот код работает так, как и должен, он шифрует файл и сохраняет его в директории. Мой ключ и iv хранятся в базе данных в виде строки.
Вот моя функция расшифровки, с которой у меня возникли проблемы:
def aes_decryption(self,request, file_id):
user = UserQueries.get_user(id=request.auth.id)
file = FileQueries.get_file_data(id=file_id)
iv = b64decode(file.iv)
key = b64decode(user.key)
with open(str(settings.BASE_STORAGE_DIR)+"/"+file.path,"rb") as f:
cipher = f.read()
decrypt_file = self._decrypt_file(iv,key,cipher_text=cipher)
def _decrypt_file(self,iv,key,cipher_text):
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = unpad(cipher.decrypt(cipher_text), AES.block_size)
При вызове расшифровки я получаю следующую ошибку:
Padding is incorrect.
Traceback (most recent call last):
File "/Users/Library/Caches/pypoetry/virtualenvs/cloud-hub-backend-y-HyWMBZ-py3.11/lib/python3.11/site-packages/ninja/operation.py", line 107, in run
result = self.view_func(request, **values)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/Documents/cloud_project/backend/cloud_hub_backend/cloud_hub_backend/apps/file_storage/views.py", line 67, in download_files
file, content_type, file_name = operations.aes_decryption(request,file_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/Documents/cloud_project/backend/cloud_hub_backend/cloud_hub_backend/apps/file_storage/operations.py", line 59, in aes_decryption
decrypt_file = self._decrypt_file(iv,key,cipher_text=cipher)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/Documents/cloud_project/backend/cloud_hub_backend/cloud_hub_backend/apps/file_storage/operations.py", line 66, in _decrypt_file
pt = unpad(cipher.decrypt(cipher_text), AES.block_size)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/Library/Caches/pypoetry/virtualenvs/cloud-hub-backend-y-HyWMBZ-py3.11/lib/python3.11/site-packages/Crypto/Util/Padding.py", line 92, in unpad
raise ValueError("Padding is incorrect.")
ValueError: Padding is incorrect.
Вот как хранится мой ключ и iv в базе данных:
ключ: B5A647A95DECADB7A3B715D7F6602344 iv: enW82aTDyK4ILhfLPLXRrA==
Я пытался решить эту проблему с помощью следующих вопросов, но безуспешно: