Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 16
1

Криптографическая атака на шифр Виженера

21.12.2015, 14:58. Показов 6743. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, если сможете!!!!!!!Пожалуйста!!!!!!!
Расшифруйте следующее сообщение: «ХЯХХ ДРЛХХЯ –
АРНЧЮЭШВЯ СБЗПХ ЁЪРПОВБ РРЗГК, ВЖНЦТОЮХВ ЦАФУМДЫНЯ
ШЬЕГЕС. АРЪДЖФТУЯ МТ ГЙЁУФТРРЗЫ ДЦЗЯ-ЦОМСЗАВПДЁЪ
РВЙНАР. МЩЗЭЬ ГЕПШГ ЦЧСС НВЧЯЮЯ ХЪНЛ КВТТАМ.
ТХКНАПИД ФХХНЛЩЫ СРНЫВЪДЖФТ РТ НУЩРСРЪГР СМЧУЕ,
ЕСЦРЭВЯРЙЙШС ООТУ НЕ АНАГ ПО УАЛБУУ ДФЩОДАМЫП. ЬЪУРЗ ОАРДЩЖ ЦЗЧУЧИ ОГЯЪДЖФТ ЕРЯАЩЫХ УЪСУИЗ Ы
ЫЕЭГБСФАМТ. УУЁГ МЕНУФТ АХЪЖЭТВВКЧЮЕ ЩЕЯМБ
ВДГИНГГШИ Д ВЗЦХ ТЪТЬАДИКОЮАК ТФРВМЗЦ –
ЯЦЗУЪКРНДЙЮУЯ Ф ЭЕДЕПТ ТУЖХЪЧПОИ Ы ШЕЕГПНРЙ
АЧЬШКСХ, ПРЧСЫ ЯЧЧЗЭНР ПЯЦРГОЛШИ ПА РЧТЙЁ Н
ЛКМЕЛДЫУВЦ ЧЕЁНЗЭД Н ЕСЭТЖПДАЮУ ЖРФЖВЮШЫЭНЖВ Ц
ЮЕУ, Б ДГУЁСЩУ МАСЁЮЦАСОО НЕГАЩПХ.». Для автоматизации
процесса можно разработать программу, реализующую криптоанализ
шифра Виженера, а также использовать средства статистической обработки
информации.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2015, 14:58
Ответы с готовыми решениями:

Криптографическая атака на шифр Венжера
Друзья, помогите с задачкой: Расшифруйте следующее сообщение: «ДНРСМ (ХЖРЧСР ЛЭЪШ, ФЗСЁЧВ МЦХ,...

Криптографическая атака на шифр простой замены
Добрый день! Может ли кто справиться с данной задачей? Используя частотный анализ текста,...

Криптографическая атака на шифр простой замены
Кто-нибудь знает,как выполнить это задание?Помогите,если можете! Используя частотный анализ...

Шифр Виженера
написать программу, реализующую алгоритм шифрования с помощью шифра Виженера с использованием...

11
Cyborg Drone
22.12.2015, 22:17
  #2

Не по теме:

В вашей теме "Криптографическая атака на шифр простой замены" Вы просили меня помочь с расшифровкой сообщения из этой темы. Будет время - помогу.

0
Модератор
10012 / 5367 / 3340
Регистрация: 17.08.2012
Сообщений: 16,359
26.12.2015, 01:25 3
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Потребовалось не так много времени. Итак.

Будем считать, что используется классический шифр Виженера, то есть, что tabula recta не скремблирована (буквы в ней расположены по алфавиту) и длина кодового слова меньше длины сообщения.

Сообщение довольно длинное, будем использовать файловый ввод-вывод.
Предостережение: таблицы кодировок в файле и в окне программы должны совпадать.

Для начала для удобства дешифровки выбросим из сообщения незашифрованную информацию, заодно подсчитаем длину сообщения и количество различных буковок.
Программа для этого
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const alphabet = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
var f: text;
    g: file of char;
    s: string;
    c: char;
    i: longword;
    n, k: byte;
    m: set of byte;
begin
  assign(f, 'c:\vigener.txt');
  reset(f);
  assign(g, 'c:\vigener.dat');
  rewrite(g);
  m := [];
  k := 0;
  while not eof(f) do
    begin
      readln(f, s);
      writeln(s);
      for i := 1 to length(s) do
        begin
          n := pos(s[i], alphabet);
          if n > 0
            then begin
              write(g, s[i]);
              if not (n in m)
                then begin
                  inc(k);
                  include(m, k)
                end
            end
        end
    end;
  close(f);
  reset(g);
  writeln;
  for i := 1 to filesize(g) do
    begin
      read(g, c);
      write(c)
    end;
  writeln;
  writeln;
  write('length = ', filesize(g), ' letters: ', k);
  close(g);
  readln
end.
Длина зашифрованной части сообщения 464, и используются все 33 буквы.

Попытаемся выяснить длину кодового слова. Не станем что-то там вычислять по Касиске и Фридману, а напишем программку для автокорреляции сообщения, на дисплей будем выдавать количество совпадений в зависимости от сдвига, да, собственно, и достаточно.
p - порог вывода по совпадениям (выход p = 1000)
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var g: file of char;
    c, s: char;
    i, n, k, p, len: longword;
begin
  assign(g, 'c:\vigener.dat');
  reset(g);
  len := filesize(g);
  p := 0;
  repeat
    for n := 0 to len - 1 do
      begin
        k := 0;
        for i := 0 to len - 1 do
          begin
            seek(g, i);
            read(g, c);
            seek(g, (i + n) mod len);
            read(g, s);
            if c = s then inc(k)
          end;
        if k >= p
          then write(k:4)
          else write('.':4)
      end;
    writeln;
    write('p = ');
    readln(p);
  until p = 1000;
  close(g)
end.
Вроде как при p > 20 видно, что длина кодового слова равна 10. Мысленно записываем сообщение в виде строчек по 10 букв. И тут получается очень большая бяка: для каждого столбца полученной таблицы нельзя выяснить возможные сдвиги в коде Цезаря по каждой букве кодового слова с помощью корреляции отсортированных по частоте букв и образцовой строки из букв, расположенных по средне-статистической частоте повторения для русского языка, поскольку букв в столбце всего-то 46 или 47. Слишком мало для получения достаточно уверенной статистики.

Но, несмотря ни на что, атака увенчалась успехом. Реально решил так: выводится сообщение, исходя из ширины вывода стандартного дисплея в 80 символов, по 10 букв через пробел в 7 столбцов, и табличка в 10 строк с шапкой из алфавита и примерных частот букв алфавита на 1000 символов русского текста, и далее строки, где указаны номер буквы кодового слова, сдвиг алфавита и (для удобства масштабированные) частоты по всему алфавиту для данной буквы кодового слова.

При подборе в программу вводятся два числа через пробел: номер буквы кодового слова и относительный сдвиг шифра Цезаря для данной буквы кодового слова. По окончании подбора шифра нужно ввести два числа, первое из которых не больше нуля.

Шифр удалось подобрать по однобуквенным словам с одновременным общим постоянным анализом сообщения на соответствие буквосочетаний русскому языку в частично расшифрованном тексте.

Программа традиционно сырая и неоптимизированная, поскольку нужно было не писать программу, а проводить атаку. Если желаете, можете программулину причесать.
Программа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
const n = 10;
      freq = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      perc: array [0..32] of byte =
        (43,  7, 20,  7, 13, 40,  0,  4,  9, 37,  6,
         17, 21, 16, 32, 46, 17, 27, 27, 31, 14,  2,
          4,  2,  6,  4,  2,  0, 10,  9,  1,  5, 11);
var g, h: file of char;
    f, y: text;
    c, q: char;
    a: array [0..n-1, 0..32] of integer;
    b: array [0..n-1] of integer;
    i, j, len: longword;
    p, k, t: integer;
    s: string;
begin
  for i := 0 to n - 1 do
    begin
      for j := 0 to 32 do a[i, j] := 0;
      b[i] := 0;
    end;
  assign(f, 'd:\vigener.txt');
  assign(g, 'd:\vigener.dat');
  assign(h, 'd:\solution.dat');
  assign(y, 'd:\solution.txt');
  reset(g);
  len := filesize(g);
  for i := 0 to len - 1 do
    begin
      read(g, c);
      inc(a[i mod n, pos(c, freq) - 1]);
    end;
  for i := 0 to n do for j := 0 to 32 do a[i, j] := a[i, j] * 4;
  repeat
    t := 0;
    for i := 0 to n - 1 do write(freq[(33 - b[i]) mod 33 + 1]);
    writeln;
    reset(g);
    rewrite(h);
    for i := 0 to len - 1 do
      begin
        read(g, c);
        if (i > 0) and (i mod n = 0)
          then begin
            write(' ');
            t := t + n + 1;
            if 80 - t < n + 2
              then begin
                writeln;
                t := 0;
              end;
          end;
        q := freq[(pos(c, freq) + b[i mod n] - 1) mod 33 + 1];
        write(q);
        write(h, q)
      end;
    writeln;
    write(' ':4);
    for i := 0 to 32 do write(i mod 10:2);
    writeln;
    write(' ':4);
    for i := 1 to 33 do write(freq[i]:2);
    writeln;
    write(' ':4);
    for i := 0 to 32 do write(perc[i]:2);
    writeln;
    for i := 0 to n - 1 do
      begin
        write(i + 1:2, b[i]:2);
        for j := 0 to 32 do write(a[i, (j + b[i]) mod 33]:2);
        writeln
      end;
    readln(p, k);
    if p > 0 then b[p - 1] := (b[p - 1] + k) mod 33
  until p <= 0;
  close(g);
  reset(f);
  reset(h);
  rewrite(y);
  write(y, 'Ключевое слово: ');
  for i := 0 to n - 1 do write(y, freq[(33 - b[i]) mod 33 + 1]);
  writeln(y);
  writeln(y);
  write('Ключевое слово: ');
  for i := 0 to n - 1 do write(freq[(33 - b[i]) mod 33 + 1]);
  writeln;
  writeln;
  writeln(y, 'Расшифрованное сообщение:');
  writeln(y);
  writeln('Расшифрованное сообщение:');
  writeln;
  while not eof(f) do
    begin
      readln(f, s);
      for i := 1 to length(s) do
        if pos(s[i], freq) > 0
          then begin
            read(h, c);
            s[i] := c
          end;
      writeln(y, s);
      writeln(s)
    end;
  close(f);
  close(h);
  close(y);
  readln
end.
Ключевое слово: ТРЕХГЛАВАЯ

Расшифрованное сообщение:

ГОРА БЕЛУХА -
НАИВЫСШАЯ ТОЧКА ГОРНОГО АЛТАЯ, ВЕНЧАЮЩАЯ КАТУНСКИЙ
ХРЕБЕТ. НАХОДИТСЯ НА ТЕРРИТОРИИ УСТЬ-КОКСИНСКОГО
РАЙОНА. ЗДЕСЬ БЕРЁТ СВОЁ НАЧАЛО РЕКА КАТУНЬ.
НАЗВАНИЕ ВЕРШИНЫ ПРОИСХОДИТ ОТ ОБИЛЬНОГО СНЕГА,
ПОКРЫВАЮЩЕГО ГОРУ ОТ ПИКА ДО САМОГО ОСНОВАНИЯ.
ЧЕРЕЗ МАССИВ БЕЛУХИ ПРОХОДИТ ГРАНИЦА РОССИИ И
КАЗАХСТАНА. ГОРА БЕЛУХА ПРЕДСТАВЛЕНА ДВУМЯ
ВЕРШИНАМИ В ВИДЕ НЕПРАВИЛЬНЫХ ПИРАМИД -
ОСТРОКОНЕЧНОЙ С СЕВЕРА ВОСТОЧНОЙ И ЗАПАДНОЙ
БЕЛУХОЙ, ПОЧТИ ОТВЕСНО ПАДАЮЩИМИ НА СЕВЕР К
АККЕМСКОМУ ЛЕДНИКУ И ПОСТЕПЕННО СНИЖАЮЩИМИСЯ К
ЮГУ, В СТОРОНУ КАТУНСКОГО ЛЕДНИКА.

Если надо - комментарии к программам добавлю. На всякий случай, архив с моими исходным файлом и файлами, порождёнными программами: vigener.zip. Файлы в кодировке CP-866 (русская кодовая таблица OEM/DOS), при просмотре блокнотом из windows нужно в блокноте установить какой-нибудь OEM/DOS шрифт, Terminal, например.
3
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 15:47 4
при запуске последней программы выдает много ошибок можете помочь? параметр цикла for должен описываться в заголовке цикла 16,18,28,33,36,40,60,63,68,71,82,86,96 строчки
0
Модератор
10012 / 5367 / 3340
Регистрация: 17.08.2012
Сообщений: 16,359
20.02.2017, 16:42 5
Dron19, я писал программу, подходящую для большинства диалектов паскаля, а вовсе не для весьма специфичного Pascal ABC.NET, в котором Вы мою программу запустили. Приведите программу в соответствие с синтаксисом Pascal ABC.NET, ну там, уберите из секции var переменные циклов, все for замените на for var, ну и так далее. Поскольку Вы этого сделать не смогли, запускайте программу в среде Pascal ABC.NET, установленной на Вашем компьютере. С Вашими знаниями в онлайн-среде WDE Вам запустить программу вряд ли удастся, поскольку она оперирует с файлами. И ещё. Запуск этой программы без результата работы двух предыдующих программ смысла не имеет, а Вы эти программы не запускали. И ещё. На всякий случай. Программа не производит автоматическую расшифровку шифра Виженера. Вы уверены, что эта программа Вам требуется?

Итак, чем я могу помочь?
1
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 16:58 6
я запускал 3 ваши программы из этой темы, после первой получил длину текста, а после запуска второй у меня вышло много чисел, а насчет 3-й можете помочь адаптировать для паскаля АВС? спасибо заранее большое
0
Модератор
10012 / 5367 / 3340
Регистрация: 17.08.2012
Сообщений: 16,359
20.02.2017, 17:19 7
Просмотрел программу заново. Оказалось, что того, что я написал выше, вполне достаточно для адаптации. Уберите из секции var переменные i и j (12 строка) и в программе везде замените for на for var. Извиняюсь, на том компьютере, который я сейчас использую, нет Pascal ABC.NET, и установить его сюда не разрешается.
0
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 17:26 8
поменяв все, как вы и сообщили мне, скомпилировав и запустив программу, выдало, что имя 'len' неизвестно
0
Эксперт Pascal/Delphi
6811 / 4568 / 4819
Регистрация: 05.06.2014
Сообщений: 22,438
20.02.2017, 17:55 9
Dron19, что-то не так вы поменяли.
Ибо, в исходной программе
Pascal
1
 i, j, len: longword;
0
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 18:07 10
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
const n = 10;
      freq = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ';
      perc: array [0..32] of byte =
        (43,  7, 20,  7, 13, 40,  0,  4,  9, 37,  6,
         17, 21, 16, 32, 46, 17, 27, 27, 31, 14,  2,
          4,  2,  6,  4,  2,  0, 10,  9,  1,  5, 11);
var g, h: file of char;
    f, y: text;
    c, q: char;
    a: array [0..n-1, 0..32] of integer;
    b: array [0..n-1] of integer;
   len: longword;
 
    p, k, t: integer;
    s: string;
begin
  for var i := 0 to n - 1 do
    begin
      for var j := 0 to 32 do a[i, j] := 0;
      b[i] := 0;
    end;
    begin
  assign(f, 'd:\vigener.txt');
  assign(g, 'd:\vigener.dat');
  assign(h, 'd:\solution.dat');
  assign(y, 'd:\solution.txt');
  reset(g);
  len:= filesize(g);
  for var i := 0 to len - 1 do
    begin
      read(g, c);
      inc(a[i mod n, pos(c, freq) - 1]);
    end;
  for var i := 0 to n do for  var  j := 0 to 32 do a[i, j] := a[i, j] * 4;
  repeat
    t := 0;
    for var i := 0 to n - 1 do write(freq[(33 - b[i]) mod 33 + 1]);
    writeln;
    reset(g);
    rewrite(h);
    for var i := 0 to len - 1 do
      begin
        read(g, c);
        if (i > 0) and (i mod n = 0)
          then begin
            write(' ');
            t := t + n + 1;
            if 80 - t < n + 2
              then begin
                writeln;
                t := 0;
              end;
          end;
        q := freq[(pos(c, freq) + b[i mod n] - 1) mod 33 + 1];
        write(q);
        write(h, q)
      end;
      
    writeln;
    write(' ':4);
    for var i := 0 to 32 do write(i mod 10:2);
    writeln;
    write(' ':4);
    for var i := 1 to 33 do write(freq[i]:2);
    writeln;
    write(' ':4);
    for var i := 0 to 32 do write(perc[i]:2);
    writeln;
    for var i := 0 to n - 1 do
      begin
        write(i + 1:2, b[i]:2);
        for var j := 0 to 32 do write(a[i, (j + b[i]) mod 33]:2);
        writeln
      end;
    readln(p, k);
    if p > 0 then b[p - 1] := (b[p - 1] + k) mod 33
  until p <= 0;
  close(g);
  reset(f);
  reset(h);
  rewrite(y);
  write(y, 'Ключевое слово: ');
  for var i := 0 to n - 1 do write(y, freq[(33 - b[i]) mod 33 + 1]);
  writeln(y);
  writeln(y);
  write('Ключевое слово: ');
  for var i := 0 to n - 1 do write(freq[(33 - b[i]) mod 33 + 1]);
  writeln;
  writeln;
  writeln(y, 'Расшифрованное сообщение:');
  writeln(y);
  writeln('Расшифрованное сообщение:');
  writeln;
  while not eof(f) do
    begin
      readln(f, s);
      for var i := 1 to length(s) do
        if pos(s[i], freq) > 0
          then begin
            read(h, c);
            s[i] := c
          end;
      writeln(y, s);
      writeln(s)
    end;
  close(f);
  close(h);
  close(y);
  readln
end;
end.
вот так получилось компилируется все, при запуске ошибка времени исполнения.индекс находится все границ массива
0
Эксперт Pascal/Delphi
6811 / 4568 / 4819
Регистрация: 05.06.2014
Сообщений: 22,438
20.02.2017, 18:36 11
34-я строка - цикл идет от 0 до n, а границы массива [0..n-1]
0
0 / 0 / 0
Регистрация: 20.02.2017
Сообщений: 5
20.02.2017, 19:42 12
спасибо огромное теперь буду подбирать комбинацию)
0
20.02.2017, 19:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2017, 19:42
Помогаю со студенческими работами здесь

Шифр Виженера. Устранить скобку и запятые в результате
Всех приветствую! Мне необходимо было найти реализацию шифра Виженера на языке Pascal, я её нашёл....

Шифр Виженера из-за чего у меня не расшифровывает зашифрованный текст ?
const TViginer: string = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯабвгдеёжзийклмнопрстуфхцчшщьъыэюя'; ...

Шифр Виженера
Составьте программы (желательно отдельно), одна из которых шифрует, а другая расшифровывает текст...

Шифр Виженера, шифр Скитала
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru