#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()
однако считывает не этот файл, а исходный файл. Это объясняет ошибку, поскольку открытый текст не дополняется. Поэтому indecipher_file()
self.file
необходимо заменить наself.file ".aes"
. Однако неясен вывод ключа для дешифрования (LagrangeInterpolation
и т.д.).