|
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. И наоборот :). При таком упрощении юзеров на планете вообще скоро не останется - все ринутся кодить. Посмотри на результат шифрования: Заметил, что он намного больше оригинала? Это не глюк, а суровая реальность асимметричных алгоритмов. Размер шифрованного текста больше оригинала, причем зависит это от длины ключа. |