Comments 17
От mcrypt давно уже пора отказаться в пользу openssl, к тому же в версии PHP 7.1 он объявлен, как deprecated.
Почему вы выбрали шифр MCRYPT_RIJNDAEL_256? Если вы хотели использовать AES-256, то ошиблись.
AES-256 — это MCRYPT_RIJNDAEL_128 с 256-битным ключём.
Я правильно понимаю, что SIGNATURE_KEY попадает заранее на обе машины, притом по некоему безопасному каналу? А почему бы тогда не использовать его как постоянный ключ для симметричного шифра?
Так сделать его достаточно длинным, чтобы сделать подбор экономически нецелесообразным?
Да, и, если не ошибаюсь, проще подобрать два ключа по 60 бит, чем один по 120.
Алгоритм, безусловно, хороший, но есть два замечания-предложения:
1) Способ с дополнительной проверкой отправителя сделан правильно, но для полной защиты от ФБР от вмешательства (MITM) было бы правильно включить в сообщение хэш от всего. Не знаю как правльно, но я делал бы от SIGNATURE_KEY + симметричный ключ. Поправьте если что.
2) Это уже больше не замечание, но если пишешь на PHP то это вроде как сервер. И тогда правильнее писать вторую сторону не на этом же PHP, а JS. В итоге получается клиент-серверная инфраструктура с шифрованием.
толкен
От слова talken что ли?
Ваша криптография — ерунда. Видно, что вы не читали ни одной книги по теме, потому что в любой нормальной на первой странице жирным написано: "Не придумывайте свою криптографию, если вы не специалист". Толковые статьи начинаются со слов: "Существует открытая проблема в области криптографии. Ниже я предлагаю своё решение". Вы же пытаетесь реализовать решение уже давно решённой задачи, то есть новызны никакой нет. Хорошо, что вы попытались сами разобраться, но, к сожалению, вам этого не удалось. Можно было бы написать побробно об уязвимостях вашего алгоритма, но размер такой статьи превысил бы размер вашей. Рекомендую продолжить обучения с чтения классических трудов и прохождения онлайн-курсов.
Симметричное и асимметричное шифрование. Разбор алгоритма передачи шифрованных данных между серверами