= raquo ;; :=1; i:=1 to length (TXT) do:=TMP + Chr (Ord (TXT [i]) xor Ord (PSW [NS]));:=NS + 1; NS gt; length (PSW) then NS:=1; ;:=TMP; ;
Команда шифрування
TForm1.Button5Click (Sender: TObject) ;. Text:=TXT_XOR (Edit1.Text, Memo1.Text) ;;
Команда дешифрування
TForm1.Button6Click (Sender: TObject) ;. Text:=TXT_XOR (Edit1.Text, Memo2.Text) ;;
При перевірці роботи функції (зашифрувала і розшифрувала текст, змінюючи пароль) помилок не виявилося.
. Модель шифрувальної машини ЕНІГМА
Особливістю алгоритму ЕНІГМА є зрушення поточного символу на значення деякої функції, залежною від позиції символу в тексті (рядку тексту). У нашій роботі ми застосовували функцію зсуву f (x, i)=(Kx * i) ^ 2, де i - порядковий номер символу в рядку, Kx - множник (непарне число=0, 1, 3, 5, 7, ..., n).
В якості алгоритму шифрування виступав алгоритм Цезаря із змінним кроком заміни.
Шифрування по таблиці ASCII
, (1)
Дешифрування по таблиці ASCII
. (2)
Примітка: При Kx=0 шифрування і дешифрування відбуватися не будуть, так як Ci=Ti + 0 (mod 256) і Ti=Ci - 0 (mod 256).
Для роботи ми використовували компоненти SpinEdit (множник), три компонента Memo 1,2,3 (відкритий текст, шифрограма, дешифрований текст) і дві кнопки Button (1 - шифрувати, 2 - дешифрувати). (розташували їх наступним чином: дивитися малюнок нижче)
Рис. 3. Розташування компонентів у формі
Нижче наводиться універсальна функція шифрування і дешифрування тексту за описаним алгоритмом. Вхідними параметрами функції є: - текст або криптограма, Kx - множник зсуву та Encrupt - прапор виду операції (true - шифрування, false - дешифрування. Результатом роботи функції є текст або криптограма.
декларувати функції
{Private declarations} EnDeCrupt (Tx: String; Kx: Integer; Encrupt: boolean): String;
Тіло функції
TForm1.EnDeCrupt (Tx: String; Kx: Integer; Encrupt: boolean): String ;: integer ;: String;:= raquo ;; i:=1 to Length (Tx) do Encrupt=true then:=X + Chr ((Ord (Tx [i]) + Round (SQR (i * Kx))) mod 256):=X + Chr ((Ord (Tx [i]) - Round (SQR (i * Kx))) mod 256);:=X; ;
Команда шифрування
TForm1.Button1Click (Sender: TObject) ;. Text:=EnDeCrupt (Memo1.Text, SpinEdit1.Value, true) ;;
Команда дешифрування
TForm1.Button2Click (Sender: TObject) ;. Text:=EnDeCrupt (Memo2.Text, SpinEdit1.Value, false) ;;
Виконала шифрування і дешифрування тексту при різних значеннях множника.
4. Алгоритм рекурсивного обчислення найбільшого загального дільника
Рекурсивними процедурами (recursive procedure) називаються процедури, що викликають самі себе.
Найбільшим спільним дільником (greatest common divisor, GCD) двох чисел називається найбільше ціле, на яке діляться два числа без залишку. Наприклад, найбільший спільний дільник чисел 12 і 9 дорівнює 3. Два числа називаються взаємно простими (relatively prime), якщо їх найбільший спільний дільник дорівнює 1.
Математик Ейлер, що жив у вісімнадцятому столітті, виявив цікавий факт:
Якщо A остачі ділиться на B, то GCD (A, B)=A
Інакше GCD (A, B)=GCD (B Mod A, A).
Цей факт можна використовувати для швидкого обчислення найбільшого загального дільника.
Наприклад:
(9, 12)=GCD (12 Mod 9, 9)
GCD (3, 9)=3
На кожному кроці числа стають все менше, оскільки 1 lt;=B Mod A lt; A, якщо A не ділиться на B остачі. У міру зменшення аргументів, врешті-решт, A прийме значення 1. Так як будь-яке число ділиться на 1 остачі, на цьому кроці рекурсія зупиниться. Таким чином, в якийсь момент B розділиться на A без остачі, і робота процедури завершиться.
Відкриття Ейлера закономірним чином призводить до рекурсивному алгоритмом обчислення найбільшого загального дільника.
Для виконання роботи використовувала два компоненти SpinEdit і командна кнопка Button (рис. 4).
Рис. 4
Декларування функції
{Private declarations} GCD (A, B: integer): Integer;
Тіло функції
TForm1.GCD (A, B: integer): Integer; B Mod A=0 Then:=A:=GCD (B mod A, A); ;
Команда виклику функції
TForm1.Button1Cli...