Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
#1

Перестановочный шифр. - C++

07.01.2012, 13:59. Просмотров 3086. Ответов 17
Метки нет (Все метки)

Перестановочный шифр. На основе этого мне нужно написать рабочий код на С++. Материал прочитан на несколько раз и уже выдвинуто множество идей, код пишется, но остается ощущения, что я двигаюсь в неправильном направление. Прошу вашей помощи пожалуйста!!! План действия, к-рый реализую: 1. ввожу текст с клавиатуры (уже в самом коде для простоты). Затем в массиве m[30] - должны хранится цифры, соответ порядку букв сообщения, о 0 до длины нашего вводимого текста. 2. В двумерный массив С[6][5] нужно по идеи сложить вписать массив m[30]. чтобы считать затем его по столбцам, таким образом мы получим перестановку (Было к примеру сообщение длиной 14: 1 2 3 4 ...14 а перестановка будет: (1 7 13 2 9 15 3 10...)) При считывания таким образом массива - мы заносим в другой одномерный массив Е[] - где будем хранить перестановку. Затем нужна матрица 30*30 с нулями, "1" на тех местах в матрице = порядковым номерам хранящихся в E[]. При умножении такой матрицы на исходной текст - мы получим перестановку. (шифр текст), а для расшифровки понадобится лишь обратная матрица к матрице 30*30, которую будем умножать на шифр - получать дешифр.
C++
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
    int n, c[6][5], m[30], e[30],i,k,j;
    char w[30]="molotokikarandashzilivradosti";
    /*cout<<"text"<<endl;
    cin>>w;*/
     int t=strlen(w);
    cout<<t;
    
   /*for (i=0;i<strlen(w);i++)
     { 
       cout<<w[i];
       m[i]=i;
       }
    cout<<endl; 
      for(j=0;j<strlen(w);j++) {cout<<m[j];}
      cout<<endl;
   for(i=0;i<6;i++){
   for(j=0;j<5;j++) {
        c[i][j]=0;}
        }
   for(i=0;i<strlen(w);i++){
   for(j=0;j<strlen(w);j++){
      c[i][j]=m[j];}
      }
for(i=0;i<5;i++){
   for(j=0;j<6;j++)
      printf("%3d ", c[i][j]);
    printf("\n");
  }*/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перестановочный шифр. (C++):

Перестановочный шифр с ключевым словом - C++
Помогите, нужно сделать программу что будет зашифровывать и расшифровывать текст с помощью перестановочного шифра. Буквы открытого...

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

шифр - C++
Помогите пожалуйста написать программу на СИ, которая в введенном тексте заменить каждую букву на ту, что стоит следующей в алфавите(как бы...

Шифр Вижинера - C++
Здравствуйте.Нужно написать шифр Вижинера с файлами,т.е. 1 файл-исходный текст,2ой зашифрованный,ну а ключ вводится в консоли.Длина...

Шифр Атбаш - C++
Всем привет. Нужна помощь! Составить программу в Borland C++, которая позволит закодировать исходный текст шифром Атбаш и выполнить...

C++ Шифр Цезаря - C++
Help нужно написать программу на С++, которая шифрует русские и английские слова. Делает запрос на сдвиг. Зашифрованный код переводил...

17
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2012, 14:06 #2
Потому что делаешь конкретно скиталу методом перелёта из Москвы в Петербург с пересадкой на Марсе. Матричный ключ предназначен не для этого, а для универсального представления произвольных перестановок.
1
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 14:19  [ТС] #3
усложнять полет я умею к сожалению( когда не все понимаю.
taras atavin, подскажи пожалуйста, что за перестановки будут? - Это перестановки, которые просто зависят от "диаметра скиталы"?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2012, 14:21 #4
Ты скиталу то понял? Мотают ленту на цилиндр и пишут поперёк, потом разматывают. В твоём случае соседние символы - это символы через каждые 5 символов.
0
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 15:57  [ТС] #5
Как правильно забить единичками матрицу с нужным промежутком 5 ?
C++
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
  int n, c[30][30], m[30], e[30],i,k,j; 
    char w[30]; 
    cout<<"text"<<endl;
    cin>>w;
   for (i=0;i<strlen(w);i++)
     { 
       cout<<w[i];
       m[i]=i;
       }
    cout<<endl; 
   for(j=0;j<strlen(w);j++) {cout<<m[j];}
   cout<<endl;
   for (i=0;i<strlen(w);i++)
   for(i=0;i<30;i++){
   for(j=0;j<30;j++){
     c[i][j]=0;
     }
     }
  //c[0][0]=1;  
  for(i=0;i<30;i++){
   for(j=0;j<30;j++){
       c[i+1][j+6]=1;}
       }
   for(i=0;i<30;i++){
   for(j=0;j<30;j++)                          
      printf("%d ", c[i][j]);
    printf("\n");
  }
Добавлено через 29 минут
C++
1
2
3
4
 for(j=0;j<30;j++){
       c[j][(6*j)%30]=1;
       
       }
вот так сделаю верно?
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 17:13 #6
tymrfik, я бегло читал, поэтому если не в тему сори, не это искал
Шифрование методом перестановки
1
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 17:32  [ТС] #7
Полезная вещь) правда все же с моей проблемой не справится/
-=ЮрА=-,
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 17:43 #8
Цитата Сообщение от tymrfik Посмотреть сообщение
Полезная вещь) правда все же с моей проблемой не справится/
-=ЮрА=-,
сейчас прочту внимательно задание

