program p178345;
{ Шифр Гронсфельда состоит в модификации шифра Цезаря числовым ключом.
Для этого под сообщением пишут ключ. Если ключ короче сообщения, то
его повторяют циклически. Шифровку получают будто в шифре Цезаря, но
отсчитывая необязательно только третью букву по алфавиту, а ту, которая
сдвинута на соответствующую цифру ключа. Так, применяя в качестве
ключа группу из трех начальных цифр числа PI, а именно 314, получаем шифровку:
сообщение с о в е р ш е н н о с е к р е т н о
Ключ 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3
шифровка ф п ж и с ь и о с с а х и л ф и у с с
Чтобы зашифровать букву сообщения С используя первую цифру ключа 3, отсчитывается
третья по порядку от С в алфавите буква С-Т-У-Ф и получается буква шифровки Ф.
}
const
n=4;
ABC: array[1..n] of string =
('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz',
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя');
var
s1, s2, key, AdoptedKey: string;
i, j, StrLen, KeyLen: integer;
shift: integer;
OldPos, NewPos: integer;
begin
write('Открытый текст ');
readln(s1);
write('Ключ ');
readln(key);
// Получение ключа длиной, равной длине строки текста
StrLen := length(s1);
KeyLen := length(key);
if (KeyLen >= StrLen) then
AdoptedKey := copy(key,1,StrLen)
else // Ключ короче шифруемой строки
begin
AdoptedKey := '';
for i:= 1 to StrLen div KeyLen do
AdoptedKey := AdoptedKey+key;
AdoptedKey := AdoptedKey + Copy(key,1,StrLen mod KeyLen);
end;
writeln(AdoptedKey);
// Шифрование
s1:= '';
for i:= 1 to StrLen do
begin
for j:= 1 to n do
begin
OldPos := pos(s1[i], ABC[j]);
if OldPos>0 then
break;
end;
if OldPos>0 then
begin
shift := ord(AdoptedKey[i])-ord('0');
NewPos := 1+(OldPos+shift-1) mod length(ABC[j]);
s2 := s2+ABC[j][NewPos];
end
else
s2 := s2+s1[i];
end;
writeln(s2);
end.
program p178345;
{ Шифр Гронсфельда состоит в модификации шифра Цезаря числовым ключом.
Для этого под сообщением пишут ключ. Если ключ короче сообщения, то
его повторяют циклически. Шифровку получают будто в шифре Цезаря, но
отсчитывая необязательно только третью букву по алфавиту, а ту, которая
сдвинута на соответствующую цифру ключа. Так, применяя в качестве
ключа группу из трех начальных цифр числа PI, а именно 314, получаем шифровку:
сообщение с о в е р ш е н н о с е к р е т н о
Ключ 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3
шифровка ф п ж и с ь и о с с а х и л ф и у с с
Чтобы зашифровать букву сообщения С используя первую цифру ключа 3, отсчитывается
третья по порядку от С в алфавите буква С-Т-У-Ф и получается буква шифровки Ф.
}
const
n=4;
ABC: array[1..n] of string =
('ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz',
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя');
var
s1, s2, s3, key, AdoptedKey: string;
i, j, StrLen, KeyLen: integer;
shift: integer;
OldPos, NewPos: integer;
begin
write('Открытый текст ');
readln(s1);
write('Ключ ');
readln(key);
// Получение ключа длиной, равной длине строки текста
StrLen := length(s1);
KeyLen := length(key);
if (KeyLen >= StrLen) then
AdoptedKey := copy(key,1,StrLen)
else // Ключ короче шифруемой строки
begin
AdoptedKey := '';
for i:= 1 to StrLen div KeyLen do
AdoptedKey := AdoptedKey+key;
AdoptedKey := AdoptedKey + Copy(key,1,StrLen mod KeyLen);
end;
writeln(AdoptedKey);
// Шифрование
s2:= '';
for i:= 1 to StrLen do
begin
for j:= 1 to n do
begin
OldPos := pos(s1[i], ABC[j]);
if OldPos>0 then
break;
end;
if OldPos>0 then
begin
shift := ord(AdoptedKey[i])-ord('0');
NewPos := 1+(OldPos+shift-1) mod length(ABC[j]);
s2 := s2+ABC[j][NewPos];
end
else
s2 := s2+s1[i];
end;
writeln('Шифрованная строка ',s2);
// ДеШифрование
s3:= '';
for i:= 1 to StrLen do
begin
for j:= 1 to n do
begin
OldPos := pos(s2[i], ABC[j]);
if OldPos>0 then
break;
end;
if OldPos>0 then
begin
shift := ord(AdoptedKey[i])-ord('0');
NewPos := 1+(OldPos+length(ABC[j])-shift-1) mod length(ABC[j]);
s3 := s3+ABC[j][NewPos];
end
else
s3 := s3+s2[i];
end;
writeln('Дешифрованная строка ', s3);
end.
Открытый текст Окончен бой, погас очаг, и не осталось ничего
Ключ 123456
123456123456123456123456123456123456123456123
Шифрованная строка Пмссько дто, ссжеч ръдз, к сй пухдрфтю снэёес
Дешифрованная строка Окончен бой, погас очаг, и не осталось ничего
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.