Метод шифрования гаммированием заключается в следующем: пусть имеется сообщение, записанное с помощью букв латинского алфавита, и задана строка-ключ (строка без пробелов и знаков препинания, записанная прописными буквами), в дальнейшем будем называть её гаммой. Сопоставим буквам латинского алфавита числа A→ 0, B→ 1, . . .Z→ 25.
Шифрование сообщения осуществляется посимвольно путём сложения букв (имеется в виду соответствующих им чисел) сообщения и гаммы, затем берётся остаток от этой суммы по модулю 26 и осуществляется обратное преобразование числа в букву.
Причём, если гамма меньшей длины, чем сообщение, то она продолжается периодически до нужной длины; если гамма имеет большую длину, чем сообщение, то берётся последовательность необходимой длины из её первых букв.
Требуется написать программу, которая читает сообщение из файла message.txt, шифрует его, используя введённую с клавиатуры гамму, и сохраняет результат в файле cipher.txt.
Замечания:
1) При шифровании сообщения в нём игнорируются пробелы и знаки препинания, а также все буквы переводятся в прописные.
2) Можно считать, что сообщение и гамма кодируются в формате ASCII. 3) Длина гаммы не превышает 50 символов.
Пример: Сообщение «I am happy!», гамма «NOT», тогда сообщение преобразуем к виду «IAMHAPPY», продолжим гамму «NOTNOTNO» и после шифрования получим «VOFUOICM».
Программа на языке PascalABC 1.8. Программа эффективна по времени и по памяти.
var i, k, l, n, o, p:integer; c:char;
cipher, gamma:string;
fin, fout:text;
begin
assign(fin, ’c:message.txt’);
assign(fout, ’c:cipher.txt’);
reset(fin);
writeln(’Vvedite kluch:’);
readln(gamma);
l:=length(gamma);
for i:= 1 to l do
gamma[i]:=upcase(gamma[i]);
i:=1;
cipher:=’’;
repeat
read(fin, c);
if (c>=’a’) and (c<=’z’) or (c>=’A’)
and (c<=’Z’) then
begin
c:=upcase(c);
k:=ord(c)- ord(’A’);
n:=ord(gamma[i])-ord(’A’);
o:=(k+n) mod 26;
p:= o+ord(’A’);
cipher:=cipher+chr(p);
if i=l then i:=1 else i:=i+1;
end;
until eof(fin);
close(fin);
rewrite(fout);
writeln(fout, cipher);
close(fout);
writeln(cipher);
end.