Консультация № 178345
12.05.2010, 15:46
0.00 руб.
0 16 1
Здравствуйте, уважаемые эксперты! Помогите мне, пожалуйста, с заданием!
1. Разработать программу, осуществляющую шифрование и расшифрование текста методом простой замены и поддерживающую ввод ключей в виде
«символ открытого текста» – «символ зашифрованного текста»
Зашифровать фразу своим личным ключом методом одиночной перестановки, сохраняя ключ и текст конфиденциальными для других
2. Разработать программу, осуществляющую шифрование и расшифрование текста методом шифра Гронсфельда, сохраняя ключ и текст конфиденциальными для других

В наиболее простом методе символы шифруемого текста заменяются другими символами, взятыми из одного (одно- или моноалфавитная подстановка) или нескольких (много- или полиалфавитная подстановка) алфавитов. Самой простой разновидностью является прямая замена, когда буквы шифруемого сообщения за¬меняются другими буквами того же самого или некоторого другого алфавита.
Для повышения стойкости шифра используют так называемые полиалфавитные подстановки, в которых для замены символов исходного текста используются символы нескольких алфавитов. Известно несколько разновидностей полиалфавитной подстановки, наиболее известными из которых являются одно- (обыкновенная и монофоническая) и многоконтурная.
При полиалфавитной одноконтурной обыкновенной подстановке для замены символов исходного текста используются несколько алфавитов, причем смена алфавитов осуществляется последовательно и циклически, т.е. первый символ заменяется соответствующим символом первого алфавита, второй — сим¬волом второго алфавита и т. д. до тех пор, пока не будут использованы все выбранные алфавиты. После этого использование алфавитов повторяется.
Частным случаем рассмотренной полиалфавитной замены является так называемая монофоническая замена. Особенность этого метода состоит в том, что количество и состав алфавитов выбираются таким образом, чтобы частоты появления всех символов в зашифрованном тексте были одинаковыми. При таком положении затрудняется криптоанализ зашифрованного текста с помощью его статистической обработки. Выравни¬вание частот появления символов достигается за счет того, что для часто встречающихся символов исходного текста предус¬матривается использование большего числа заменяющих эле¬ментов, чем для редко встречающихся.
Полиалфавитная многоконтурная замена заключается в том, что для шифрования используется несколько наборов (контуров) алфавитов используемых циклически, причем каждый контур в общем случае имеет свой индивидуальный период применения. Этот период, исчисляется, как правило, количеством знаков, после зашифровки которых меняется контур алфавитов.
Шифр Гронсфельда состоит в модификации шифра Цезаря числовым ключом. Для этого под сообщением пишут ключ. Если ключ короче сообщения, то его повторяют циклически. Шифровку получают будто в шифре Цезаря, но отсчитывая необязательно только третью букву по алфавиту, а ту, которая сдвинута на соответствующую цифру ключа. Так, применяя в качестве ключа группу из трех начальных цифр числа π, а именно 314, получаем шифровку:

сообщение с о в е р ш е н н о с е к р е т н о
Ключ 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3
шифровка ф п ж и с ь и о с с а х и л ф и у с с

Чтобы зашифровать букву сообщения С используя первую цифру ключа 3, отсчитывается третья по порядку от С в алфавите буква С-Т-У-Ф и получается буква шифровки Ф.

Обсуждение

Неизвестный
12.05.2010, 22:40
общий
Хм. Начнем с вопроса: какой Паскаль?
Неизвестный
13.05.2010, 01:43
общий
да самый обыкновенный. Turbo Pascal
Неизвестный
13.05.2010, 10:40
общий
Ну, это только начало: мы тут любопытные
А как нужно задавать ключ? Где хранить?
Варианты: запрашивать с клавиатуры, считывать из файла, передавать в командной строке?
И: имя файла шифруемого (расшифровываемого)?
И: для шифрования и расшифрования - две разные программы или одна ( с запросом "Что делать?")?
И: кодировка в исходном файле важна? Или DOS? Или ANSI (ASCII)?
давно
Академик
320937
2216
13.05.2010, 17:58
общий
Карина Комратова:
Добрый день! С заданием 2 (метод Гронсфельда) все понятно, есть пример, описан алгоритм. Задание 1 неясно. Каким все же методом шифровать? И пример, пожалуйста.
Неизвестный
13.05.2010, 19:33
общий
Boriss, Академик:
задавать ключ с клавиатуры и сообщение тоже. с Pascal я ошиблась, делать в Borland Pascal. Никаких файлов не надо. для шифрования использовать одну программу. Кодировка не важна.
lamed, Бакалавр:
напишите, пожалуйста, тогда задание 2 по примеру. К первому заданию ничего добавить не могу. Задание дано только такое. Без уточнений.
Неизвестный
13.05.2010, 21:47
общий
А я понял так, что, так называемое, первое задание - это просто вступление
Неизвестный
14.05.2010, 15:20
общий
ну может и так) тогда просто метод Гронсфельда
давно
Академик
320937
2216
14.05.2010, 21:50
общий
Карина Комратова:
Добрый вечер! Завтра после обеда будет.
Неизвестный
15.05.2010, 10:49
общий
спасибо большое!
давно
Академик
320937
2216
15.05.2010, 12:56
общий
Карина Комратова:
Добрый день! Посмотрите, пожалуйста! Сделано и проверено в ABC. Так устроит? Или через функции? Расшифрование в той же программе?
Код:
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.

Неизвестный
15.05.2010, 17:25
общий
все работает, но должно быть еще расшифрование в той же программе!
давно
Академик
320937
2216
15.05.2010, 18:58
общий
Карина Комратова:
Теперь уже только завтра.
Неизвестный
15.05.2010, 20:41
общий
хорошо!
давно
Академик
320937
2216
15.05.2010, 21:57
общий
это ответ
Здравствуйте, Карина Комратова! Шифрование/дешифрование с использованием шифра Гронсфельда. Проверял в ABC-Pascal. Процедуры и функции не использовал из методических соображений.

Код:

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
Шифрованная строка Пмссько дто, ссжеч ръдз, к сй пухдрфтю снэёес
Дешифрованная строка Окончен бой, погас очаг, и не осталось ничего

Неизвестный
16.05.2010, 15:16
общий
супер!огромное спасибо!
давно
Академик
320937
2216
16.05.2010, 15:31
общий
Карина Комратова:
Удачи!
Форма ответа