Comments 17
С названиями функций и документацией старался как мог
iv = Random.new().read(AES.block_size)
cipher = AES.new(key_MD5, AES.MODE_CFB, iv)
сразу думаешь что все такие штуки замусоривают основной код и их надо вынести во всякие init/get_chiper
или тут
dsize = SHA256.digest_size*2
..
decrypted_message = decrypted_message_with_hesh[:-dsize
происходит авторская или криптографическая магия, которую без погружения не поймёшь, зачем и к чему этот dsize, вероятно надо структуру данных тоже пересмотреть, ну и слово hash написано неправильно.
Выкиньте из кода комментарии, их наличие означает что код плохо написан и попробуйте сделать такой, чтобы комментарии оказались не нужны, чтобы всё читалось по английски:
инициализируем шифровщик
шифруем сообщение
расшифровываем
проверяем эквивалентность
Плюс строки кажутся слишком длинными, это тоже ухудшает читаемость. Если что я просто старый ворчун и зануда.
Решение
Агент сгенерирует пару ключей (открытый и закрытый) на месте, затем отправит открытый ключ повстанческим силам;
В штабе сопротивления создадут новый ключ для СИММЕТРИЧНОГО шифрования;
Симметричный ключ закодируют при помощи открытого ключа, который прислал агент;
Зашифрованный симметричный ключ отправят агенту, который раскодирует его с помощью закрытого ключа.
И чтобы решение было идеальным, повстанцы готовят шифрованные/кодированные сообщения на отдельном рабочем месте неподключенном к сети и таким же способом расшифровывают/декодируют сообщения. Перенос информации от рабочего места, подключенного к сети на автономное рабочее место осуществляется посредством, например, флэшки.
В исправлении нет ни слова об автономном рабочем месте! А если враг получит доступ по сети к точке шифрования или дешифрования (а именно от этого защищает автономное рабочее место), то он получит и доступ к информациии и восстание будет провалено!
Для расшифровки нет необходимости задавать новый рандомынй IV, IV при расшифровке берется из самого криптованного сообщения. Именно для этого IV и добавляется в начало сообщения, а не для того чтобы сообщение было каждый раз разным (оно и будет разным т.к. IV выбирается случайным).
Т.е. можно просто
cipher = AES.new(key_MD5, AES.MODE_CFB, bytes(16))
decrypted_message_with_hesh = cipher.decrypt(encr_message)[bsize:]
Но это верно только в том случае если в не планируете chiper использовать потом для шифрования.
При расшифровке сообщения мы видим, что хеш расшифрованного сообщения совпадает с хешем, который мы добавляли при шифровании. Это значит, что дешифрация прошла корректно.
Нет, нет и еще раз нет. Это значит в первую очередь то что сообщение не было изменено при передаче.
Зануда_моде_OFF
Спасибо за комментарий.
Про IV вектор написано в документации, что при применении алгоритма Cypher FeedBack его необходимо прикреплять к сообщению: "An Initialization Vector (IV) is required." (https://www.dlitz.net/software/pycrypto/api/current/Crypto.Cipher.blockalgo-module.html#MODE_CFB).
За замечания про хеш спасибо, исправлю
Криптография простым языком: разбираем симметричное и асимметричное шифрование на примере сюжета Звездных войн (Updated)