Форум программистов, компьютерный форум, киберфорум
Pascal ABC
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 20

Составить программу которая по заданным m, n и паролю выполнит шифрование/дешифрование методом Виета

01.04.2017, 13:02. Показов 2250. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста с написанием проги. Прога работает с файлом, в котором дан текст. Есть само задание и код, но в нем я не могу сделать так, чтобы прога обрабатывала весь текст. Она работает только с тем диапазоном, который равен произведению m*n.

Задание:

Маршрутное шифрование.

Этот способ шифрования изобрел выдающийся французский математик и криптограф Франсуа Виет (1540-1603). Пусть m и n – некоторые натуральные числа, каждое больше 1. Открытый текст последовательно разбивается на части (блоки) с длиной, равной произведению mn (если в последнем блоке не хватает букв, можно дописать до нужной длины произвольный их набор). Блок вписывается построчно в таблицу размерности m×n (т.е. m строк и n столбцов). Криптограмма получается выписыванием букв из таблицы в соответствии с некоторым маршрутом. Этот маршрут вместе с числами m и n составляет ключ шифра. Чаще всего буквы выписывают по столбцам, которые упорядочиваются в соответствии с паролем: под таблицей подписывается слово, состоящее из n неповторяющихся букв, и столбцы таблицы нумеруются по алфавитному порядку букв пароля. Например, для шифрования открытого текста, выражающего один из главных принципов криптологии: нельзя недооценивать противника, добавим к его 29 буквам еще одну, скажем а, возьмем m=5, n=6, впишем текст в таблицу 5×6 и выберем в качестве пароля слово п а р о л ь:

н е л ь з я
н е д о о ц
е н и в а т
ь п р о т и
в н и к а а
п а р о л ь


Выписывая теперь буквы по столбцам в соответствии с алфавитным порядком букв в пароле, получаем следующую криптограмму:

ЕЕНПНЗОАТАЬОВОКННЕЬВЛДИРИЯЦТИА (пробелы пропускаются).

Составить программу, которая по заданным m, n и паролю выполнит шифрование/дешифрование методом Виета.
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
113
114
115
116
117
118
119
program Lin_krik;
 
var
F: Text;  
G: Text;
P:array [1..100,1..100] of string;
n,m,c:integer;
phrase,pass,pass_cr,name1,name2,U:string;
 
begin
  
  
  write('введите имя файла для чтения: ');
  readLn(name1);
  assign(F,name1);
  Reset(F);
  
  write('введите имя файла для записи: ');
  readLn(name2);
  assign(G,name2);
  Rewrite(G);
  
  writeln('Введите m и n:');
  readln(m,n);
  writeln('текст в файле должен быть (без пробелов) и содержать',' ',n*m,' ','символов' );
  Readln(F,phrase);
  if length(phrase) = n*m then 
  begin
  
    repeat
      writeln('Введите пароль из ',n,' символов:');
      readln(pass);
    until length(pass)=n;
 
    for var j:=1 to n do
      P[m+1,j]:=pass[j];
 
    pass_cr:=pass;
    for var i := 1 to length(pass_cr)-1 do
    begin
      for var j := i + 1 to length(pass_cr) do
        if pass_cr[j]<pass_cr[i] then 
        begin
          var ch := pass_cr[i];
          pass_cr[i]:=pass_cr[j];
          pass_cr[j]:= ch;
        end;
    end;
          for var j:=1 to n do
            P[m+2,j]:=pass_cr[j];
 
    writeln('Выберите операцию:');
    writeln('1.Шифрование');
    writeln('2.Дешифрование');
    readln(c);
    case c of
    1: begin
           var l:=1;
           for var i:=1 to m do
             for var j:=1 to n do
             begin
              P[i,j]:=phrase[l];
              l+=1;
            end;
        
         writeln('Готово:');
         var s:=0;
         var j:=1;
         l:=1;
         repeat
           if P[m+1,j]=pass_cr[l] then
           begin
             for var i:=1 to m do
             U:=U+P[i,j]; 
             s+=1;
             j:=1;
             l+=1;
           end
             else j+=1;
         until s=n;
         writeln(U);
         Writeln(G,U);
       end;
     
    2:begin
           var l:=1;
           for var j:=1 to n do
             for var i:=1 to m do 
             begin
              P[i,j]:=phrase[l];
              l+=1;
             end;
     
         writeln('Готово:');
         for var i:=1 to m do 
         begin
         var s:=0;
         var j:=1;
         l:=1;
         repeat
           if P[m+2,j]=pass[l] then
           begin
               U:=U+P[i,j];
             s+=1;
             j:=1;
             l+=1;
           end
             else j+=1;
         until s=n;
         end;
         write(U);
         Writeln(G,U);
       end;
    end;
  end
  else writeln('число символов в тексте не равно',' ',m*n);
  Close(F);
  Close(G);
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2017, 13:02
Ответы с готовыми решениями:

Составить программу, выполняющую шифрование и дешифрование текста
Здравствуйте. Есть задание Используя алгоритм гаммирования с конгруэнтным датчиком ПСЧ, составить программу, выполняющую шифрование и...

Составить программу, которая по введенному номеру выполнит то или иное действие над числами
Составление программы с помощью оператора Select Case. Даны два действительных положительных числа. Арифметические действия пронумерованны...

Составить программу, которая по введенному номеру операции выполнит то или иное действие над числами
Даны два действительных положительных числа х и у . Арифметически действия над числами пронумерованы (1-сложение, 2-вычитание,...

12
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
01.04.2017, 13:05
Рабочий код без использования файлов
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
var
P:array [1..100,1..100] of string;
n,m,c:integer;
phrase,pass,pass_cr:string;
begin
  writeln('Введите m и n:');
  readln(m,n);
  repeat
    writeln('Введите фразу из ',n*m,' символов (без пробелов):');
    readln(phrase);
  until length(phrase)=n*m;
  repeat
    writeln('Введите пароль из ',n,' символов:');
    readln(pass);
  until length(pass)=n;
 
  for var j:=1 to n do
    P[m+1,j]:=pass[j];
 
  pass_cr:=pass;
  for var i := 1 to length(pass_cr)-1 do begin
    for var j := i + 1 to length(pass_cr) do
      if pass_cr[j]<pass_cr[i] then begin
        var ch := pass_cr[i];
        pass_cr[i]:=pass_cr[j];
        pass_cr[j]:= ch;
      end;
  end;
        for var j:=1 to n do
          P[m+2,j]:=pass_cr[j];
 
  writeln('Выберите операцию:');
  writeln('1.Шифрование');
  writeln('2.Дешифрование');
  readln(c);
  case c of
  1: begin
         var l:=1;
         for var i:=1 to m do
           for var j:=1 to n do begin
            P[i,j]:=phrase[l];
            inc(l);
           end;
        
       writeln('Готово:');
       var s:=0;
       var j:=1;
       l:=1;
       repeat
         if P[m+1,j]=pass_cr[l] then begin
           for var i:=1 to m do
             write(P[i,j]);
           inc(s); j:=1; inc(l);
         end
           else inc(j);
       until s=n;
     end;
     
  2:begin
         var l:=1;
         for var j:=1 to n do
           for var i:=1 to m do begin
            P[i,j]:=phrase[l];
            inc(l);
           end;
     
       writeln('Готово:');
       for var i:=1 to m do begin
       var s:=0;
       var j:=1;
       l:=1;
       repeat
         if P[m+2,j]=pass[l] then begin
             write(P[i,j]);
           inc(s); j:=1; inc(l);
         end
           else inc(j);
       until s=n;
       end;
     end;
  end;
end.
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 20
01.04.2017, 13:22  [ТС]
У меня ведь тот же самый код. Я не могу сделать так, чтобы прога работала с полным текстом. Вот в чем проблема
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
01.04.2017, 13:32
Цитата Сообщение от VerVolf Посмотреть сообщение
Она работает только с тем диапазоном, который равен произведению m*n
а разве так не должно быть? У вас есть ограничения в виде m и n. Соответственно для шифрования берётся m*n символов. В условии так и написано
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 20
01.04.2017, 13:37  [ТС]
В условии написано, что текст должен разбиться на блоки равные m*n. И каждый такой блок прога должна пройти
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
01.04.2017, 13:47
Попробуем так:
Текст последовательно разбивается на части (блоки)
Блок вписывается построчно в таблицу размерности m×n
Криптограмма получается выписыванием букв из таблицы
Один элемент таблицы (матрицы) - один символ. Количество символов m*n
Для этого даже есть пример:
н е л ь з я
н е д о о ц
е н и в а т
ь п р о т и
в н и к а а
п а р о л ь
Добавлено через 2 минуты
Хотите весь файл - делайте матрицу размером mxn="сумма всех символов текста". И длина пароля должна быть равна n
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 20
01.04.2017, 13:49  [ТС]
Каждый блог должен вписываться в матрицу m*n поочередно
0
 Аватар для Hitoku
1755 / 1347 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
01.04.2017, 13:50
Либо, если как именно вы хотите - тогда вводите например k равный количеству блоков в файле. Затем делаете цикл от 1 до k и формируете k матриц m*n, каждая из которых будет шифроваться
0
 Аватар для CopyPaste
6 / 6 / 5
Регистрация: 03.11.2012
Сообщений: 353
02.04.2017, 08:17
Pascal
1
2
3
4
5
while not Eof(FileName) do {пока не достигнут конец файла FileName, делай}
  while not Eoln(FileName) do {пока не достигнут конец очередной строки файла FileName, делай}
    begin
      {группа операторов обработки символов очередной строки}
    end;
еще смотрю твою прогу, не закрываю тему.
условие завершения блока, а не всего файла.
Pascal
1
  if {length(phrase) = m*n }IoResult then
0
 Аватар для CopyPaste
6 / 6 / 5
Регистрация: 03.11.2012
Сообщений: 353
03.04.2017, 15:06
вот алгоритм поменялся
Вложения
Тип файла: 7z cyberforum.7z (2.6 Кб, 15 просмотров)
0
0 / 0 / 0
Регистрация: 27.03.2017
Сообщений: 20
04.04.2017, 07:38  [ТС]
Не могу открыть файл

Добавлено через 10 минут
Открыть смог
0
 Аватар для CopyPaste
6 / 6 / 5
Регистрация: 03.11.2012
Сообщений: 353
06.04.2017, 20:39
добавил строчек, сейчас стараюсь, пишу только этот файл.
Вложения
Тип файла: zip cyberforum.zip (257.6 Кб, 13 просмотров)
0
 Аватар для CopyPaste
6 / 6 / 5
Регистрация: 03.11.2012
Сообщений: 353
23.04.2017, 17:58
часть работы проделана, продолжение следует.
Миниатюры
Составить программу которая по заданным m, n и паролю выполнит шифрование/дешифрование методом Виета  
Вложения
Тип файла: zip cyberforum.zip (18.6 Кб, 10 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2017, 17:58
Помогаю со студенческими работами здесь

Составить программу, которая по введенному номеру операции выполнит то или иное действие над числами.
С клавиатуры вводится два вещественных числа X и Y (не равные нулю). Арифметические действия над ними пронумерованы следующим образом: 1-...

Шифрование/дешифрование методом Цезаря
Имеется код, который зашифровывает написанное методом Цезаря. Нужна помощь: как добавить сюда дешифрование? // хз.cpp : main project...

Шифрование / дешифрование методом Цезаря
Доброго времени суток, форумчане! Да-да, на форуме 100500 подобных тем, однако интересующей меня информации я не нашёл. У меня есть...

Шифрование и дешифрование методом Цезаря
Здравствуйте. Не работает шифрование и дешифрование. Если выводить в шифровке расположение букв числами, то они отрицательные....

Шифрование/дешифрование методом Цезаря
посмотрите пжлст код на c++, если что укажите на ошибки и т.п. сильно не разбираюсь Если не трудно помогите подкорректировать) #include...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru