Delphi для параноика: свой PGP за 5 минут

Лозовский Александр

Xakep, номер #053, стр. 053-084-2


Переменные

Давай объявим следующее переменные:

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 и выжги в нем следующее:

Теперь уже там все предельно ясно, с каждым изменением координаты мы присваиваем очередному элементу массива случайное значение, в зависимости от координат мышки. Эту систему тебе предстоит круто усложнить, например, использовать не каждую координату, а каждую 15-ю. Случайным образом :).

Шифруемся!

С этого момента можно отключать свои мозги от сети, они уже не понадобятся, т.к. все остальное компонент сделает сам. Нам останется только сказать ему, откуда брать ключи и что делать (шифровать или расшифровывать, что определяется RadioButton’ами). Да что тут говорить, посмотри сам на кнопку Start (она же пуск :)).

Вот так. Объясняю дальше. Бери строчку из Memo1 и шифруй ее ключом из Edit2. И наоборот :). При таком упрощении юзеров на планете вообще скоро не останется - все ринутся кодить. Посмотри на результат шифрования:

Заметил, что он намного больше оригинала? Это не глюк, а суровая реальность асимметричных алгоритмов. Размер шифрованного текста больше оригинала, причем зависит это от длины ключа.

Назад на стр. 053-084-1  Содержание  Вперед на стр. 053-084-3