Проблема при расшифровке файла с помощью AES, данные gives должны быть дополнены до границы 16 байт в режиме CBC

#python #error-handling #cryptography #aes

#питон #обработка ошибок #криптография #aes

Вопрос:

Привет, я программирую базовый проект о совместном использовании секретов Шамира, но у меня возникла проблема при расшифровке файла. Я использую AES для шифрования и дешифрования

Мой код для шифрования:

    def encrypt_text(self, text):
    pad_text = pad(text, AES.block_size)
    iv = Random.new().read(AES.block_size)
    password = self.alphanumric_pass(self.key)
    cipher = AES.new(password, AES.MODE_CBC, iv)
    return iv   cipher.encrypt(pad_text)
    
def encrypt_file(self):
    try:
        
        with open(self.file, 'rb') as f:
            orig_file = f.read()
            
        enc_text = self.encrypt_text(orig_file)
    
    except:
        print("The file: "   str(self.file)   " does not exist")
        sys.exit(1)
    
    return enc_text


def save_encrypted_file(self, out_name):
    with open(self.file   ".aes", 'wb') as f:
        f.write(self.encrypt_file())

def alphanumric_pass(self, key):
    num = str(key)
    return hashlib.sha256(num.encode('utf8')).digest()
 

Мой код для расшифровки:

 def decrypt_text(self, text, key):
    iv = text[:AES.block_size]
    password = self.alphanumric_pass(key)
    cipher = AES.new(password, AES.MODE_CBC, iv)
    decrypted_text = unpad(cipher.decrypt(text[AES.block_size:]), AES.block_size)
    
    return decrypted_text
    
def decipher_file(self):
    try:
        with open(self.file, 'rb') as f:
            encrypted_file = f.read()
    except:
        print("There was an error while reading "   str(self.file))
       
    
    secret = self.get_secret() 
    num = str(secret)
    key = hashlib.sha256(num.encode('utf-8')).digest()
    decrypted_text = self.decrypt_text(encrypted_file, key)        
    return decrypted_text

def get_secret(self):
    return LagrangeInterpolation.reconstruct_secret(self.shares, 0)
    

def save_decrypted_file(self, new_name):
    with open(new_name, 'wb') as f:
        f.write(self.decipher_file())
 

Но когда я пытаюсь расшифровать файл, я получаю эту ошибку:

     File "/home/david/Documentos/Modelado_Y_Programacion/Shamir-Secret-Share-Scheme/s4/Decrypter.py", line 38, in decrypt_text
decrypted_text = unpad(cipher.decrypt(text[AES.block_size:]), AES.block_size)
    File "/home/david/.local/lib/python3.7/site-packages/Crypto/Cipher/_mode_cbc.py", line 246, in decrypt
raise ValueError("Data must be padded to %d byte boundary in CBC mode" % self.block_size)
    ValueError: Data must be padded to 16 byte boundary in CBC mode
 

Кто-нибудь может помочь исправить эту ошибку? Я часами искал, как это исправить, но ничего не могу найти

Комментарии:

1. AES использует размер блока 128 бит (16 байт), ваш зашифрованный текст должен быть кратен 16 байтам.

2. save_encrypted_file() игнорирует out_name параметр и сохраняет зашифрованные данные в файл с именем исходного файла плюс добавленный .aes. save_decrypted_file() однако считывает не этот файл, а исходный файл. Это объясняет ошибку, поскольку открытый текст не дополняется. Поэтому in decipher_file() self.file необходимо заменить на self.file ".aes" . Однако неясен вывод ключа для дешифрования ( LagrangeInterpolation и т.д.).