Найти - Пользователи
Полная версия: Python aes шифрование
Начало » Python для экспертов » Python aes шифрование
1
Victoros6666.
Всем обитателям данного форума большой привет.
Словил баг не могу понять в чем причина и куда копать дальше, может кто то, укажет нужное направление?

В общем ситуация такая . Есть клиент который отправляет зашифрованные AES контейнер через system.net.WebClient методом Post.
На веб-сервере (BaseHTTPServer.HTTPServer python2.7) обрабатываю запрос. Данные(байты) из метода post передаю в функцию

Сама функция.
  BLOCK_SIZE = 16
    def aes_decrypt(self, key, data):
        if len(data) > BLOCK_SIZE:
            IV = data[:BLOCK_SIZE]
            cipher = AES.new(key, AES.MODE_CBC, IV)
            return self.unpad(cipher.decrypt(data[BLOCK_SIZE:]))
 
    def unpad(self, s):
        return s[:-(ord(s[-1]))]
и на выходе получаю расшифрованное сообщение в таком виде:
message: TF7��V�?P ����C�eto testovoe soobshenie

Исходное сообщение перед криптованием было таким:
message: privet kak dela eto testovoe soobshenie

Не могу понять что происходить с сообщением . Вес данных при отправки и получении совпадает. На клиенте аеs контейнер весит 64 байта. На веб-сервер столько и приходит.
Само сообщение перед криптованием весит 39 байт. После расшифровки на веб-севере сообщение весит len(message): 31. Получается декрипт куда от отрезает от 7-10 байтов и из-за этого сообщение не расшифровывается нормально.
py.user.next
  
>>> from Crypto.Cipher import AES
>>> from Crypto import Random
>>> 
>>> msg = b'Attack at dawn..'
>>> 
>>> key = b'Sixteen byte key'
>>> 
>>> AES.block_size
16
>>> 
>>> iv = Random.new().read(AES.block_size)
>>> iv
b'\xd3\x07 S1y\x8a\xc1\xbd\x95\xae\xc9\xb8^h:'
>>> 
>>> cipher = AES.new(key, AES.MODE_CBC, iv)
>>> emsg = iv + cipher.encrypt(msg)
>>> emsg
b'\xd3\x07 S1y\x8a\xc1\xbd\x95\xae\xc9\xb8^h:\x83\xa076\xd6\xf0\x84\x825\x85D\xe6\x1b\xcf\xdc\xd9'
>>> 
>>> iv = emsg[:AES.block_size]
>>> iv
b'\xd3\x07 S1y\x8a\xc1\xbd\x95\xae\xc9\xb8^h:'
>>> cipher = AES.new(key, AES.MODE_CBC, iv)
>>> dmsg = cipher.decrypt(emsg[AES.block_size:])
>>> dmsg
b'Attack at dawn..'
>>>


Victoros6666.
и на выходе получаю расшифрованное сообщение в таком виде:
Режим CBC (Cipher block chaining, wiki. картинка) подразумевает, что вектор инициализации используется только для первого блока. Для второго блока вместо вектора инициализации используется предыдущий (первый) зашифрованный блок. Для третьего блока вместо вектора инициализации используется предыдущий (второй) зашифрованный блок.

А у тебя два блока в сообщении, поэтому первый блок надо расшифровать вектором инициализации, а второй блок надо расшифровать зашифрованным первым блоком.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB