Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 2, 2017 22:44:58

Victoros6666.
Зарегистрирован: 2017-02-02
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Python aes шифрование

Всем обитателям данного форума большой привет.
Словил баг не могу понять в чем причина и куда копать дальше, может кто то, укажет нужное направление?

В общем ситуация такая . Есть клиент который отправляет зашифрованные 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 байтов и из-за этого сообщение не расшифровывается нормально.

Офлайн

#2 Фев. 3, 2017 03:04:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  843  -
Профиль   Отправить e-mail  

Python aes шифрование

  
>>> 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. картинка) подразумевает, что вектор инициализации используется только для первого блока. Для второго блока вместо вектора инициализации используется предыдущий (первый) зашифрованный блок. Для третьего блока вместо вектора инициализации используется предыдущий (второй) зашифрованный блок.

А у тебя два блока в сообщении, поэтому первый блок надо расшифровать вектором инициализации, а второй блок надо расшифровать зашифрованным первым блоком.



Отредактировано py.user.next (Фев. 3, 2017 03:17:42)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version