0% нашли этот документ полезным (0 голосов)
27 просмотров6 страниц

Vijener

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

Загружено:

Nazaket Qasimova
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
27 просмотров6 страниц

Vijener

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

Загружено:

Nazaket Qasimova
Авторское право
© © All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате DOCX, PDF, TXT или читать онлайн в Scribd
Вы находитесь на странице: 1/ 6

program Vigenere;

uses
System.SysUtils, Winapi.Windows;

const
cmGronsfeld: Byte = 1;
cmShiftedAtbash: Byte = 2;
cmDecrypt: Byte = 4;

YesNo: array[Boolean] of string = ('нет', 'да');

var
log: TStringBuilder;

function VigenereCrypt(m, k: string; mode: Byte = 0): string;


const
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //Строка алфавита
var
maxLength, i, mi, ki, ix: Integer;
r, ki_s, c: string;
gronsfeld, shiftedAtbash, decrypt: Boolean;
begin
//(encrypt/decrypt) for "Gronsfeld" + "Vigenere" + "Beaufort" + "Shifted
Atbash"
//m - сообщение или шифротекст (может быть и ключ, если шифр Бофора),
//k - ключ (или сообщение/шифротекст, если шифр Бофора),
//mode - режим:
// Шифрование: "encrypt" (по умолчанию),
// Дешифрование: "decrypt" (mode === 'decrypt'),
// Шифрование-дешифрование по таблице сдвинутого атбаша: (mode =
cmShiftedAtbash)
// Извлечение цифр из ключа шифра Гронсфельда: "gronsfeld" или
"gronsfeld_encrypt", "gronsfeld decrypt".
maxLength := m.Length;
if k.Length > maxLength then maxLength := k.Length;
Result := ''; //Пустой результат
gronsfeld := (mode and cmGronsfeld) > 0;
shiftedAtbash := (mode and cmShiftedAtbash) > 0;
decrypt := (mode and cmDecrypt) > 0;
for i := 0 to maxlength-1 do begin //encrypt/decrypt
//Vigenere - encrypt/decrypt one forumula (encrypt - by
default; decrypt - when (cmDecrypt is in mode) )
//подгон сообщения/шифротекста - к ключу (если меньше)
if i >= m.length then ix := i mod m.Length else ix := i;
mi := a.IndexOf(m[ix + 1]);
if i >= k.length then ix := i mod k.Length else ix := i;
ki_s := k[ix + 1];
//подгон ключа к сообщению/шифротексту (если короткий)
if gronsfeld then ki := ki_s.ToInteger() else ki := a.IndexOf(ki_s);
//вычитание при дешифровании, либо сложение.
if decrypt then ki := ki * -1;
c := a[((a.Length + mi + ki) mod a.Length) + 1]; //символ по
таблице Виженера.
if shiftedAtbash then c := a[a.Length - a.IndexOf(c)]; //Атбаш символа
или символ.
Result := Result + c; //Добавить символ к результату.
end;
end;

function GronsfeldToVigenere(GfKey: string): string;


const
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //Строка алфавита
var
i: Integer;
begin
Result := '';
for i := 1 to Length(GfKey) do
Result := Result + a[StrToInt(GfKey[i]) + 1];
end;

function VigenereToGronsfeld(VgKey: string): string;


const
a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //Строка алфавита
var
i: Integer;
begin
Result := '';
for i := 1 to Length(VgKey) do
Result := Result + IntToStr(a.indexOf(VgKey[i])); //2015
end;

procedure GronsfeldTest();
const
MSG = 'GRONSFELD';
KEY = '2015';
TXT = '1. Шифр Гронсфельда (Урезанная версия шифра Виженера c цифровым
ключом):'#13#10+
'Сообщение:'#9'"%s"'#13#10+
'Ключ:'#9#9'"%s"'#13#10+
'Шифрование:'#9'"%s" (должно быть "IRPSUFFQF")'#13#10+
'Дешифрование:'#9'"%s" (должно быть "%s")'#13#10+
'Совпадает:'#9'%s'#13#10;
var
crypted, decrypted: string;
begin
//1. Шифр Гронсфельда. (Урезанная версия шифра Виженера).
//Параметры: m - сообщение/шифротекст, k - ключ (только цифры), mode -
"encrypt/decrypt"

crypted := VigenereCrypt(MSG, KEY, cmGronsfeld); //выдаст IRPSUFFQF - шифр


Гронсфельда
decrypted := VigenereCrypt(crypted, KEY, cmGronsfeld or cmDecrypt);
//выдаст GRONSFELD - из шифра Гронсфельда

log.AppendFormat(TXT, [MSG, KEY, crypted, decrypted, MSG, YesNo[decrypted =


MSG]]);
end;

procedure VigenereToGronsfeldTest();
const
GKEY = '2015';
TXT = #13#10'2. Конвертация ключа Гронсфельда в ключ Виженера:'#13#10+
'Gronsfeld key: "%s" >>> Vigenère key: "%s" и назад: "%s"'#13#10;
var
GronsfeldKey2: string;
VigenereKey: string;
begin
//2. Также, вместо цифр, в шифре Гронсфельда - возможно и указание букв.
//Тогда, шифром Гронсфельда будет обычный шифр Виженера, но с ограничением
символов на ключ.
//Например, при всех возможных цифрах в ключе "0123456789", ключ может быть
только из букв "ABCDEFGHIJ"
//Получить его можно так:
VigenereKey := GronsfeldToVigenere(GKEY); //CABF
//И наоборот:
GronsfeldKey2 := VigenereToGronsfeld(VigenereKey); //2015

log.AppendFormat(TXT, [GKEY, VigenereKey, GronsfeldKey2]);


end;

procedure GronsfeldAsVigenereTest();
const
MSG = 'GRONSFELD';
KEY = 'CABF';
TXT = #13#10'3. Шифр Гронсфельда - с ключом Виженера, по таблице
Виженера:'#13#10+
'Сообщение:'#9'"%s"'#13#10+
'Ключ:'#9#9'"%s"'#13#10+
'Шифрование:'#9'"%s" (должно быть "IRPSUFFQF")'#13#10+
'Дешифрование:'#9'"%s" (должно быть "%s")'#13#10+
'Совпадает:'#9'%s'#13#10;
var
crypted, decrypted: string;
begin
//3. Тогда шифрование-дешифрование шифра Гронсфельда - есть работа с шифром
Виженера:

crypted := VigenereCrypt(MSG, KEY); //выдаст IRPSUFFQF - шифр Бофора


decrypted := VigenereCrypt(crypted, KEY, cmDecrypt); //выдаст GRONSFELD -
из шифра Бофора.

log.AppendFormat(TXT, [MSG, KEY, crypted, decrypted, MSG, YesNo[decrypted =


MSG]]);
end;

procedure VigenereFullTest();
const
MSG = 'ATTACKATDAWN'; //Сообщение
KEY = 'LEMON'; //Ключ
TXT = #13#10'4. Шифр Виженера (полная версия):'#13#10+
'Сообщение:'#9'"%s"'#13#10+
'Ключ:'#9#9'"%s"'#13#10+
'Шифрование:'#9'"%s" (должно быть "LXFOPVEFRNHR")'#13#10+
'Дешифрование:'#9'"%s" (должно быть "%s")'#13#10+
'Совпадает:'#9'%s'#13#10;
var
crypted, decrypted: string;
begin
//4. Шифр Виженера (полная версия):
//Параметры: m - сообщение/шифротекст, k - ключ, mode - "encrypt"/"decrypt"

crypted := VigenereCrypt(MSG, KEY); //выдаст LXFOPVEFRNHR - шифр Виженера


decrypted := VigenereCrypt(crypted, KEY, cmDecrypt); //выдаст ATTACKATDAWN
- из шифра Виженера

log.AppendFormat(TXT, [MSG, KEY, crypted, decrypted, MSG, YesNo[decrypted =


MSG]]);
end;

