|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Ноя 7, 2004 00:18:19 не уйма. Если randseed действительно зависит от даты то получится меньше чем 2^32 и вполне так решаемо. |
|
|
Дата: Ноя 8, 2004 12:24:05 · Поправил: bogrus Получается randseed зависит от GetTickCount, т.е. двордового счетчика, который стартует с момента загрузки ОС, и делает полный оборот за 49.7 дней Но! Многие ли не выключают комп такой период? имхо обычно машина работает до суток added: trsa я компилил в 6-м дельфи, там в randomize используется GetSystemTime rtl60.System::Randomize 4>/ PUSH EBP 40003679 | MOV EBP, ESP 4000367B | ADD ESP, -18 4000367E | LEA EAX, DWORD PTR [EBP-18] 40003681 | PUSH EAX 40003682 | CALL <JMP.&kernel32.GetSystemTime> 40003687 | MOVZX EAX, WORD PTR [EBP-10] 4000368B | IMUL EAX, EAX, 3C 4000368E | ADD AX, WORD PTR [EBP-E] 40003692 | IMUL EAX, EAX, 3C 40003695 | XOR EDX, EDX 40003697 | MOV DX, WORD PTR [EBP-C] 4000369B | ADD EAX, EDX 4000369D | IMUL EAX, EAX, 3E8 400036A3 | MOV DX, WORD PTR [EBP-A] 400036A7 | ADD EAX, EDX 400036A9 | MOV DWORD PTR [System::RandSeed], EAX 400036AE | MOV ESP, EBP 400036B0 | POP EBP 400036B1 \ RET rtl60.System::RandInt 4> / PUSH EBX 40004125 | XOR EBX, EBX 40004127 | IMUL EDX, DWORD PTR [EBX+System::RandSeed],8088405 40004131 | INC EDX 40004132 | MOV DWORD PTR [EBX+System::RandSeed], EDX 40004138 | MUL EDX 4000413A | MOV EAX, EDX 4000413C | POP EBX 4000413D \ RETВ этом случае, если предположить, что ключи генерировались автоматически в момент компиляции (сборки) проекта, то это (почти точное) время известно по PE.TimeDateStamp |
|
|
Дата: Ноя 8, 2004 19:14:53 · Поправил: bogrus Каков принцип: Берем начальное значение RandSeed, как в проге генерим 2 простых числа (P и Q), перемножаем и сравниваем с твоим modulus, если не совпало - значит повторяем пока RandSeed<>FFFFFFFF Как происходит генерация P и Q в этом примере: Нажимаем "CreateKey" и vcl60.Controls::TControl::Click запускает процедуру. Она выделяет 2 буфера (обзовем их "Xp" и "Xq", каждый размером 17*4 байт), потом их заполняет (вызывая rtl60.System::RandInt) случайными значениями. Но (видимо хороший глюк:) параметр RandSeed пуст, т.к. не вызывалась ф-ция Randomize, и по этому значения эти не случайны, а всегда одинаковы! Буферы "X" это просто константа, с которыми будут ксорится числа. Теперь уже вызывается Randomize (один раз), после этого выделяется ещё 2 буфера (пусть "P" и "Q", по 8*4 байт=256 бит для RSA512), в них будут числа P и Q. Далее идет заполнение этих буферов, вот тело цикла для числа P: CALL <JMP.&rtl60.System::RandInt> ; в eax псевдослучайное число XOR EAX, DWORD PTR [EDI] ; в edi буфер "Xp" MOV DWORD PTR [EDX], EAX ; в edx буфер "P"После цикла, чтобы число было простым, видимо делается такая махинация: OR [EDX+28],80000000h ; последний дворд P OR [EDX],1 ; первый дворд PДальше P*Q и modulus готов. Всё, выдираем\пишим, оптимизируем алго и ждём заветные P,Q man0war Как там в твоей (не тестовой) проге х.з. |
|
|
Дата: Ноя 9, 2004 09:43:32 Bogrus Спасибо . В принципе я это давно понял , просто думал над тем как уменьшить диапазон для перебора. |
|
|
Дата: Ноя 9, 2004 09:52:12 Вообще я время даже приблизительно не прикидывал, думай, какой там возможен RandSeed в твоей проге... И потом, ведь ещё можно диапазон RandSeed разбить на части, пропорциональные количеству машин, которые ты можешь задействовать. |
|
|
Дата: Ноя 9, 2004 11:53:25 Правка bogrus trsa я компилил в 6-м дельфи Я привёл листинг Randomize и RandomInt (есть ещё Random, определённый как function Random():Extended; ), их генерирует Borland Delphi Compiler 15.0 (Delphi v7.0.4.453). Так что придётся посмотреть, что в предыдущих версиях (<6.0) и точно определить версию, которой собран целевое приложение. |
|
|
Дата: Ноя 9, 2004 12:42:33 генерирует Borland Delphi Compiler 15.0 что-то мне подсказывает что исходники VCL, в особенности модуль system, где, скорее всего, находится функция random не меняются уже очень долго между верисями. IMO надо не версию компилятора определить а просто версию делфи (5,6,7) и посмотреть в сырцы соответствующей VCL. |
|
|
Дата: Ноя 9, 2004 12:50:57 Компилятор не Delphi ,а Builder 5 , но это в данном случае безразлично. |
|
|
Дата: Ноя 9, 2004 21:34:56 Bogrus В примере , который идёт с компонентом , всё просто , в нём заполнение массивов SeedP и SeedQ идёт с помощью функции Random($FFFFFFFF) . Ничего подобного в программе , которую я рассматриваю , не используется. Разработчик скорей всего воспользовался советом создателей компонента и применил более "правильный" PRNG , что-нибудь типа BBS (Blum-Blum-Shub). Это только моё предположение, так как это не выяснить - никакого кода нет.Ключи сгенерированы отдельной программой. Программа , которая исследовалась , лежит на www.ptgui.com Всё , наверное надо тему закрывать. |
|
|
Дата: Ноя 10, 2004 01:08:57 пропатчи паблик кей - по-моему это наиболее приемлимое решение исходя из вышеизложенного. |
|
|
Дата: Ноя 10, 2004 08:09:12 пропатчи паблик кей - по-моему это наиболее приемлимое решение исходя из вышеизложенного. Спасибо ,infern0 . Это я давно понял , но не хотел применять "грязный" битхак :) Всё хотелось сделать красивей , поэтому и начал эту тему. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076 |