Если оба собеседника имеют серые IP (т.е. находятся за NAT и не имеют возможности соединения напрямую), то как ваш скрипт автоматизирует процесс обмена ключами?
1. Вы передаете публичные ключи открытым текстом? То есть теоретически кто-то может реализовать классическую MITM?
2. Насколько я помню RSA не очень хорошо работает на тексте. Ему лучше передавать случайный набор байт (в общем случае хеш). То есть опять же теоретически ваша реализация шифрования RSA не такая уж криптостойкая.
Спасибо за ваш интерес. Да, увы, этот метод сейчас уязвим для типичной MITM. Да и разрядность довольно маленькая сейчас захардкоденная. В общем, работать есть над чем :)
Рекомендованный способ — сгенерить ключ K, зашифровать его открытым ключом PK (RSA), параллельно посчитать его (K, не PK) хэш H(K) (SHA-256), полученный H(K) использовать как ключ для симметричного шифрования (AES) сообщения. Передать результат работы RSA и AES одним сообщением. Получатель расшифровывает своим закрытым ключом SK первую часть, получает ключ K, считает его хэш H(K) и расшифровывает им сообщение.
еще вариант — перед шифрованием добивать блок рандомными данными фиксированной длины и потом отрезать их с другой стороны. таким образом даже одинаковые сообщения будут отличаться
Строго говоря, за абзацем, на который вы ссылаетесь, есть абзац про «Padding schemes», который как раз призван бороться с детерминистичностью результата. Я не призываю никого использовать RSA в чистом виде, и я полностью согласен с концепцией генерации сеансовых ключей под защитой RSA, это просто ремарка
Интересная идея, но есть и побочный эффект: Нет гарантий, что ваш скрипт сам не отсылает личные сообщения на ваш сервер.
У меня, например, тоже стоит самописный плагин к вконтакте, но он работает как кейлогер и угоняет переписку всех, кто логинится с моего ноутбука. Опять же — маловероятно что кто-либо из моих знакомых будет ставить подобные плагины, т.к. они будут опасаться, что переписку угонит сам плагин.
Несмотря на то, что скрипт простой, читать и анализировать его код обычные пользователи не будут. Никто не помешает под видом «супер-секретного-чата-дуров-не узнает» распространять скрипт (не ваш), сливающий все ключи тем же спецслужбам.
ИМХО, такого типа системы — что-то вроде ChipherSaber, иногда немного более стойкие. Реализуешь сам, сам пользуешься, знакомым/маме/девушке установил. В крайнем случае — по общему стандарту. А нести криптографию в массы, не неся в массы же элементарное знание матчасти — ИМХО бессмысленно.
<сарказм>
Это расширение для друзей. Позволяет расширять их интерфейс и получать дополнительную информацию о их окружении. Особенно хорошо на девушках работает, сразу видны все «недокументированные» фичи и подводные камни.
</сарказм>
Как в случае с Хемингуэем.
У писателя окружающие, в том числе друзья, видели серьезное психическое расстройство — параною: «жучки» и агенты ФБР мерещились ему постоянно.
Он даже проходил лечение.
Потом выяснилось, через десятки лет, что за ним действительно следило ФБР.
Лучше сгенерировать ключ и выдать пользователю через prompt, сообщив, что ключ нужно передать собеседнику по другому каналу.
Саму возможность отправить ключ через чат ВК отключить, выдав предупреждение об опасности mitm при попытке вставить ключ в чат.
Как бы ключ генерируется жаваскриптом, подцепленным greasemonkey, на домен vk.com и им же можно проверить отправку строки 41325три13245-213ололо5 в окно чата, на клиенте.
Нет, сразу видно, что вы никогда не сталкивались со страшным зверем пользователем.
Ключ: 413253132452135.
Пользователь забивает: 41325три13245-213ололо5.
Как вы определите, что пользователь забил ключ?
Я к чему это говорю — любая криптографическая система устойчивее ROT13 если и только если ее пользователь имеет элементарные знания о безопасности и желание этими знаниями пользоваться.
Сдуру можно и нос оторвать.
Любая система безопасности упрется в человеческую глупость, и тут уж ничего не поделаешь. Просто предупредив о вставке ключа в чат можно обезопасить 99% пользователей, остальные делают обфускацию ключа на свой страх и риск.
2048-битный ключ — это такой огромный blob, который передать по другому (например, телефону) каналу весьма проблематично. Ключи допустимо передавать и через чат, но выводя отпечатки ключей на обоих сторонах. Тогда можно будет позвонить по тому же телефону и довольно быстро сверить эти отпечатки. Другой вопрос — если ключ используется в течении долгого времени, то где его хранить? cookies, localstorage — оба хранилища легко читаются контактовскими скриптами, а первое, кроме того, еще и на сервер VK посылается. Возможное решение — хранение шифрованного ключа в LocalStorage и запрос через функцию prompt() пароля. Но, я уверен, тут найдется еще куча приемов типа замены функций, благо JS позволяет.
Кроме того, можно использовать долговременные ключи только для аутентификации, а сам ключ шифрования получать посредством DH/ECDH, как это делает OTR. Это немного снизит опасность похищения ключей, т.к. предыдущую переписку расшифровать все равно не получится (Perfect forward secrecy).
Шифрование своим приватным ключем называется «цифровая подпись». Но толку все равно никакого, если атакующий может подменять открытые ключи при обмене.
И чем тогда по-вашему шифруется хэш? Открытым ключем получателя? Тогда что мешает злоумышленнику взять тот же открытый ключ, подделать сообщение и переподписать его?
Разумеется на практике закрытым ключем «шифруется» хэш, но это делается только для того, чтобы размер подпись был небольшим и не зависел от размера подписываемого сообщения. Суть самой цифровой подписи все равно остается в «подписали, зашифровав закрытым ключем отправителя, проверили, расшифровав открытым ключем отправителя».
Основная идея такого чатика это обскьюрити. Потому что если подобный способ наберет популярность. MITM встроить в сервер будет не так дорого организовать. Сам н времени назад сделал на питоне похожу хрень для xmpp. Оно хорошо, если им пользуется 2 колеки и всем на вас пофиг.
Шифрованный тоннель для общения через VK (RSA + GreaseMonkey)