使用AES解密文件时出现问题,在CBC模式下,数据必须填充到16字节边界

2024-05-18 11:05:06 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在编写一个关于Shamir秘密共享的基本项目,但我在解密文件时遇到了一个问题。 我用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

有人能帮助修复这个错误吗?我花了好几个小时寻找如何修复它,但什么也找不到


Tags: keytextselfnewsizereturndefblock