алгоритм получения ключей ⇐ ПредыдущаяСтр 3 из 3
Рассмотрим алгоритм получения ключей шифра «поворотная решетка». Для построения решетки достаточно задать - натуральное число больше 1.После чего строится квадрат со стороной и заполняется числами от 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,…, .Поставив в соответствие каждой цифре из такой последовательности номер квадрата в котором она выбрана (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 Все права принадлежат авторам размещенных материалов.
|