Я много искал на SO о полном расшифровке шифрования с моим требованием. На самом деле, у меня много ссылок и примеров, но None работает для меня в режиме AES-192-CBC и AES-256-CBC.Расшифровка шифрования AES-CBC 128, 192 и 256 в Python 3 с использованием дополнения PKCS # 7
У меня есть следующий пример, который должен работать со всеми типами, но он работает только с режимом AES-128-CBC. Я новичок в Python. Может ли кто-нибудь помочь мне, где я ошибаюсь?
Я использую Python 3.4 для окон, и я не могу перейти на Python 2.7.
import base64
from Crypto.Cipher import AES
class AESCipher:
class InvalidBlockSizeError(Exception):
"""Raised for invalid block sizes"""
pass
def __init__(self, key, block_size=16):
if block_size < 2 or block_size > 255:
raise AESCipher.InvalidBlockSizeError('The block size must be between 2 and 255, inclusive')
self.block_size = block_size
self.key = key
self.iv = bytes(key[0:16], 'utf-8')
print(self.key)
print(key[0:16])
def __pad(self, text):
text_length = len(text)
amount_to_pad = self.block_size - (text_length % self.block_size)
if amount_to_pad == 0:
amount_to_pad = self.block_size
self.pad = chr(amount_to_pad)
return text + self.pad * amount_to_pad
def __unpad(self, text):
#pad = ord(text[-1])
#return text[:-pad]
text = text.rstrip(self.pad)
return text
def encrypt(self, raw):
raw = self.__pad(raw)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
return base64.b64encode(cipher.encrypt(raw))
def decrypt(self, enc):
enc = base64.b64decode(enc)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
return self.__unpad(cipher.decrypt(enc).decode("utf-8"))
e = AESCipher('1234567812345678', 16)
#e = AESCipher('123456781234567812345678', 24)
#e = AESCipher('12345678123456781234567812345678', 32)
secret_data = "hi"
enc_str = e.encrypt(secret_data)
print('enc_str: ' + enc_str.decode())
dec_str = e.decrypt(enc_str)
print('dec str: ' + dec_str)
Хотя этот код шифрует данные с 192 и 256-битного шифрования и успешно расшифровать, что тоже, но другой мой .Net и рубин приложение только может расшифровать данные, которые были шифруется с помощью 128 шифрования.
Примечание. Приложение Net и Ruby успешно протестировано друг с другом и с онлайн-инструментом шифрования со всеми типами шифрования.
Обратите внимание, что для моего приложения требуется режим AES-CBC и PKCS # 7 и должен выполняться на Python 3.4.
Я не понимаю этого ответа. Вы изменили 'self.block_size' на' 16', но 'block_size' был инициализирован символом' 16', поэтому ничего не изменилось. Вы что-то изменили? –
обязательно прочитайте вопрос. Я написал, что когда я взял размер блока 24 и 32, он не работал. потому что ранее черный размер был инициализирован тем, что передается в аргументе. См. Функцию __pad и прокомментированный код. –
Вижу. Я не видел ваш прокомментированный код. Тем не менее, 256 в AES-256 всегда означает размер ключа, а не размер блока, потому что, как вы, наверное, уже узнали, AES имеет один фиксированный размер блока 16 байт, и вы можете получить это с помощью AES.block_size' в pyCrypto. Вам не нужно жестко кодировать это. Поскольку вам не нужно передавать размер блока во время инициализации, вы должны включить этот код в свой ответ (ping me, когда вы закончите, чтобы я мог удалить мой downvote). –