Pull to refresh

Comments 6

Скажите, пожалуйста, какую задачу вы пытались решить и зачем?
Мелочь: вы подписываете .hexdigest(), а стоило бы просто .digest() — hexdigest это в два раза больше информации не несущей полезной нагрузки. Кроме того размер подписи станет кратным 16-байтам.

Серьёзное: вы делаете подпись чистым RSA. Шнайер в своих книгах неоднократно подчёркивает что ни в коем случае никогда простой RSA нельзя использовать. Обязательно использование padding. PyCrypto предоставляет PKCS1_PSS и PKCS1_v1.5 RSA padding функции которые и надо использовать. И вам не понадобится думать о кратности какому-то размеру (кода станет меньше).

Если использовать CFB режим (в PyCrypto он есть) симметричного шифрования, то plaintext может быть в итоге любой длины, не требовать дополнения (опять же код станет проще).

Длины сообщений вы записываете в виде ASCII десятичных символов. Ведь в Python есть удобный ord(), chr() подходящих для небольших сообщений чтобы сохранить в виде одного байта длину. Код станет проще. Либо использовать struct.pack/unpack для хранения чисел большой длины.

Почему бы не зашифровать и подпись и plaintext один раз симметричным ключом сразу и только этот симметричный ключ зашифровать публичным? Здесь вы делаете дорогие асимметричные операции с публичным ключом и для шифрования подписи и для сессионного ключа. Подпись без дешифрованных данных бесполезна. AES(Key, plaintext + RSASignature) + RSAPubEnc(Public, Key), вместо AES(plaintext) + RSAPubEnc(Public, RSASignature) + RSAPubEnc(Public, KEy).

Вообще криптостойкость не повышается с использованием хэш-функций вместо полных документов. В хэш-функциях возможны коллизии и из-за «парадокса дней рождения» вероятность очень высока: 128/2 = 2**64 если бы MD5 был коллизий-устойчивым. Но из-за ресурсоёмкости и невозможности подписать длинные сообщения — без хэша никуда. Но именно из-за коллизий сейчас вовсю стремятся использовать 512-1024 бит хэш знаения.
Кстати, раз сессионный ключ у вас при отправке каждого сообщения разный, то получается что ключ используется только для одного сообщения. Вполне безопасно в данном случае будет иметь нулевой вектор инициализации (одни нулевые байты) и не добавлять IV в отправляемые сообщения, что уменьшит их размеры и никак не повлияет на безопасность.
Мне не очень понятно, какой смысл сейчас использовать md5 hash? В нем брутфорсом можно сейчас коллизию найти. Его имеет смысл использовать только если у вас legacy система, которая ничего более современного не умеет.
Sign up to leave a comment.

Articles