Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шифры замены (восстановлен).docx
Скачиваний:
14
Добавлен:
01.03.2025
Размер:
82.48 Кб
Скачать

Обобщенный метод шифрования “решетка Кардано”

Недостатком классического метода является формирование шифртекста слева направо, сверху вниз. Очевидно, что он достаточно легко раскрывается -граммным криптоанализом (чтение в колонках).

Усилить алгоритм можно:

  1. Избавлением от последовательного вписывания в «окна» решетки-ключа.

  2. Избавлением от последовательного поворота решетки по или против часовой стрелке.

  3. Использование алгоритма в -мерном пространстве.

  4. Искусственным усложнением алгоритма в рамках языка программирования.

Очевидно, что при использовании произвольной последовательности маршрута перестановок увеличится размер ключа, причем в разы. Это усиление даёт увеличение всех возможных вариантов ключей в раз ( – сторона квадрата), что очень значительно.

Вывод формулы всех возможных ключей в классической решетке Кардано

Решетка состоит из уровней, их в два раза меньше , чем сторона квадрата. Количество элементов входящих в – ый уровень равно . Количество “окон” на уровне . Каждое из “окон” на уровне может быть в четырех местах, следовательно, все “окна” на – ом уровне могут быть в состояниях. Во всей решетке со стороной количество ключей равно произведению числа всех состояний на всех уровнях

.

Возведение в степень можно заменить суммированием степеней

.

- сумма арифметической прогрессии,

она равна

.

Число всех ключей равно

.

Алгоритм получения ключей

Рассмотрим алгоритм получения ключей шифра «поворотная решетка».

Для построения решетки достаточно задать - натуральное число больше 1.После чего строится квадрат со стороной и заполняется числами от 1 до .Затем получившийся квадрат поворачивается по часовой стрелке на , и .В итоге имеем квадрат со стороной .Ниже показано построение такой решетки при .

1

2

1

2

3

1

1

2

3

1

1

2

3

1

3

4

3

4

4

2

3

4

4

2

3

4

4

2

4

3

2

4

4

3

z

z

2

1

1

3

2

1

Следующий фрагмент кода на языке программирования С описывает создание и заполнение массива содержащего «поворотную решетку» со стороной :

int i,j;

unsigned int a[4][N][N],k=1;

unsigned long key,f;

for(i=0;i<N;i++)

for(j=0;j<N;j++)a[0][i][j]=k++; /*заполнение квадрата числами то 1 до */

k=1;

for(i=N-1;i>=0;i--)

for(j=0;j<N;j++)a[1][j][i]=k++; // поворот исходного квадрата на

k=1;

for(i=0;i<N;i++)

for(j=N-1;j>=0;j--)a[2][j][i]=k++; // поворот исходного квадрата на

k=1;

for(i=N-1;i>=0;i--)

for(j=N-1;j>=0;j--)a[3][i][j]=k++; // поворот исходного квадрата на

Ключи данного шифра строятся следующим образом: на решетке произвольны образом выбираются числа от 1 до ,например в выше приведенном примере это можно сделать следующим образом:

1

2

3

1

3

4

4

2

2

4

4

3

1

3

2

1

В тоге получим последовательность чисел 1,2,…, .Поставив в соответствие каждой цифре из такой последовательности номер квадрата в котором она выбрана (1-4) получим запись вида:

Где принимает значение от 1 до 4.Для нашего примера получим запись:

1233,

здесь 1 соответствует 1 выбранная в первом квадрате, 2 ­– 2 во втором, 3 – 3 в третьем 3 – 4 в третьем квадрате.

Следующий программа осуществляет вывод всех ключей решетки со стороной в указанный файл.

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define N n /*задание начального значения */

/*функция получения первого ключа (возвращает последовательность из единиц длины )*/

unsigned long FirstKey ()

{

unsigned long key=1;

unsigned long s=10;

int i;

for(i=0;i<N*N-1;i++){

key = key+s;

s =s*10;

}

return key;

}

/*получение следующего ключа*/

unsigned long Incr(unsigned long key){

unsigned long a[N*N],s,g=0;

int i;

s=10;

for(i=0;i<N*N;i++){

a[i]=key%10;

key/=10;

}

i=0;

while(a[i]==4 && i<N*N)i++;

if(i<N*N){

a[i]++;

for(i;i>=0;i--)

a[i-1]=1;

}

key=0;

s=1;

for(i=0;i<N*N;i++,s*=10)

key+=a[i]*s;

return key;

}

void main(){

unsigned long key,f;

FILE *L;

key=FirstKey();

/* Последовательный вывод ключей в файл. Цикл завершается по достижению значения - количество ключей для заданного . */

L=fopen("/*имя файла */","w");

for(f=0;f<(int)pow(4,N*N/4);f++){

fprintf(L,"%d \n",key);

key=Incr(key);

}

printf("\n");

}

Программа построения «поворотной решетки» и получения для неё всевозможных ключей приведена в приложении 1.