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==

Я пытался решить эту проблему с помощью следующих вопросов, но безуспешно:

  1. Я делаю это в правильном порядке
  2. Мои ключи совпадают
  3. Не имеет ответа
Вернуться на верх