встала задача написать аналог сабжа и отдать исходники заказчику. львиную долю уже сделал, парсинг вх и исх сообщений по аське, шифрование и дешифрование налету. но всё это со статичными ключами вшитыми в прогу. сделал динамику, но встала проблема обмена ключами между собеседниками. пытался посмотреть как в SimpPro реализовано, но не далеко продвинулся: оно грузит WinsockHookDLL.dll во все процессы, ставит хук на WH_GETMESSAGE и хучит GetTickCount. не густо. есть какие-нибудь идеи?
я не большой спец, но почему бы не сделать так: программа номер раз отсылает паблик кей РСА, программа номер два генерирует ключ АЕС для этого контрагента, шифрует его полученным паблик ключем и отправляет обратно. Потом вторая программа отсылает свой паблик РСА, а первая посылает ей сгенерированный и зашифрованный ключ РСА для этого собеседника. И так и происходит обмен.
Я тоже далеко не спец) 2 MSoft - MitM? Проблема с реализацией в коде, или с самой политикой распространения ключей?
Span да проблема с реализацией, т.к. у каждого сообщения в асе, есть свой ид, и так просто сообщение не отправишь =( придётся увеличивать ид всех посл сообщений на 1 и т.д, это очень накладно. MSoft это всё понятно)) как обменяться ключами? через свой сервер отпадает, через сообщения самой аси см. выше. censored что за OTR? плагин к миранде?
Собеседнику передаётся ПАБЛИК кей, собеседник его получает и генерирует случайный колюч который шифрует твоим ПАБЛИК ключом, затем он отсылает зашифрованый ключ тебе обратно, и ты его расшифровываешь своим ЗАКРЫТЫМ ключом. Перехватить нереально http://ru.wikipedia.org/wiki/RSA
Существует такой плагин к миранде SecureIM, в нем реализован обмен ключами по алгоритму Diffie-Hellman'а прямо посредством сообщений, которые не показываются пользователю. Если невозможно послать сообщение отдельно, то почему бы не изменять первое сообщение на данные для обмена ключами + зашифрованное сообщение, а пользователю только показывать расшифрованное сообщение.
плагин не вариант, должна быть универсальность на счёт подмены сообщений я думал, но т.к. это накладывает определённые ограничения, я оставил это на крайний случай. около часа сейчас провозился, но всё таки сделал отправку сообщений из своего софта + подмену ид, тестил правда только с квипом, но пока это меня устраивает. з.ы. OTR proxy помог итого: Код (Text): If (arr[0] = $2A) then // проверка на пакет аськи begin wLastMesId := MakeWord(arr[3],arr[2]); // получаем ид пакета If (wDelta > 0) then // если мы что-то слали begin inc(wLastMesId,wDelta); // то нада поправить ид arr[2] := HiByte(wLastMesId); // и засунуть обратно в пакет arr[3] := LoByte(wLastMesId); end; result := wLastMesId end;
По хорошему, обмен должен производиться альтернативным путём. И, AFAIR, именно так реализовано в Simp'e. Я бы сделал доп. опцию в программе, типа Exchange Server address. Создал бы свой простенький протокол обмена ключами(в простейшем случае это http(s)-сервер и php скрипт) и юзал бы его. Если продукт коммерческий, я думаю люди, так волнующиеся о своей безопастности, смогут найти сервак на 5 минут, залить туда php скрипт и вписать один раз адрес в программу.
не, ну если криптохрень должна попасть в левые руки, то да, надо заранее договариваться о ключе, типо - мм.. какой бы нам ключ придумать? - мм.... давай твой ДР? - мм.. нее, это просто слишком! подберут. - мм.. а давай тогда так, как звали ту тёлку которую ты снял на прошлой вечеринке ? - хехех, давай! - !":%;! не работает =\\ - а ты чё написал? Лида с большой буквы хоть? - какая лида?? О_о лида это моя девка ты чё! - ой Х_х - ^@%$^!!!! Я ЩАС #*% ПРИЕДУ !№;!! итп.. думаю, вы видите недостатки этого способа обмена ключами .) а если будет дело приватезное и алгос никому не попадётся, можно хоть статиком, который хоть от даты зависит, хоть от айди отсылаемого сообщения =\ и да, у меня была идея идеального обмена, но я её ещё не додумал. если всё буде так как предпологалось - поделюсь.
Симп подменяет характеристики IM клиента, так чтобы на другой стороне можно было понять, есть он или нет (помойму через Xtraz). Эту фичу выцепляет миранда, например, говоря что чел сидит через симп. Если фича в характеристиках найдена, то уже можно конвертить мессаги в свой формат будучи уверенным в том, что на той стороне придут не странные кракозябры, а исконная инфа. С идами да, получается небольшая заминка на этапе обмена ключами потому что по сути сама криптотулза швыряется мессагами другой криптотулзе, в остальном смысла подменять иды я не вижу (хотя возможно не осведомлен в сути icq протокола)
2FED Угу, а текто на на гейте отсекают пакеты с твоим паблик кеем, шлют свой, получают обратно зашифрованный ИХ паблик кеем ключ, расшифровывают, шифруют твоим, шлют тебе. И таким образом читают всю переписку. С твоей точки зрения все прозрачно. И не надо пожалуйста говорить, что на практике это якобы не реализуемо. Hellspawn Настоятельно (еще раз - НАСТОЯТЕЛЬНО) советую прочесть: http://www.ozon.ru/context/detail/id/2153578/ Шикарная книга, прочитал за два дня на одном дыхании. Вопрос создания безопасного канала рассматривается на протяжении всей книги во всех подробностях. Приводится масса примеров неправильной реализации (напирмер, как вариант 2FED). Все это - понятным и живым языком.
n0hack спс, книжку скачал и даже ещё прикладную криптографию скачал, начал читать. даже если предположить такой вариант, тем кто это провернёт, надо будет завладеть ещё номером аськи одного из собеседников (т.к. ключ привязывается к номеру), а если это им удастся, то можно уже и ключи не подменять
через гейт тока обмен ключами + ключ привязывается к номеру в самом софте и запоминается. и если дешифровка не удасться, то логично что ключ лажовый нам дали.