procedure BeaufortTest();
const
MSG = 'ATTACKATDAWN'; //Сообщение
KEY = 'LEMON'; //Ключ
TXT = #13#10'5. Шифр Бофора (в талбице - атбаш по строкам):'#13#10+
'Сообщение:'#9'"%s"'#13#10+
'Ключ:'#9#9'"%s"'#13#10+
'Шифр Бофора по таблице Виженера:'#13#10+
'Шифрование:'#9'"%s" (должно быть "LLTOLBETLNPR")'#13#10+
'Дешифрование:'#9'"%s" (должно быть "%s")'#13#10+
'Совпадает:'#9'%s'#13#10;
var
crypted, decrypted: string;
begin
//5. Шифр Бофора - через шифр Виженера (там другая таблица и шифротекст -
сдвинутый атбаш по строкам).
//Параметры: m - ключ, k - сообщение/шифротекст, mode - 'decrypt' (только
дешифрование)
//Особенность шифра Бофора - в том, что дешифрование представляет из себя
повторное шифрование шифротекста - тем же ключом.
//То есть - одна и та же операция.

crypted := VigenereCrypt(KEY, MSG, cmDecrypt); //выдаст LLTOLBETLNPR - шифр


Бофора
decrypted := VigenereCrypt(KEY, crypted, cmDecrypt); //выдаст ATTACKATDAWN
- из шифра Бофора.

log.AppendFormat(TXT, [MSG, KEY, crypted, decrypted, MSG, YesNo[decrypted =


MSG]]);
end;

procedure ShiftedAtbashTest();
const
MSG = 'ATTACKATDAWN'; //Сообщение
KEY = 'LEMON'; //Ключ
TXT = #13#10'6. Сдвинутый атбаш (в таблице атбаш, сдвинутый и по строкам и
по столбцам):'#13#10 +
'Сообщение:'#9'"%s"'#13#10 +
'Ключ:'#9#9'"%s"'#13#10 +
'Сдвинутый атбаш - шифрование по таблице Виженера:'#9'"%s" (должно
быть "OCULKEVUIMSI")'#13#10 +
'Тест коммутативности замены:'#9'"%s" (должно быть
"OCULKEVUIMSI")'#13#10 +
'Сдвинутый атбаш - дешифрование по таблице Виженера:'#9'"%s" (должно
быть "ATTACKATDAWN")'#13#10 +
'Тест коммутативности замены:'#9'"%s"'#13#10 +
'Сравнение с сообщением:'#9'%s'#13#10 +
'Коммутативность замены:'#9'%s';
var
csaMK, csaKM, csaKMK, csaKKM: string;
begin
//6. Сдвинутый атбаш - через шифр Виженера (там другая таблица и шифротекст
- атбаш, сдвинутый и по строкам по столбцам).
//Параметры: m или k - сообщение/шифротекст и ключ (или наоборот), mode -
cmShiftedAtbash (только encrypt + атбаш к результату)
//Мало того, что одна и та же операция (дешифрование - есть шифрование
шифротекста), но к тому же она ещё и коммутативна.
//То есть, здесь, n-ные буквы (сообщения/шифротекста) и ключа - могут быть
поменяны местами, давая тот же результат.
//Именно этим, сдвинутый атбаш - и приближается к шифру Вернама,
//так как при дешифровании шифром Вернама - операции XOR не важно где
именно байты ключа, а где - байты шифротекста.

csaMK := VigenereCrypt(MSG, KEY, cmShiftedAtbash); //выдаст OCULKEVUIMSI -


шифр сдвинутого атбаша.
csaKM := VigenereCrypt(KEY, MSG, cmShiftedAtbash); //То же самое, не важно
где ключ, а где сообщение.
csaKMK := VigenereCrypt(csaKM, KEY, cmShiftedAtbash); //выдаст ATTACKATDAWN
- из шифра сдвинутого атбаша.
csaKKM := VigenereCrypt(KEY, csaKM, cmShiftedAtbash); //То же самое, не
важно где ключ, а где шифротекст.

log.AppendFormat(TXT, [MSG, KEY, csaMK, csaKM, csaKMK, csaKKM,


YesNo[csaKKM = MSG], YesNo[(csaMK = csaKM) and (csaKMK = csaKKM)]]);
end;

begin
log := TStringBuilder.Create();
try
//Тесты:
GronsfeldTest();
VigenereToGronsfeldTest();
GronsfeldAsVigenereTest();
VigenereFullTest();
BeaufortTest();
ShiftedAtbashTest();
MessageBoxW(GetDesktopWindow(), PWideChar(log.ToString()), 'Vigenère',
0);
finally
log.Free();
end;
end.

Вам также может понравиться