Добавлено через 8 минут
tymrfik, думаю проблемма только в умножении матриц, в остальном не вижу сложностей, написание алгоритма лишь вопрос времени, вот пост Как умножить матрицы, думаю он поможет справиться
0
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 17:50  [ТС] #9
умножение выполняется(уже дописывал к коду)! Тут оказывается другая проблема! матрица с забивается по циклу 5 одинаковыми значениями по всей своей размерности.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(j=0;j<30;j++){
       c[j][(6*j%30)]=1;}
      /* if(j>5) {
              for (i=1;i<strlen(w);i++)
               c[j][i]=1;
               i=i+6;}
        }*/ - это неудачная попытка исправить складывающуюся проблему
   for(i=0;i<30;i++){
   for(j=0;j<30;j++)                          
      printf("%d ", c[i][j]);
    printf("\n");
  }
  for (i=0; i<30; ++i){
            e[i]=0;
  for (int r=0; r<30; r++){
                e[i]+=c[i][r]*m[r];
                }
}
0
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 17:52  [ТС] #10
Перестановочный шифр.
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 18:20 #11
tymrfik, попробуй заолнить свою с так
C++
1
2
3
for(i = 0; i < 30; i += 5)
    for(j = 0; j <  5; j++)
        c[i%5][j] = i + j;
Я сейчас пишу свой взгляд на твою проблемму
0
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 19:19  [ТС] #12
попробовал, к сожалению получается неверно
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 19:46 #13
Цитата Сообщение от tymrfik Посмотреть сообщение
попробовал, к сожалению получается неверно
- потому и неверно что заполняешь с[6][5] - её вообще не должно быть. Суть твоего алгоритма я привёл на скрине в MathCAD правда чтоб не мучаться я сделал твой же пример строка из 5-символов но если бы в неё было 10 или 12(не обязательно кратное 5 число брать) то всего лишь увеличилась размерность матрицы
enc(ключа шифрования). При этом важно чтобы enc была обратима(т.е. существовал определитель) иначе декодирования не выйдет
0
Миниатюры
Перестановочный шифр.  
tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 20:26  [ТС] #14
-=ЮрА=-, Насчет матрицы с в сообщение 4-5 уже было исправлено. Она размерностью 30*30
и показывает лишь перестановки, которые происходят через 5 символов. То, что у меня было обозначено в 1 сообщение про матрицу с неверно.
0
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 20:58 #15
Цитата Сообщение от tymrfik Посмотреть сообщение
-=ЮрА=-, Насчет матрицы с в сообщение 4-5 уже было исправлено. Она размерностью 30*30
и показывает лишь перестановки, которые происходят через 5 символов. То, что у меня было обозначено в 1 сообщение про матрицу с неверно.
- тогда давай свою щифрующую матрицу enc 30х30(прям в топик текстовым полем все 30х30 нолей и единиц), посредством MathCAD найду её обратную и зашью в программу как дешифрующую. Тогда твоё шифрование будет осуществляться по алгоритму enc. В общем случае enc мы должны либо генерировать либо вводить вручную, причём по опред правилам - чтобы у матрицы был определитель(т.е. чтобы она была обратимой), далее должны програмно её обратить и держать в качестве дешифрующей - при такой реализации программа будет работать всегда с разным алгоритмом шифрования
0
07.01.2012, 20:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2012, 20:58
Привет! Вот еще темы с ответами:

Шифр Бэкона c++ - C++
Народ,помогите пожалуйста перевести шифр с паскаля на c++ :) program strug_production; var s_out, s_in, str,itogstroka,tekbukva:...

Шифр Цезаря - C++
Створити програму, що реалізовує алгоритм дешифрування Цезаря, для латинського алфавіту з прогресуючим кроком від 3 до 10 (ВЕЛИКІ малі...

шифр RSA - C++
Добрый день, люди добрые помогите )) не могу понять в чем ошибка... сам алгоритм Два больших простых числа P и Q N=PQ затем...

Шифр цезаря - C++
Столкнулся с такой проблемой нужно &quot;Разработать прикладное приложение для шифрования текста с помощью шифра простой замены. Приложение...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru