Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2010, 23:56   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Генератор ключей

Народ кто нибудь знает, как можно сгенерировать ключ, на основе какой нибудь строки? Например так можно получить хэш пароля:
Код:
using System.Security.Cryptography;
...
String password = "crash54y7b";
MD5CryptoServiceProvider MyHash = new MD5CryptoServiceProvider();
            byte[] bytetohash = Encoding.Unicode.GetBytes(password);
            MyHash.ComputeHash(bytetohash);
            string passwordHash = Convert.ToBase64String(MyHash.Hash);

            MessageBox.Show(passwordHash);
А как сгенерировать ключ вида: SC3FR-RRTGG-FGGH5-KJKLN-55UT7 или подобный?
Кстати читал, что тип String лучше вообще не использовать для хранения пароле ключей и т.д. а желательно использовать SecureString (шифрует полученный текст грубо говоря и уничтожается сразу в отличии от String).
Вообще цель, создать кейген для выдачи ключей пользователям и проверки в программе. Ни разу ничего подобного не писал, так что нужна помощь.
Casper-SC вне форума Ответить с цитированием
Старый 30.04.2010, 11:57   #2
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

У каждой программы свой алгоритм генерации ключей, иначе бы генерация ключей не имела бы никакого смысла. Если был бы единственный общепризнанный и используемый везде алгоритм, то пользуясь им можно было бы тут же написать keygen к любой программе.

А как сделать в каждом конкретном случае - зависит от ситуации. Если интересно, могу написать свои соображения на этот счёт.
kogemrka вне форума Ответить с цитированием
Старый 30.04.2010, 15:58   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Ну конечно интересно . Я в курсе, что нет ну прям одного определённого алгоритма. Мне просто хотелось бы научиться вообще генерировать такие коды, а всякие заморочи я сам уже добавлю. Или вообще переделаю всё по другому, мне главное понять как вообще с этим делом работать. И если есть какие то свои примеры и разные, хоть 10 выкладывайте, всё интересно.
Casper-SC вне форума Ответить с цитированием
Старый 30.04.2010, 16:13   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Поищи реализации алгоритмов криптографии. Например, DES, RC2, Rijndael, RSA и др. В нете их куча, есть даже open-source проект.
Hollander вне форума Ответить с цитированием
Старый 30.04.2010, 21:29   #5
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Ох.Ну что приходит в голову.

Если генерация ключа нужна просто так - без надежды защититься, когда кто-то будет взламывать вашу программу, то самый простой способ получить серийный номер - любым симметричным алгоритмом с перестановками шифруем строку типа "ключевая_фраза<случайное число>". В программу зашиваем ключ шифрования. Пусть программа расшифровывает имеющимся ключом введённый в неё серийник. Дальше проверяем - если ключевая фраза в начале получилась, то серийник верен. Если нет - то уж извините).
Другое дело, что этот алгоритм банально вскрыть) Просто вытаскиваем зашитый в программу ключ шифрования и угадываем алгоритм шифрования (или же анализируем код программы и пишем алгоритм сами). Конечно же, существуют обфускаторы, запутывающие код и множество антиотладочных приёмов, препятствующих анализу кода, но это всё - надстройки над изначально порочной системой. При желании хакер может написать к такой системе keygen. Другое дело, что если слишком уж запутать алгоритм шифрования всякими там способами, то может статься, что crack написать гораздо проще.

Для того, чтобы усложнить взлом подойдёт такая система. Допустим, пользователь установил вашу программу. Прошло 30 дней триального срока и пользователю нужно вашу программу купить. Он нажимает на кнопку "купить", программа генерирует текстовой файл, содержащий данные пользователя (например имя, адрес электронной почты и т. д.). Если хочется - можно добавить какие-нибудь данные машины, чтобы избежать того, чтобы лицензию использовали на другом компьютере (серийный номер винды, серийные номера различного железа). Этот файл отправляется к вам. И вы "подписываете" файл электронной подписью, и отправляете его пользователю. Пользователь отдаёт файл-лицензию программе, она проверяет, если подпись действительна и данные совпадают - она считает себя купленной.

Что же по сути есть электронная подпись? Это асимметричный алгоритм шифрования. Асимметричный - означает, что для шифрования и для расшифровки используются разные ключи. Один из них открытый, другой - закрытый. Из закрытого ключа можно получить открытый, но не наоборот (то есть зная открытый ключ, получить закрытый невозможно, или чрезвычайно сложно). По сути, когда вы подписываете файл, вы шифруете его своим закрытым ключом. В программу на компьютере пользователя необходимо зашить открытый ключ, который может расшифровать файл.

Если файл-лицензия слишком громоздка для вашей ситуации и нужен именно серийный номер, то можно подписывать не файл данных, а, к примеру, его контрольную сумму (хотя бы тот же md5-хэш от файла данных).

В случае, если нужно организовать защиту диска от копирования, можно не зашивать ключ для расшифровки в программу, а хитро раскидать байты ключа по диску, собирая ключ каждый раз при запуске (как это делают, например, игры).

Ко второй системе (с асимметричным шифрованием) написать keygen (или генератор файлов-лицензий) практически невозможно. (Вернее, чрезвычайно сложно, потому что для этого нужно получить закрытый ключ. Если бы можно было вот так просто взять и получить закрытый ключ, электронные сертификаты и подписи не использовались бы).
Но к этой системе можно написать Crack, просто отключающий систему защиты. И опять придётся городить обфускацию, антиотладочные приёмы, проверку целостности системы защиты и ещё кучу всего, что усложняет взлом, но не гарантирует абсолютную защиту.

Кстати, ubisoft, говорят, в своих новых играх будет использовать новую систему защиты) Теперь игра будет требовать постоянный доступ к интернету для своей работы. Разумеется, игра не просто периодически стучится к серверу и спрашивает "а лицензионная ли я", ведь в этом случае можно было бы просто написать эмулятор сервера, отвечающий "да, подтверждаю подлинность". Игра постоянно скачивает какие-то данные, требуемые для своей работы (во всяком случае так утверждают разработчики защиты, хотя может быть нагло врут). Написать эмулятор сервера к этой защите очень сложно (я бы даже сказал - почти невозможно).

Последний раз редактировалось kogemrka; 30.04.2010 в 21:49. Причина: исправлена пара ошибок, добавлена дополнительная информация
kogemrka вне форума Ответить с цитированием
Старый 30.04.2010, 21:59   #6
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

А, или тебя интересует как вообще из строки что-нибудь сгенерировать?
Ну дык каждый символ строки - это число от 0 до 255 (один байт). При шифровании (ну или вычисления контрольной суммы, к примеру той же md5) над этими числами производятся перестановки + различные математические операции.

К примеру самый простой способ симметричного шифрования без перестановок - проходим в цикле по каждому символу исходной строки и делаем xor с символом ключа. При расшифровке делаем xor ещё раз.

Если собираешься делать реализацию первой описанной мной системы, то можешь реализовать алгоритм сам (хоть тем же xor`ом, только ещё и перестановки добавь).
Если собираешься делать реализацию системы с подписями - то лучше возьми уж готовую реализацию (их полно, и в виде библиотек, и в виде самостоятельных программ, и коммерческих, и некоммерческих и с открытым исходным кодом)
kogemrka вне форума Ответить с цитированием
Старый 01.05.2010, 11:13   #7
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

и как символ перевести в число от 0 - 255 и обратно? В теории понятно, буду разбираться на примерах из MSDN, вчера пробовал один пример вроде получилось его приспособить по WinForms только не понял, что он конкретно делает, что шифрует и шифрует ли вообще что-то кроме строчки текста. Ну ладно тут я разберусь. Так всё-таки может кто выложит пример, как получить ключ как в первом посту?
Casper-SC вне форума Ответить с цитированием
Старый 01.05.2010, 15:24   #8
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Да вон, в твоём же коде ты получаешь из unicode строки массив байтов:
byte[] bytetohash = Encoding.Unicode.GetBytes(password) ;

А тут из числа (которым является хэш) ты получаешь строку, состоящую из видимых символов (base64 - это не прямое преобразование кодов в символы, это ещё и дополнительное кодирование [обратимое конечно], делающие так, чтобы строка состояла только из символов английского алфавита и цифр):
string passwordHash = Convert.ToBase64String(MyHash.Hash) ;

Люто советую не копировать примеры и запоминать "Ага! Вот эти пятьдесят строчек кода делают вот то-то и то-то", а разбираться, что делает каждая строка. Ведь ты же учишься, а читая (именно читая и пытаясь понять) чужой код ты научишься гораздо большему, чем просто копируя примеры (копируя ты не научишься ничему).

MSDN в помощь, там есть справка по всем методам всех входящих в .Net классов. Поможет разобраться, что делается в той или иной строке кода. Если какие-то места останутся непонятными - пиши сюда, на форум, или в личку/аську конкретно мне.

PS. Если соберёшься писать в личку, не жди ответа до 7-го мая, уезжаю в Питер и доступа на форум скорее всего иметь не буду.
kogemrka вне форума Ответить с цитированием
Старый 03.05.2010, 18:29   #9
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Чёто нифига не получается. Хотел конкретно с массивом байт мутить перестановку:

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        
        
        static void Main(string[] args)
        {
            String pass = "pass"; //объявляем любую строку
            Byte[] passByte = Encoding.Unicode.GetBytes(pass); //перекодировываем её в массив байт и получаем кодировку для формата UTF-16
            Byte[] passByteResCrypt = new Byte[passByte.Length]; //создаём второй массив размером с первый массив для их взаимодействия

            for (int i = passByte.Length; i > 0; i -= 2)//в цикле делаем так: из  112 0, 97 0, 115 0, 115 0 получаем в другом массиве: 115 0, 115 0, 97 0, 112 0 
//- то есть цифры в массиве по две переставляются.
            {
                passByteResCrypt[i - 2] = passByte[passByte.Length - i];
                passByteResCrypt[i - 1] = passByte[passByte.Length - i + 1];
            }

            pass = Convert.ToBase64String(passByteResCrypt);
            Console.WriteLine("Результат перестановки:          " + pass);

            for (int i = passByteResCrypt.Length; i > 0; i -= 2)
            {
                passByte[i - 2] = passByteResCrypt[passByteResCrypt.Length - i];
                passByte[i - 1] = passByteResCrypt[passByteResCrypt.Length - i + 1];
            }

            pass = Convert.ToBase64String(passByte);
            Console.WriteLine("Результат обратной перестановки: " + pass);
            Console.ReadKey();
        }
    }
}
В результате какая-то каша из символов и толку ноль.

Последний раз редактировалось Casper-SC; 03.05.2010 в 23:42.
Casper-SC вне форума Ответить с цитированием
Старый 03.05.2010, 18:53   #10
akasex
Форумчанин Подтвердите свой е-майл
 
Аватар для akasex
 
Регистрация: 31.03.2008
Сообщений: 179
По умолчанию

Might be helpfull
akasex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как подсчитать число дубликатов ключей в массиве vvsh PHP 2 08.02.2010 23:43
Существуют ли редакторы ключей...? Cкулаб Софт 5 30.05.2009 13:46
Удаление ключей и параметров из реестра... Altera Общие вопросы Delphi 1 06.05.2008 20:32