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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 5.00
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 13:59     Перестановочный шифр. #1
Перестановочный шифр. На основе этого мне нужно написать рабочий код на С++. Материал прочитан на несколько раз и уже выдвинуто множество идей, код пишется, но остается ощущения, что я двигаюсь в неправильном направление. Прошу вашей помощи пожалуйста!!! План действия, к-рый реализую: 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");
  }*/
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 13:59     Перестановочный шифр.
Посмотрите здесь:

C++ Перестановочный шифр с ключевым словом
шифр C++
C++ Шифр Цезаря
шифр Гронсфельда C++
C++ Шифр Полибия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2012, 14:06     Перестановочный шифр. #2
Потому что делаешь конкретно скиталу методом перелёта из Москвы в Петербург с пересадкой на Марсе. Матричный ключ предназначен не для этого, а для универсального представления произвольных перестановок.
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 14:19  [ТС]     Перестановочный шифр. #3
усложнять полет я умею к сожалению( когда не все понимаю.
taras atavin, подскажи пожалуйста, что за перестановки будут? - Это перестановки, которые просто зависят от "диаметра скиталы"?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
07.01.2012, 14:21     Перестановочный шифр. #4
Ты скиталу то понял? Мотают ленту на цилиндр и пишут поперёк, потом разматывают. В твоём случае соседние символы - это символы через каждые 5 символов.
tymrfik
 Аватар для 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;
       
       }
вот так сделаю верно?
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 17:13     Перестановочный шифр. #6
tymrfik, я бегло читал, поэтому если не в тему сори, не это искал
Шифрование методом перестановки
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 17:32  [ТС]     Перестановочный шифр. #7
Полезная вещь) правда все же с моей проблемой не справится/
-=ЮрА=-,
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 17:43     Перестановочный шифр. #8
Цитата Сообщение от tymrfik Посмотреть сообщение
Полезная вещь) правда все же с моей проблемой не справится/
-=ЮрА=-,
сейчас прочту внимательно задание

Добавлено через 8 минут
tymrfik, думаю проблемма только в умножении матриц, в остальном не вижу сложностей, написание алгоритма лишь вопрос времени, вот пост Как умножить матрицы, думаю он поможет справиться
tymrfik
 Аватар для 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];
                }
}
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 17:52  [ТС]     Перестановочный шифр. #10
Перестановочный шифр.
-=ЮрА=-
Заблокирован
Автор 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;
Я сейчас пишу свой взгляд на твою проблемму
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 19:19  [ТС]     Перестановочный шифр. #12
попробовал, к сожалению получается неверно
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 19:46     Перестановочный шифр. #13
Цитата Сообщение от tymrfik Посмотреть сообщение
попробовал, к сожалению получается неверно
- потому и неверно что заполняешь с[6][5] - её вообще не должно быть. Суть твоего алгоритма я привёл на скрине в MathCAD правда чтоб не мучаться я сделал твой же пример строка из 5-символов но если бы в неё было 10 или 12(не обязательно кратное 5 число брать) то всего лишь увеличилась размерность матрицы
enc(ключа шифрования). При этом важно чтобы enc была обратима(т.е. существовал определитель) иначе декодирования не выйдет
Миниатюры
Перестановочный шифр.  
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 20:26  [ТС]     Перестановочный шифр. #14
-=ЮрА=-, Насчет матрицы с в сообщение 4-5 уже было исправлено. Она размерностью 30*30
и показывает лишь перестановки, которые происходят через 5 символов. То, что у меня было обозначено в 1 сообщение про матрицу с неверно.
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 20:58     Перестановочный шифр. #15
Цитата Сообщение от tymrfik Посмотреть сообщение
-=ЮрА=-, Насчет матрицы с в сообщение 4-5 уже было исправлено. Она размерностью 30*30
и показывает лишь перестановки, которые происходят через 5 символов. То, что у меня было обозначено в 1 сообщение про матрицу с неверно.
- тогда давай свою щифрующую матрицу enc 30х30(прям в топик текстовым полем все 30х30 нолей и единиц), посредством MathCAD найду её обратную и зашью в программу как дешифрующую. Тогда твоё шифрование будет осуществляться по алгоритму enc. В общем случае enc мы должны либо генерировать либо вводить вручную, причём по опред правилам - чтобы у матрицы был определитель(т.е. чтобы она была обратимой), далее должны програмно её обратить и держать в качестве дешифрующей - при такой реализации программа будет работать всегда с разным алгоритмом шифрования
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
07.01.2012, 21:24  [ТС]     Перестановочный шифр. #16
так я чего-то недопонимаю.
Шифрующая последовательность выглядит так:
t = {0, 6, 12, 18, 24, 1, 7, 13, 19,25,3, ...и т.д.}. потому что между буквами открытого текста 5 левых символов будет в шифре. Так вот в матрице c[30][30] единицы стоят на места: 0, 6, 12, 18, 24, 1, 7, 13, 19,25,3 .... После полученную матрицу с мы умножаем на наш открытый текст, где все по порядку от 0 до 29 .
Для примера сейчас шифрую: char w[31]="molokomolokomolokomolokomoloko"; - где ровно 30 символов.
попытки забить таки эту ужасную матрицу с
C
1
2
3
4
5
6
7
8
9
10
11
12
for(i=0;i<30;i++){
   for(j=0;j<30;j++){
     c[i][j]=0;
       }
       }
   for(j=0;j<30;j++){
       if (6*j<30)
        { c[j][(6*j)]=1;}
        else {
             c[j][(6*j%30)+1]=1;
               } 
        }
Но вы ходит лишь отсюда то, что в матрице мне удалось забить "1" места 0, 6, 12, 18, 24, 1, 7, 13, 19,25
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 22:42     Перестановочный шифр. #17
tymrfik, у тебя должно быть 30 единиц - как ты собрался обратить матрицу 30х30 у которой даже на один определитель элементов не нашкребёшь???Вот смотри пускай у тебя единицы на главной диагонали - сколько единичек надо для главного определителя - очевидно 30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 00:26     Перестановочный шифр.
Еще ссылки по теме:

Шифр Виженера C++
Шифр Вижиненра, шифр скитала C++
Шифр Вижинера C++

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

Или воспользуйтесь поиском по форуму:
tymrfik
 Аватар для tymrfik
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 89
08.01.2012, 00:26  [ТС]     Перестановочный шифр. #18
У меня и должно получится 30 "1". В каждой строке по одной "1", только нужно правильно заполнить для этого матрицу. А про места я имел в виду, что сначала единица в первой строке стоит на 0 месте, затем спускаемся на строчку (во второй) "1" заносим в строке на 0+6=6 место - т.е. пропускается пять символов, дальше на третей строке "1" заносится на 6+6=12 и так по строкам идти, на 6 строке получается "1" ставится на 24 место, а вот на 7 строке нужно начинать с 1, и чтобы 1+6=7, потом 13, потом 19 и т.п. Вот что я подразумевал. Мне не удается именно правильно заполнить таким образом матрицу С.

Добавлено через 1 час 6 минут
Здесь только Шифр, пока не обработанный в отдельную функцию. Но главное можете проверить на правильность?! пожалуйста!
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
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
#include <cstdlib>
#include <iostream>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    int n, c[30][30], m[30], e[30],i,k,j, l[30]; 
    char w[31]="molokomolokomolokomolokomoloko"; 
    /*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;
       }
       }
   for(j=0;j<30;j++){
       if (6*j<30)
        { c[j][(6*j)]=1;}
        else {
             if (j>4 &&j<10)
        {c[j][(6*j%30)+1]=1;}
         if (j>9 &&j<15)
        {c[j][(6*j%30)+2]=1;}
        if (j>14 &&j<20)
        {c[j][(6*j%30)+3]=1;}
        if (j>19 &&j<25)
        {c[j][(6*j%30)+4]=1;}
        if (j>26 &&j<31)
        {c[j][(6*j%30)+5]=1;}
        }
        }
   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];
                }
}
     for (i=0; i<30; ++i) {
           cout<<e[i];
           }  
    cout<<endl;
      for (i=0; i<strlen(w); ++i) {
           cout<<w[e[i]];
                }  
    system("PAUSE");
    return EXIT_SUCCESS;
}
Добавлено через 1 минуту
если нетрудно напишите пожалуйста дешифратор?! заранее благодарен за посильную помощь!
Yandex
Объявления
08.01.2012, 00:26     Перестановочный шифр.
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru