Здравствуйте, DIMEDROLL, Вы писали:
DIM>Можно ли имея несколько ключей в виде: DIM>H9CG-JZWY-JBCB-S3DN-X9VN DIM>KGMF-5MCJ-M67J-7PC3-W9PA
DIM>создать генератор ( keygen ), который бы мог генерировать ключи которые бы читались той программой которая их принимает?
Вопрос на вынос мозга. Может наоборот, чтоб принимались программой, которая их читает?
Теоретически — да. Практически — вряд ли, если крипто в программе правильное, конечно же.
Представьте свою задачку так — есть тыща имён. Известны те, которые программа принимает — Пётр, Екатерина, Александр, Николай.
Можно ли сделать генератор, который из той тыщи ещё несколько имён выберет, которые будут приняты?
XZ>Вопрос на вынос мозга. Может наоборот, чтоб принимались программой, которая их читает?
XZ>Теоретически — да. Практически — вряд ли, если крипто в программе правильное, конечно же.
XZ>Представьте свою задачку так — есть тыща имён. Известны те, которые программа принимает — Пётр, Екатерина, Александр, Николай. XZ>Можно ли сделать генератор, который из той тыщи ещё несколько имён выберет, которые будут приняты?
Как же их делают то? Дисассемблируют екзешники? А если екзешника нету, как тогда?)
Здравствуйте, DIMEDROLL, Вы писали:
DIM>Как же их делают то? Дисассемблируют екзешники? А если екзешника нету, как тогда?)
Чтобы сделать генератор будет вполне достаточно определить на основе каких параметров и каким алгоритмом(ами) обрабатывается информация для получения ключа. Про то как найти необходимые данные для генерации ключей уже другое дело... Можно подсмотреть логику, проверить не используются ли стандартные криптографические алгоритмы и пр. Если используются ассиметричные алгоритмы шифрования (rsa, эллиптические кривые, етк), то дело обстоит на порядок сложнее.
Здравствуйте, DIMEDROLL, Вы писали:
DIM>Как же их делают то? Дисассемблируют екзешники? А если екзешника нету, как тогда?)
Кто делает? Кул-хацкеры, что ли? Кейген можно сделать, воспользовавшись слабостью защиты. При элементарно грамотном использовании криптографии с асимметричными ключами, типа RSA, для создания кейгена необходимо знать закрытую часть ключа, которой в программном коде попросту нет — она только у разработчика и его агентов, которым доверено генерировать ключи. В том и прелесть вся схемы — для подписывания серийного номера (собранного с железа, например) используется ключ разработчика, а для проверки подписи на машине пользователя используется другой, зашитый в программу. Оба ключа связаны, но найти закрытый ключ по открытому практически невозможно, только перебором.
Здравствуйте, DIMEDROLL, Вы писали:
DIM>Можно ли имея несколько ключей в виде: DIM>H9CG-JZWY-JBCB-S3DN-X9VN DIM>KGMF-5MCJ-M67J-7PC3-W9PA
DIM>создать генератор ( keygen ), который бы мог генерировать ключи которые бы читались той программой которая их принимает?
Можно, если генератор писал, извиняюсь за выражение, "лох". Я могу дать Вам алгоритм генерации ключей и миллион ключей сгеренерированных этим алгоритмом — восстановите параметры алгоритма
Например md5( md5(UserID ^ MAGIC_UINT32_1) ^ MAGIC_UINT32_2 )
Ключ генерится на базе UserID и параметризуется двумя 32-битными константами. Я могу миллион ключей нагенерить, Вы все равно не решите задачу Preimage для MD5 — найти такой x, md5 от которого равен заданному значению — не сможете найти MAGIC_UINT32_1 и MAGIC_UINT32_2 ни в жизнь. Перебор будет 2^64, что равно половине количества зерна на шахматной доске, если на первый квадрат потожить одно зернышко, на второй два, на третий четыре и т.д.
Алгоритм может быть выдран только путем взлома программы.
Здравствуйте, AntZ, Вы писали:
AZ>Например md5( md5(UserID ^ MAGIC_UINT32_1) ^ MAGIC_UINT32_2 )
AZ>Алгоритм может быть выдран только путем взлома программы.
Вот такая защита и называется лоховской, когда путём взлома программы делается кейген. Ей же надо ещё проверять правильность подписи, а значит, держать в коде эти мейджики.
А вот если условие проверки выглядит как " decode( encode( UserID, KEY_PRIV ), KEY_PUB ) == UserID ", то программе надо знать только KEY_PUB, чтобы удостовериться, что сгенерённый ключ соответствует UserID. А KEY_PRIV, используемый для генерации ключа по UserID, должен находиться только у продавца. Дело техники — алгоритмы подготовки пар ключей KEY_PRIV/KEY_PUB, кодирования и декодирования, сила которых в том, чтобы зная KEY_PUB, подобрать к нему соответствующий KEY_PRIV можно было только перебором, который побеждается разрядностью.
Здравствуйте, Xander Zerge, Вы писали:
XZ>Дело техники — алгоритмы подготовки пар ключей KEY_PRIV/KEY_PUB, кодирования и декодирования, сила которых в том, чтобы зная KEY_PUB, подобрать к нему соответствующий KEY_PRIV можно было только перебором, который побеждается разрядностью.
Ты это теоретизируешь или готов поделиться ссылкой на библиотеку, которая может шифровать закрытым ключом, а расшифровывать открытым?
Здравствуйте, retalik, Вы писали:
XZ>>Дело техники — алгоритмы подготовки пар ключей KEY_PRIV/KEY_PUB, кодирования и декодирования, сила которых в том, чтобы зная KEY_PUB, подобрать к нему соответствующий KEY_PRIV можно было только перебором, который побеждается разрядностью. R>Ты это теоретизируешь или готов поделиться ссылкой на библиотеку, которая может шифровать закрытым ключом, а расшифровывать открытым?
Эээ... А какие тут проблемы? Достаточно взять любую библиотеку, умеющую подписывать строки с помощью RSA-сертификатов.
Здравствуйте, Xander Zerge, Вы писали:
XZ>Кто делает? Кул-хацкеры, что ли? Кейген можно сделать, воспользовавшись слабостью защиты. При элементарно грамотном использовании криптографии с асимметричными ключами, типа RSA, для создания кейгена необходимо знать закрытую часть ключа, которой в программном коде попросту нет — она только у разработчика и его агентов, которым доверено генерировать ключи. В том и прелесть вся схемы — для подписывания серийного номера (собранного с железа, например) используется ключ разработчика, а для проверки подписи на машине пользователя используется другой, зашитый в программу. Оба ключа связаны, но найти закрытый ключ по открытому практически невозможно, только перебором.
На самом деле ключи такой длины как у windows например(похожие приведены в примере) подбираются со скоростью 1 ключ в 5 минут.
(Они очень короткие для ассиметричной криптографии)
Но это не освобождает от необходимости понимать алгоритм либо отрезать проверяющую часть из exe и уметь ее быстро вызывать.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте, DIMEDROLL, Вы писали:
DIM>Можно ли имея несколько ключей в виде: DIM>H9CG-JZWY-JBCB-S3DN-X9VN DIM>KGMF-5MCJ-M67J-7PC3-W9PA
DIM>создать генератор ( keygen ), который бы мог генерировать ключи которые бы читались той программой которая их принимает?
Хм... Вы меня простите, но следующий топик на RSDN, по логике вещей, должен теперь быть: "Как создать кряк?". Потом сделать закрытый фрум.. ну и понеслась..
Здравствуйте, retalik, Вы писали:
XZ>>Дело техники — алгоритмы подготовки пар ключей KEY_PRIV/KEY_PUB, кодирования и декодирования, сила которых в том, чтобы зная KEY_PUB, подобрать к нему соответствующий KEY_PRIV можно было только перебором, который побеждается разрядностью.
R>Ты это теоретизируешь или готов поделиться ссылкой на библиотеку, которая может шифровать закрытым ключом, а расшифровывать открытым?
Кстати, я вспомнил ссылки на нечно похожее: раз и два
Здравствуйте, retalik, Вы писали:
XZ>>Дело техники — алгоритмы подготовки пар ключей KEY_PRIV/KEY_PUB, кодирования и декодирования, сила которых в том, чтобы зная KEY_PUB, подобрать к нему соответствующий KEY_PRIV можно было только перебором, который побеждается разрядностью.
R>Ты это теоретизируешь или готов поделиться ссылкой на библиотеку, которая может шифровать закрытым ключом, а расшифровывать открытым?
А какие проблемы? Цифровая подпись так и работает. Вычисляется хэш документа, шифруется закрытым ключом автора, для проверки подлинности документа получателем, снова вычисляется его хэш и сравнивается с хэшем, расшифрованным из подписи открытым авторским ключом. Любая крипто-библиотека с ассиметричными алгоритмами подойдёт для такого.
Так же и в защите программного продукта. Документ — это лицензионная информация: имя пользователя, компания, hardware fingerprint (хрен знает как перевести), если используется привязка к железу, ещё что-то про срок действия, какая-то другая дополнительная инфа. Что-то представлено в виде хэша, наверное, имя-компания-железо, например. Вот это всё и кодируется закрытым ключом разработчика, а открытым ключом декодируется уже у клиента. И если хэши пользователя-железа не совпадают с тем, что получилось, то гудбай.
Вот задача сделать кейген и сводится к простому — найти тот самый закрытый ключ.
--
Как самый настоящий шареварщик, я потратил месяц жизни, пиша (или пися? но так ещё хуже) свою собственную реализацию RSA и защиты ПО. Потом плюнул, и купил готовый навесной протектор.
Здравствуйте, MikePetrichenko, Вы писали:
DIM>>Можно ли имея несколько ключей... DIM>>создать генератор ( keygen ), который бы мог генерировать ключи которые бы читались той программой которая их принимает?
MP>Хм... Вы меня простите, но следующий топик на RSDN, по логике вещей, должен теперь быть: "Как создать кряк?". Потом сделать закрытый фрум.. ну и понеслась..
Да ладно. Может, человек интересуется, насколько опасно продать тыщу лицензий в виде тыщи ключей злобной китайской триаде, подневольный компутерные умельцы которой напишут кейген и будут продавать продукт от своего имени.
Здравствуйте, Xander Zerge, Вы писали:
XZ>Да ладно. Может, человек интересуется, насколько опасно продать тыщу лицензий в виде тыщи ключей злобной китайской триаде, подневольный компутерные умельцы которой напишут кейген и будут продавать продукт от своего имени.
"Все может быть
Все может статься
Машина может поломаться
Девченка может разлюбить
Но бросить пить — не может быть!" (С)
Здравствуйте, Xander Zerge, Вы писали:
XZ>А вот если условие проверки выглядит как " decode( encode( UserID, KEY_PRIV ), KEY_PUB ) == UserID ", то программе надо знать только KEY_PUB, чтобы удостовериться, что сгенерённый ключ соответствует UserID.
Все это очень хорошо, но...
Ключи должны быть длинными — как минимум 64 байт (т.е. p*q не менее 512 бит), чтобы избавиться от угрозы факторинга. Как следствие, серийники тоже будут весить те же 64 байта, это если в бинарном виде. А если в текстовом, то еще больше — в зависимости от способа кодирования.
Ты не забывай, что сложность вскрытия RSA растет как минимум полиномиально (NP), то при уменьшении длины ключа она так же полиномиально и падает.
Вот, кстати, крякерская статейка ( http://www.cracklab.ru/art/?action=view&id=154 ), о создании кейгена под эту технику. Как видим, авторы софта прокололись в 2х местах:
— использовали готовую библиотеку, что позволило крякеру легко опознать алгоритм RSA.
— взяли слишком короткий ключ, чтобы получить такой же короткий серийник.
__________
16.There is no cause so right that one cannot find a fool following it.
Здравствуйте, 0xDEADBEEF, Вы писали:
DEA>Здравствуйте, Xander Zerge, Вы писали:
XZ>>А вот если условие проверки выглядит как " decode( encode( UserID, KEY_PRIV ), KEY_PUB ) == UserID ", то программе надо знать только KEY_PUB, чтобы удостовериться, что сгенерённый ключ соответствует UserID.
DEA>Все это очень хорошо, но... DEA>Ключи должны быть длинными — как минимум 64 байт (т.е. p*q не менее 512 бит), чтобы избавиться от угрозы факторинга. Как следствие, серийники тоже будут весить те же 64 байта, это если в бинарном виде. А если в текстовом, то еще больше — в зависимости от способа кодирования. DEA>Ты не забывай, что сложность вскрытия RSA растет как минимум полиномиально (NP), то при уменьшении длины ключа она так же полиномиально и падает.
DEA>Вот, кстати, крякерская статейка ( http://www.cracklab.ru/art/?action=view&id=154 ), о создании кейгена под эту технику. Как видим, авторы софта прокололись в 2х местах: DEA>- использовали готовую библиотеку, что позволило крякеру легко опознать алгоритм RSA. DEA>- взяли слишком короткий ключ, чтобы получить такой же короткий серийник.
Если всё так явно дизассемблируется как там то совершенно пофигу какой алгоритм — заменить пару байт и будет кушать любой серийник. Эх, прошли те времена когда одним NOPом или JMP можно было сломать защиту большинства программ
Здравствуйте, Xander Zerge, Вы писали:
XZ>А какие проблемы? Цифровая подпись так и работает. Вычисляется хэш документа, шифруется закрытым ключом автора, для проверки подлинности документа получателем, снова вычисляется его хэш и сравнивается с хэшем, расшифрованным из подписи открытым авторским ключом.
Это я в курсе
XZ>Любая крипто-библиотека с ассиметричными алгоритмами подойдёт для такого.
Так и знал, что ссылок не получу...
Hint: Windows CryptoAPI и crypto++ не подойдут.
Hint 2: OpenSSL подошла, но на основе RSA уж больно длинные ключи получаются.
Здравствуйте, retalik, Вы писали:
XZ>>Любая крипто-библиотека с ассиметричными алгоритмами подойдёт для такого. R>Так и знал, что ссылок не получу...
R>Hint: Windows CryptoAPI и crypto++ не подойдут.