Cвой PGP на Delphi

Сегодня нас ждет поистине Х-кодинг, а именно написание собственной крипто-проги, умеющей шифровать текст по принципу открытого ключа. Если ты уже напуган размерами исходников pgp (которые лень читать даже пробитым юниксоидам), я тебя успокою. Дело в том, что добрые капиталисты из tsm inc написали для нас совершенно бесплатный компонент, реализующий функции rsa алгоритма, который, собственно, сейчас и является стандартом асимметричного шифрования. Так что за размер кода можешь не беспокоиться, он будет неприлично маленьким и вместе с тем полноценным. Т.е. наша с тобой прога будет уметь все, как и ее старшие братья. А именно - генерить ключи, шифровать и расшифровывать. Прежде чем взяться за кодинг, нам придется припомнить пару теоретических моментов: 1) Шифрование информации производится при помощи public key, а расшифровка - private key. Первый может находиться у кого угодно (поскольку способен только шифровать), второй - только у того, кому пишут. Его надо беречь как девственность. Длина ключа может быть 512, 1024 и 2048 бит. В нашем примере я буду использовать 1024-битный ключ, поскольку меньшая длина уже давно считается отстоем, а 2048 слишком долго вычисляется моим компом. 2) Математической основой алгоритма являются 2 больших простых числа - p и q. Они настолько большие, что разработчики компонента (который мы сегодня будем использовать) ввели тип bignum. Подробнее я расскажу о нем ниже. Следовательно, автоматическая генерация ключа для нас будет заключаться именно в нахождении p и q. Остальное компонент сделает сам. И это правильно. Как говорил мой преподаватель труда, "пусть работают механизмы". Правда, он еще считал, что ананасы растут на деревьях, но рабочему человеку это простительно. РеквизитСрочно беги на http://www.crypto-central.com/software/freeware/rsa_free.zip и качай компонент. Если при появлении надписи "download complete" твои руки (как это обычно происходит со мной) приходят в сильное возбуждение и запускают инсталляцию загруженного, то уйми их. Потому что этого мало, надо еще зайти на http://www.crypto-central.com/cgi-bin/freeform.exe. Там, после заполнения простенькой формы (размер лифчика и годовой доход там не спрашивают, достаточно электронного адреса, имени и источника, откуда ты о них узнал) тебе на e-mail сваливается индивидуальный код для инсталляции. Можно, правда, ничего не заполнять, потому что я уже это сделал до тебя и получил вот что: hjkdl9l3s0s[39s3fm3. Это код для бесплатной версии. Ладно, теперь можно дать волю рукам и запустить инсталляцию - она сама найдет твой дельфи и положит в компоненты новую закладку - "crypto", содержащую компонент "rsa". Поэтому срочно кидай его на форму, и займемся программированием. КодингНам понадобится следующее: 2 edit, 2 кнопки, 2 radiobutton (тоже лежит в закладке standard), 1 progressbar, 2 memo или richedit - кому что нравится. Переменные. Давай объявим следующее переменные:

pq, pp: bignum;
nado: boolean;
i, length: integer;
fromt, tot: string;
Тут pq и pp - это p и q, о которых я говорил в начале, nado - определяет, надо ли создавать ключ, i и length - нужны для генерации ключа, fromt - исходная строка (для шифровки или расшифровки), tot - конечный текст. Ключики. С переменными все ясно, давай разберемся с генерацией ключа. Дело в том, что p и q, о которых я говорю уже в третий раз, в сущности представляют собой массивы из 32-битных чисел (следовательно, каждый элемент может принимать значение до $ffffffff), а длина самого массива будет зависеть от длины ключа и определяться переменной length. Поэтому все, что нам надо, это присвоить значение каждому элементу p и q, а затем вычислить ключи командой makekeypair. Можно, конечно, присвоить просто случайные значения, используя генератор псевдослучайных чисел от дельфи, как нас и учили в школе, но тут тебя может ждать облом. Числа, которые он выдает, очень предсказуемы, а потому делают наш ключ слишком уязвимым. Из-за этого, кстати, многие компоненты содержат свой генератор чисел, эффективность которых тоже вызывает сомнение. Потому мы и пойдем путем pgp - будем использовать координаты мышки (в случайности которых сомневаться не приходится) - т.е. для генерации ключа мы попросим юзера покрутить мышкой, вызывая таким образом событие mousemove, и будем использовать постоянно меняющиеся координаты как основу. Итак, начнем с соответствующей кнопки, которая называется "Сгенерировать ключ". Вот что представляет собой ее онклик:
nado:= true; i:=0;
length:= rsa1.getprecision;
progressbar1.min:=0;
progressbar1.max:=length-1;
Тут я засвидетельствую надобность и инициализируюсь, плюс расставлю минимальное и максимальное значения прогрессбара. Теперь самое интересное - создай для формы событие tform1.formmousemove и выжги в нем следующее:
procedure tform1.formmousemove(sender: tobject; shift: tshiftstate; x,
y: integer);
begin
if nado= true then //Поехали
begin
if i= length-1 then //Да ведь мы все заполнили...
begin
rsa1.makekeypair(pp, pq); //Образуем ключ
nado:= false; //И уже ничего не надо
edit1.text:= rsa1.privatekey; //Отобразим найденное
edit2.text:= rsa1.publickey;
end else //Ах, не заполнили? Исправим
begin
pp.contents:= x*y*random($ffff); //Координаты умножаем на случайность
pq.contents:= x*y*y*random($ffff);
progressbar1.position:=i; //Увеличим прогресс :)
inc(i); //Перейдем к следующему элементу, увеличим i
end;
end;
end;
procedure tform1.bitbtn1click(sender: tobject);
begin
if radiobutton1.checked then //Надо шифровать?
begin
fromt:= memo1.text; //Исходная строка
rsa1.publickey:= edit2.text; //Ключ
rsa1.encryptstring(fromt, tot); //Зашифровали
memo2.text:= tot; //Вывели конечный текст
end else //Ах, не шифровать? Тогда наоборот
begin
rsa1.privatekey:= edit1.text;
fromt:= memo2.text;
rsa1.decryptstring(fromt, tot);
memo1.text:= tot;
end;
end;
Теперь уже там все предельно ясно, с каждым изменением координаты мы присваиваем очередному элементу массива случайное значение, в зависимости от координат мышки. Эту систему тебе предстоит круто усложнить, например, использовать не каждую координату, а каждую 15-ю. Случайным образом. ШифруемсяС этого момента можно отключать свои мозги от сети, они уже не понадобятся, т.к. все остальное компонент сделает сам. Нам останется только сказать ему, откуда брать ключи и что делать (шифровать или расшифровывать, что определяется radiobutton?ами). Да что тут говорить, посмотри сам на кнопку start (она же пуск). Вот так. Объясняю дальше. Бери строчку из memo1 и шифруй ее ключом из edit2. И наоборот. При таком упрощении юзеров на планете вообще скоро не останется - все ринутся кодить. Посмотри на результат шифрования. Заметил, что он намного больше оригинала? Это не глюк, а суровая реальность асимметричных алгоритмов. Размер шифрованного текста больше оригинала, причем зависит это от длины ключа. Ну все, с этого момента можешь считать, что свой pgp у тебя уже есть. Ключи его полностью совместимы с другими реализациями rsa алгоритма. На этой торжественной ноте ваш непокорный спешит откланяться и сообщить, что на все вопросы (жалобы, предложения, тупой флейм, etc) он с удовольствием ответит по электронной почте.Источник: http://www.xakep.ru/

А не боитесь, что добрые капиталисты не зря сделали бесплатный компонент? Учитывая закрытые исходные коды самого pgp-sdk - это настораживает. те же, кто ленятся читать исходники - тех не заботит шифрование

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...