Здавалка
Главная | Обратная связь

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



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

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


         
   
                   
    z z            

 

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

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,…, .Поставив в соответствие каждой цифре из такой последовательности номер квадрата в котором она выбрана (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.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.