Лабораторная работа № 2
«Шифрование с помощью перестановок»
В шифре Виженера ключ задается набором из d символов. Шифрование сообщения заключается в следующем . Заданный набор (ключ) подписываются с повторением под сообщением и коды символов этих последовательностей складываются по модулю М, где М - длина алфавита. Если используются только буквы, то каждая буква , например, латинского алфавита нумеруется от А = 0 до Z = 25. Таким образом, выходное сообщение будет содержать коды символов :
ei = si+ki (mod М),
где si - код символа исходного сообщения, ki - код символа ключа.
Повторное применение двух или более шифров Виженера называется составным шифром Виженера. Шифрование осуществляется по формуле:
ei = si + ki + li + ... + pi (mod M),
где ki,li,...,pi могут иметь различные периоды. Период их суммы , как и в составной транспозиции, будет наименьшим общим кратным отдельных периодов. Если используется шифр Виженера с неограниченным неповторяющимся ключом, то это шифр Вернама, в котором также
ei = si + ki (mod M),
но ki выбираются случайно и независимо среди чисел 0, 1,..., M.
Ход работы
С помощью программы VIGIN.exe зашифрован файл D2.doc ключом Dsco7fpcmu и получен файл D2_s.doc. С помощью этого же ключа расшифрован зашифрованный файл D2_s.doc, получив D2_sh.doc.
Листинг программы
program VIGIN; {программа шифрования по вижинеру}
uses WinCrt,Windos;
var
i,j,k,m:integer;
f1,f2:file;
numf1,numf2:string;
nr,nw:word;
buf1,buf2:array[1..2048]of char;
bf:char;
kluch:array[1..10] of char;
begin
{$I-}
writeln(' программа шифрования файла по вижинеру ');
writeln('введите имя шифруемого файла ');
readln(numf1);
assign(f1,numf1); readln;
reset(f1,1);
writeln('файл открыт');
writeln('введите имя зашифрованного файла');
readln(numf2);
assign(f2,numf2); readln;
rewrite(f2,1);
writeln('введите ключ – строку из десяти символов');
for i:=1 to 10 do kluch[i]:=readkey;
writeln;writeln('ваш ключ ');
for i:=1 to 10 do write(kluch[i]);
writeln;
repeat
blockread(f1,buf1,sizeof(buf1),nr);
for i:=1 to nr div 10 do
begin
for j:=1 to 10 do
begin
k:=10*(i-1)+j;
m:=(ord(buf1[k])+ord(kluch[j])) mod 256;
buf2[k]:=chr(m);
end;
end;
blockwrite(f2,buf2,nr,nw);
until (nr=0) or (nw<>nr);
close(f1);
close(f2);
writeln('файл зашифрован')
{$I+}
end.