Обобщенный метод шифрования “решетка Кардано”
Недостатком классического метода является формирование шифртекста слева направо, сверху вниз. Очевидно, что он достаточно легко раскрывается -граммным криптоанализом (чтение в колонках).
Усилить алгоритм можно:
Избавлением от последовательного вписывания в «окна» решетки-ключа.
Избавлением от последовательного поворота решетки по или против часовой стрелке.
Использование алгоритма в -мерном пространстве.
Искусственным усложнением алгоритма в рамках языка программирования.
Очевидно,
что при использовании произвольной
последовательности маршрута перестановок
увеличится размер ключа, причем в разы.
Это усиление даёт увеличение всех
возможных вариантов ключей в
раз
(
–
сторона квадрата), что очень значительно.
Вывод формулы всех возможных ключей в классической решетке Кардано
Решетка
состоит из уровней, их в два раза меньше
, чем сторона квадрата. Количество
элементов входящих в
–
ый
уровень равно
.
Количество “окон” на уровне
.
Каждое
из “окон” на уровне может быть в четырех
местах, следовательно, все “окна” на
–
ом
уровне могут быть в
состояниях. Во всей решетке со стороной
количество ключей равно произведению
числа всех состояний на всех уровнях
.
Возведение в степень можно заменить суммированием степеней
.
-
сумма арифметической прогрессии,
она равна
.
Число всех ключей равно
.
Алгоритм получения ключей
Рассмотрим алгоритм получения ключей шифра «поворотная решетка».
Для
построения решетки достаточно задать
- натуральное число больше 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.
