Перейти к содержанию

Метод шифрования гаммированием заключается в следующем: пусть имеется сообщение, записанное с помощью букв латинского алфавита, и задана строка-ключ (строка без пробелов и знаков препинания, записанная прописными буквами), в дальнейшем будем называть её гаммой

Метод шифрования гаммированием заключается в следующем: пусть имеется сообщение, записанное с помощью букв латинского алфавита, и задана строка-ключ (строка без пробелов и знаков препинания, записанная прописными буквами), в дальнейшем будем называть её гаммой. Сопоставим буквам латинского алфавита числа 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.