|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
29.04.2010, 23:56 | #1 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Генератор ключей
Народ кто нибудь знает, как можно сгенерировать ключ, на основе какой нибудь строки? Например так можно получить хэш пароля:
Код:
Кстати читал, что тип String лучше вообще не использовать для хранения пароле ключей и т.д. а желательно использовать SecureString (шифрует полученный текст грубо говоря и уничтожается сразу в отличии от String). Вообще цель, создать кейген для выдачи ключей пользователям и проверки в программе. Ни разу ничего подобного не писал, так что нужна помощь. |
30.04.2010, 11:57 | #2 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
У каждой программы свой алгоритм генерации ключей, иначе бы генерация ключей не имела бы никакого смысла. Если был бы единственный общепризнанный и используемый везде алгоритм, то пользуясь им можно было бы тут же написать keygen к любой программе.
А как сделать в каждом конкретном случае - зависит от ситуации. Если интересно, могу написать свои соображения на этот счёт. |
30.04.2010, 15:58 | #3 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Ну конечно интересно . Я в курсе, что нет ну прям одного определённого алгоритма. Мне просто хотелось бы научиться вообще генерировать такие коды, а всякие заморочи я сам уже добавлю. Или вообще переделаю всё по другому, мне главное понять как вообще с этим делом работать. И если есть какие то свои примеры и разные, хоть 10 выкладывайте, всё интересно.
|
30.04.2010, 16:13 | #4 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
Поищи реализации алгоритмов криптографии. Например, DES, RC2, Rijndael, RSA и др. В нете их куча, есть даже open-source проект.
|
30.04.2010, 21:29 | #5 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
Ох.Ну что приходит в голову.
Если генерация ключа нужна просто так - без надежды защититься, когда кто-то будет взламывать вашу программу, то самый простой способ получить серийный номер - любым симметричным алгоритмом с перестановками шифруем строку типа "ключевая_фраза<случайное число>". В программу зашиваем ключ шифрования. Пусть программа расшифровывает имеющимся ключом введённый в неё серийник. Дальше проверяем - если ключевая фраза в начале получилась, то серийник верен. Если нет - то уж извините). Другое дело, что этот алгоритм банально вскрыть) Просто вытаскиваем зашитый в программу ключ шифрования и угадываем алгоритм шифрования (или же анализируем код программы и пишем алгоритм сами). Конечно же, существуют обфускаторы, запутывающие код и множество антиотладочных приёмов, препятствующих анализу кода, но это всё - надстройки над изначально порочной системой. При желании хакер может написать к такой системе keygen. Другое дело, что если слишком уж запутать алгоритм шифрования всякими там способами, то может статься, что crack написать гораздо проще. Для того, чтобы усложнить взлом подойдёт такая система. Допустим, пользователь установил вашу программу. Прошло 30 дней триального срока и пользователю нужно вашу программу купить. Он нажимает на кнопку "купить", программа генерирует текстовой файл, содержащий данные пользователя (например имя, адрес электронной почты и т. д.). Если хочется - можно добавить какие-нибудь данные машины, чтобы избежать того, чтобы лицензию использовали на другом компьютере (серийный номер винды, серийные номера различного железа). Этот файл отправляется к вам. И вы "подписываете" файл электронной подписью, и отправляете его пользователю. Пользователь отдаёт файл-лицензию программе, она проверяет, если подпись действительна и данные совпадают - она считает себя купленной. Что же по сути есть электронная подпись? Это асимметричный алгоритм шифрования. Асимметричный - означает, что для шифрования и для расшифровки используются разные ключи. Один из них открытый, другой - закрытый. Из закрытого ключа можно получить открытый, но не наоборот (то есть зная открытый ключ, получить закрытый невозможно, или чрезвычайно сложно). По сути, когда вы подписываете файл, вы шифруете его своим закрытым ключом. В программу на компьютере пользователя необходимо зашить открытый ключ, который может расшифровать файл. Если файл-лицензия слишком громоздка для вашей ситуации и нужен именно серийный номер, то можно подписывать не файл данных, а, к примеру, его контрольную сумму (хотя бы тот же md5-хэш от файла данных). В случае, если нужно организовать защиту диска от копирования, можно не зашивать ключ для расшифровки в программу, а хитро раскидать байты ключа по диску, собирая ключ каждый раз при запуске (как это делают, например, игры). Ко второй системе (с асимметричным шифрованием) написать keygen (или генератор файлов-лицензий) практически невозможно. (Вернее, чрезвычайно сложно, потому что для этого нужно получить закрытый ключ. Если бы можно было вот так просто взять и получить закрытый ключ, электронные сертификаты и подписи не использовались бы). Но к этой системе можно написать Crack, просто отключающий систему защиты. И опять придётся городить обфускацию, антиотладочные приёмы, проверку целостности системы защиты и ещё кучу всего, что усложняет взлом, но не гарантирует абсолютную защиту. Кстати, ubisoft, говорят, в своих новых играх будет использовать новую систему защиты) Теперь игра будет требовать постоянный доступ к интернету для своей работы. Разумеется, игра не просто периодически стучится к серверу и спрашивает "а лицензионная ли я", ведь в этом случае можно было бы просто написать эмулятор сервера, отвечающий "да, подтверждаю подлинность". Игра постоянно скачивает какие-то данные, требуемые для своей работы (во всяком случае так утверждают разработчики защиты, хотя может быть нагло врут). Написать эмулятор сервера к этой защите очень сложно (я бы даже сказал - почти невозможно). Последний раз редактировалось kogemrka; 30.04.2010 в 21:49. Причина: исправлена пара ошибок, добавлена дополнительная информация |
30.04.2010, 21:59 | #6 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
А, или тебя интересует как вообще из строки что-нибудь сгенерировать?
Ну дык каждый символ строки - это число от 0 до 255 (один байт). При шифровании (ну или вычисления контрольной суммы, к примеру той же md5) над этими числами производятся перестановки + различные математические операции. К примеру самый простой способ симметричного шифрования без перестановок - проходим в цикле по каждому символу исходной строки и делаем xor с символом ключа. При расшифровке делаем xor ещё раз. Если собираешься делать реализацию первой описанной мной системы, то можешь реализовать алгоритм сам (хоть тем же xor`ом, только ещё и перестановки добавь). Если собираешься делать реализацию системы с подписями - то лучше возьми уж готовую реализацию (их полно, и в виде библиотек, и в виде самостоятельных программ, и коммерческих, и некоммерческих и с открытым исходным кодом) |
01.05.2010, 11:13 | #7 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
и как символ перевести в число от 0 - 255 и обратно? В теории понятно, буду разбираться на примерах из MSDN, вчера пробовал один пример вроде получилось его приспособить по WinForms только не понял, что он конкретно делает, что шифрует и шифрует ли вообще что-то кроме строчки текста. Ну ладно тут я разберусь. Так всё-таки может кто выложит пример, как получить ключ как в первом посту?
|
01.05.2010, 15:24 | #8 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
Да вон, в твоём же коде ты получаешь из unicode строки массив байтов:
byte[] bytetohash = Encoding.Unicode.GetBytes(password) ; А тут из числа (которым является хэш) ты получаешь строку, состоящую из видимых символов (base64 - это не прямое преобразование кодов в символы, это ещё и дополнительное кодирование [обратимое конечно], делающие так, чтобы строка состояла только из символов английского алфавита и цифр): string passwordHash = Convert.ToBase64String(MyHash.Hash) ; Люто советую не копировать примеры и запоминать "Ага! Вот эти пятьдесят строчек кода делают вот то-то и то-то", а разбираться, что делает каждая строка. Ведь ты же учишься, а читая (именно читая и пытаясь понять) чужой код ты научишься гораздо большему, чем просто копируя примеры (копируя ты не научишься ничему). MSDN в помощь, там есть справка по всем методам всех входящих в .Net классов. Поможет разобраться, что делается в той или иной строке кода. Если какие-то места останутся непонятными - пиши сюда, на форум, или в личку/аську конкретно мне. PS. Если соберёшься писать в личку, не жди ответа до 7-го мая, уезжаю в Питер и доступа на форум скорее всего иметь не буду. |
03.05.2010, 18:29 | #9 |
Форумчанин
Регистрация: 04.07.2007
Сообщений: 549
|
Чёто нифига не получается. Хотел конкретно с массивом байт мутить перестановку:
Код:
Последний раз редактировалось Casper-SC; 03.05.2010 в 23:42. |
03.05.2010, 18:53 | #10 |
Форумчанин Подтвердите свой е-майл
Регистрация: 31.03.2008
Сообщений: 179
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как подсчитать число дубликатов ключей в массиве | vvsh | PHP | 2 | 08.02.2010 23:43 |
Существуют ли редакторы ключей...? | Cкулаб | Софт | 5 | 30.05.2009 13:46 |
Удаление ключей и параметров из реестра... | Altera | Общие вопросы Delphi | 1 | 06.05.2008 20:32 |