Текущий архив: 2005.10.02;
Скачать: CL | DM;
Вниз
Нужна помощь в криптографии Найти похожие ветки
← →
Piter © (2005-08-20 17:45) [0]Вообщем нужно понять способ аутентификации.
При сеансе связи сервер выдает некий ключ.
Клиент пересылает логин и зашифрованный пароль.
Вот реальный пример связи:
Сервер:s="nhcaakihtdcktajhpevffkiboqjitgyh"
Клиент:l="test_account" p="DE1285028E71C9B4B6AA16C2EE6F408D5A82738F"
Сервер: <авторизация прошла>
В данном сеансе связи реальный пароль на клиенте был "t2e5hejk
"
Я так понимаю клиент как-то шифрует пароль на основе ключа, выдаваемого сервером (ключ все время разный). Возможно, еше и логин используется при шифровке...
Может кто догадается как клиент шифрует данные?
← →
TUser © (2005-08-20 17:52) [1]Ассиметрическое любое, например, PGP.
← →
Piter © (2005-08-20 17:58) [2]TUser © (20.08.05 17:52) [1]
мне нужен конкретный алгоритм, чтобы повторить и самому иметь возможность авторизироваться.
Слишком расплывчато :(
К тому же, алгоритм уверен не сильно навороченный, применяется в игре... Вряд ли там PGP...
← →
Piter © (2005-08-20 18:18) [3]Логин при шифрации не используется.
Вот как генерируется:function dct(keys, psw) {
return (("p=\"" + encrypt(psw, keys)) + "\"");
}
Видимо, функцияencrypt
на основе пароля и ключа выдает уникальную комбинацию, которая используется для авторизации... Найти бы это функцию encrypt...
← →
DrPass © (2005-08-20 18:19) [4]
> Может кто догадается как клиент шифрует данные?
Любой из общедоступных криптографических алгоритмов. RSA, DES и т.д. Что толку угадывать?
← →
Piter © (2005-08-20 18:29) [5]Выяснил, что функция
encrypt
- это тоже самое, что функция encrypt во Flash: http://livedocs.macromedia.com/coldfusion/6.1/htmldocs/functi75.htm
Подскажите - как бы функциюencrypt
на Delphi реализовать?!
← →
Piter © (2005-08-20 18:30) [6]куда хоть копать...
← →
DrPass © (2005-08-20 18:43) [7]Написана, что алгоритм основан на операции XOR. "Основан" - это понятие растяжимое. В самом простом случае это просто побитовое xor пароля и ключа
← →
Eraser © (2005-08-20 18:50) [8]http://www.pgpru.com/manuals/intro/02.shtml
см. Криптография с открытым ключом
← →
Piter © (2005-08-20 19:04) [9]DrPass © (20.08.05 18:43) [7]
да... Но нужно больше конкретини :(
Eraser © (20.08.05 18:50) [8]
ну и что дальше? Что мне с этой ссылкой делать?
← →
Defunct © (2005-08-20 19:45) [10]> Piter ©
> Написана, что алгоритм основан на операции XOR.
Для анализа надо как минимум 2 пароля, и два зашифрованных представления. Лучше конечно 3 и более. Плюс, необходимо знать известен ли ваш пароль серверу, или проверка ведется только на клиенте. Плюс желательно знать какой ответ сформирует клиент, если ввести пустой пароль.
← →
TUser © (2005-08-20 20:09) [11]> Выяснил, что функция encrypt - это тоже самое, что функция encrypt во Flash
Уверен? Очень похоже, что там тебе дается открытый ключ, ты этим ключем шифруешь сообщение, передаешь его на сервер, а сервер с помощью своего закрытого ключа - читает. И убеждается в том, что ты - это ты.
А при симметричном шифровании бессмыслица какая-то получается, перехвативший вашу информацию хакер получает доступ.
← →
palva © (2005-08-20 21:28) [12]TUser © (20.08.05 20:09) [11]
Симметричное шифрование, по-моему, тоже здесь применимо. Сервер посылает код и просит приписать после него пароль и зашифровать при помощи симметричного ключа, после расшифровки сервер отбросит впереди стоящий код. Будучи перехвачена эта информация не даст возможности злоумышленнику войти вторично на сервер, поскольку сервер каждый раз генерирует другой код. Злоумышленник не может прикинуться сервером и выудить таким образом пароль, поскольку не знает симметричный ключ.
← →
TUser © (2005-08-20 21:35) [13]А если он перехватит и ключ, посылаемый сервером, и логин-пароль, которые Piter отправляет? Тогда он расшифрует их и сможет входить в систему сам. Хотя, конечно, согласен - надежность такого способа выше, чем при передаче открытого пароля (но ниже систем с открытым ключем), могут люди и так авторизироваться.
← →
palva © (2005-08-20 21:39) [14]Можно даже проще: вместо шифрования использовать хэш функцию. Например в PHP имеется MD5?
← →
palva © (2005-08-20 21:43) [15]TUser © (20.08.05 21:35) [13]
> Тогда он расшифрует их ...
Ну я имел ввиду, что сервер и клиент на этапе регистрации уже обменялись секретными ключами, которые они будут использвать при шифровании. При входе в сеанс происходит обмен только кодом, уникальным для сеанса.
← →
palva © (2005-08-20 21:46) [16]> логин-пароль, которые Piter отправляет
Кстати, я полагал, что логин пересылается в открытом виде, чтобы сервер мог использовать нужный ключ, уникальный для данного логина.
← →
Lamer@fools.ua © (2005-08-20 21:53) [17]>>palva © (20.08.05 21:39) [14]
>Например в PHP имеется MD5?
Имеется.
← →
Piter © (2005-08-20 23:20) [18]Нда. Народ? Такое ощущение, что вы даже читать не хотите :(
Давайте еще раз.
Итак, на словах происходит так:
- сервер пересылает некий рандомный сгенерированный ключ
- клиент с помощью этого ключа шифрует пароль (ЛОГИН НЕ ИСПОЛЬЗУЕТСЯ) и отсылает получившееся вместе с логином на сервер.
Вот реальный сеанс связи
Сервер:s="nhcaakihtdcktajhpevffkiboqjitgyh"
Клиент:p="DE1285028E71C9B4B6AA16C2EE6F408D5A82738F"
Со сторны клиента пароль шифруется так:function dct(keys, psw)
{
return (("p=\"" + encrypt(psw, keys)) + "\"");
}
то есть, с помощью переданного сервером ключаkeys
и известного клиенту пароля, генерируется ответ:encrypt(psw, keys)
Функцияencrypt
- стандартная из Macromedia Flash http://livedocs.macromedia.com/coldfusion/6.1/htmldocs/functi75.htm
Почему такой алгоритм - я не знаю. Да, если перехватить ключ, посылаемый сервер ом, и ответную комбинацию клиента, то пароль легко получить опять же стандартной функцией:DeCrypt(p=..., keys)
Но это не на моей совести, и это мне неинтересно. Интересно другое - как сделать то, что делает функция encrypt, чтобы уметь делать правильные комбинации по известному паролю и ключу?
← →
Piter © (2005-08-20 23:22) [19]Piter © (20.08.05 23:20) [18]
Сервер: s="nhcaakihtdcktajhpevffkiboqjitgyh"
Клиент: p="DE1285028E71C9B4B6AA16C2EE6F408D5A82738F"
пароль при этом был: t2e5hejk
Соответственно, получаем, что:
encrypt("t2e5hejk", "nhcaakihtdcktajhpevffkiboqjitgyh") = DE1285028E71C9B4B6AA16C2EE6F408D5A82738F
Как бы повторить encrypt...
← →
Piter © (2005-08-21 02:43) [20]Вероятно, одного сочетания для анализа недостаточно...
Вот два реальных вызова encrypt:
encrypt("t2e5hejk", "nhcaakihtdcktajhpevffkiboqjitgyh") = DE1285028E71C9B4B6AA16C2EE6F408D5A82738F
encrypt("qwaszx", "qjaeokbqpisclvbxkieqgpwsipsaiahc") = A03E70C3D0736CD0CCB86032469B66CC7C8739AD
Ключ всегда сервером дается из 32 символов.
encrypt всегда возвращает 40 символов, как видно, даже при разной длине пароля.
Также видно, что функция Encrypt возвращает только символы 0..9 и A..F, что очень смахивает на HEX код.
Я думал так:
- ключ XOR"ится паролем. Получается 32 символа (в том числе, нечитабельные символы). Потом просто выводятся символы в своих HEX значениях (набор ord[symbol] в HEX). Но тогда должно получится 64 символа, поэтому строка просто обрезается до 40 символов. Проверил - не так :(
Блин, наверняка алгоритм не очень сложный... Вполне возможно, что именно ключ XOR"ится паролем. А потом получившиеся 32 символа (среди которых наверняка нечитабельные есть) переводятся в 40 читабельных символов... Но вот как?
← →
Piter © (2005-08-21 02:55) [21]Может, кто форумы подскажет, где народ по теме тусуется...
← →
TUser © (2005-08-21 02:59) [22]Похоже там XOR, после чего MIME-кодирование
http://www.macromedia.com/devnet/server_archive/articles/understanding_encrypt.html
Ты два раза попал на первую страницу Яндекса - вот это раскрутка!
http://www.yandex.ru/yandsearch?stype=&nl=0&text=encrypt+macromedia
← →
Defunct © (2005-08-21 04:16) [23]Piter © (21.08.05 02:43) [20]
> Я думал так
> ...
На самом деле немного не так.
ключ от сервера - ничто иное как избыточный 32-х разрядный ключ, который считает по какой-то формуле, например по такой:for i := 0 to 7 do
begin
PD := @S[(i * 4) + 1];
i64 := i64 + PD^;
end;
D := (i64 and $ffffffff) + (i64 shr 32) xor $ffffffff;
возможно перед расчетом, добавляется пароль (+ - xor) к ключу. Либо после расчета накладывается свертка пароля (+ xor). Имеет 32-х битный подготовленный ключ. Потом к нему добавляется всякая лабуда чтобы раздуть его до 20 байт, потом эти 20 байт шлются серверу в виде hex строки.
все что я спросил в посте [10] вы расписали, кроме одного:
> Плюс желательно знать какой ответ сформирует клиент, если ввести пустой пароль.
← →
Piter © (2005-08-21 15:19) [24]Defunct © (21.08.05 4:16) [23]
Плюс желательно знать какой ответ сформирует клиент, если ввести пустой пароль
клиент не дает ввести пустой пароль и соответственно ничего не формирует. Сейчас буду думать на предмет, как бы потестировать функцию encrypt непосредственно
← →
Piter © (2005-08-21 16:53) [25]Народ! Как бы сделать так, чтобы самому можно было использовать эту функцию - хочу потестировать!
Нужно ColdFusion установить? Они в интернете какие-то здоровые, по 150 Mb...
← →
DiamondShark © (2005-08-21 20:17) [26]Ты может скажешь, откуда эта функция?
← →
Piter © (2005-08-21 20:27) [27]DiamondShark © (21.08.05 20:17) [26]
судя по всему... :((((
Судя по всему, функция Encrypt все таки реализована где-то внутри Flash документа, то есть это пользовательская функция.
Просто декомпиляторы не находят эту функцию - я подумал, что ее нет. А на самом деле наверняка ее просто разработчики "спрятали", защитили в общем...
← →
interceptor (2005-09-08 04:39) [28]2 Piter: Дружище, если раскопал что-то по этой функции - кинь мне на мыло ;) Столкнулся с той же проблемой - как на Delphi реализовать авторизаци. И, судя по коду, который ты привёл - на том же сервере ;)
← →
Reindeer Moss Eater © (2005-09-08 09:32) [29]
Сервер: s="nhcaakihtdcktajhpevffkiboqjitgyh"
Клиент: l="test_account" p="DE1285028E71C9B4B6AA16C2EE6F408D5A82738F"
Сервер: <авторизация прошла>
В данном сеансе связи реальный пароль на клиенте был "t2e5hejk"
Я так понимаю клиент как-то шифрует пароль на основе ключа, выдаваемого сервером (ключ все время разный). Возможно, еше и логин используется при шифровке...
Может кто догадается как клиент шифрует данные?
Если там реализован challenge-response, то бесполезно искать зависимости между реальным паролем и потоками байтов между сервером и клиентом. Пароль меняться не будет, а потоки будут каждый раз разные.
← →
interceptor (2005-09-09 18:37) [30]2 Reindeer Moss Eater:
Вопрос-то не в зависимостях, а в том, как реализовать эту функцию на Delphi. Что-то нет нигде её алгоритма в инете =( И на сайте Макромедии - только общие понятия.
← →
Piter © (2005-09-09 19:24) [31]Писал я тебе - нету никакого алгоритма, ошибся я.
Это функция, которая реализована самими программистами, так что может быть любой.
← →
interceptor (2005-09-09 23:09) [32]Мдя... Но у читеров на сайте это как-то работает! Не думаю, что им админы предоставили алгоритм.
← →
Piter © (2005-09-10 13:17) [33]нет, они просто взяли и выдрали алгоритм из флешки.
А читеров там нет.
← →
default © (2005-09-10 17:55) [34]Piter © (21.08.05 02:43) [20]
зачем сразу такие сложные примеры берёшь?
посмотри что выйдет, например, из
encrypt("a", "b")
encrypt("b", "a")
то есть коммутативна(то есть меняется ли результат шифровки от перестановки параметров) ли данная функция
и какие изменения происходят при
encrypt("a", "b")
encrypt("a", "c")
encrypt("a", "d")
то есть сначала посмотреть как ведёт себя функция при односимвольных параметрых, что-то надо тут уже подметить, далее проверить сделанное ранее предположение на более длинных параметрах, вообще надо по чуть чуть пытаться узнавать эту функцию, в ходе процесса должно возникнуть какие-нибудь мысли о функции
← →
default © (2005-09-11 00:26) [35]да...
не в тему написал в [34]
в данном случае параметрами не побаловаться
← →
interceptor (2005-09-12 18:46) [36]Да и вообще - там всё несколько сложнее:
l=\"" + _global.myReallogin + "\" " + dct(_l4.s, COnline()) + (_global.private_key ? (" p" + dct(_l4.s, _global.private_key)) : (""))
Так что по известному паролю и ключу вряд ли вычислишь. Только в коде искать.
Страницы: 1 вся ветка
Текущий архив: 2005.10.02;
Скачать: CL | DM;
Память: 0.57 MB
Время: 0.054 c