2016-09-23 13 views
1

Я много искал на 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.

ответ

2

Работа выполнена с использованием 16 байтов для любых типов шифрования. Для этого я использовал AES.block_size, который по умолчанию равен AES для AES.

import base64 
from Crypto.Cipher import AES 

class AESCipher: 
    class InvalidBlockSizeError(Exception): 
     """Raised for invalid block sizes""" 
     pass 

    def __init__(self, key): 
     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 = AES.block_size - (text_length % AES.block_size) 
     if amount_to_pad == 0: 
      amount_to_pad = AES.block_size 
     pad = chr(amount_to_pad) 
     return text + pad * amount_to_pad 

    def __unpad(self, text): 
     pad = ord(text[-1]) 
     return text[:-pad] 

    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) 
+0

Я не понимаю этого ответа. Вы изменили 'self.block_size' на' 16', но 'block_size' был инициализирован символом' 16', поэтому ничего не изменилось. Вы что-то изменили? –

+0

обязательно прочитайте вопрос. Я написал, что когда я взял размер блока 24 и 32, он не работал. потому что ранее черный размер был инициализирован тем, что передается в аргументе. См. Функцию __pad и прокомментированный код. –

+0

Вижу. Я не видел ваш прокомментированный код. Тем не менее, 256 в AES-256 всегда означает размер ключа, а не размер блока, потому что, как вы, наверное, уже узнали, AES имеет один фиксированный размер блока 16 байт, и вы можете получить это с помощью AES.block_size' в pyCrypto. Вам не нужно жестко кодировать это. Поскольку вам не нужно передавать размер блока во время инициализации, вы должны включить этот код в свой ответ (ping me, когда вы закончите, чтобы я мог удалить мой downvote). –

 Смежные вопросы

  • Нет связанных вопросов^_^