Алгоритм криптографического преобразования в режиме простой замены

Описание схемы режима простой замены с использованием частей блоков криптосистемы. Шифрование открытых данных в режиме простой замены. Криптосхема, реализующая алгоритм расшифрования. Шаги составления основного алгоритма, листинг и пример выполнения.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 26.08.2009
Размер файла 924,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Лабораторная Работа

На тему:

«Алгоритм криптографического преобразования в режиме простой замены»

Москва 2009

Содержание

Техническое задание

Описание алгоритма режима простой замены

Схема реализации режима простой замены

Алгоритм

Листинг

Пример выполнения

Литература

Техническое задание

1. Реализовать алгоритм криптографического преобразования в режиме простой замены на языке программирования

2. Провести тест программы.

Описание алгоритма режима простой замены

Для реализации алгоритма шифрования данных в режиме простой замены используется только часть блоков общей криптосистемы (рис. 3.11). Обозначения на схеме:

N1, N2-32-разрядные накопители;

СM1- 32-разрядный сумматор по модулю 232 (?);

СМ2-32-разрядный сумматор по модулю 2 (?);

R-32-разрядный регистр циклического сдвига;

КЗУ - ключевое запоминающее устройство на 256 бит, состоящее из восьми 32-разрядных накопителей Х0, X1, Х2, ..., Х7;

Шифрование открытых данных в режиме простой замены

Рис. 3.11. Схема реализации режима простой замены

Открытые данные, подлежащие зашифрованию, разбивают на 64-разрядные блоки Т0. Процедура зашифрования 64-разрядного блока Т0 в режиме простой замены включает 32 цикла (j = 1... 32). В ключевое запоминающее устройство вводят 256 бит ключа К в виде восьми 32-разрядных подключей (чисел) Ki:

К= K7K6K5K4K3K2K1K0.

Последовательность битов блока

Т0= (а1(0), а2(0), ..., а31(0), а32(0), b1(0), b2(0), ..., b31(0), b32(0))

разбивают на две последовательности по 32 бита: b(0) а(0), где b(0)-левые или старшие биты, а(0)- правые или младшие биты.

Эти последовательности вводят в накопители N1 и N2 перед началом первого цикла зашифрования. В результате начальное заполнение накопителя n1

а(0) = (а32(0), а31(0), ..., а2(0), a1(0)),

32, 31, ... 2, 1 ?номер разряда N1

начальное заполнение накопителя N2

b(0) = (b32(0),b31(0),...,b2(0),b1(0)).

32, 31, ... 2, 1 ? номер разряда N2

Первый цикл (j = 1) процедуры зашифрования 64-разрядного блока открытых данных можно описать уравнениями:

Здесь а (1)-заполнение N1 после 1-го цикла зашифрования; b(1)-заполнение N2 после 1-го цикла зашифрования; f-функция шифрования.

Аргументом функции f является сумма по модулю 232 числа а(0) (начального заполнения накопителя N1) и числа К0-подключа, считываемого из накопителя Х0 КЗУ. Каждое из этих чисел равно 32 битам.

Функция f включает две операции над полученной 32-разрядной суммой (a(0)?K0).

Первая операция называется подстановкой (заменой) и выполняется блоком подстановки S. Блок подстановки S состоит из восьми узлов замены (S-блоков замены) S1, S2, ...,S8 с памятью 64 бит каждый. Поступающий из CM1 на блок подстановки S32-разрядный вектор разбивают на восемь последовательно идущих 4-разрядных векторов, каждый из которых преобразуется в четырехразрядный вектор соответствующим узлом замены. Каждый узел замены можно представить в виде таблицы-перестановки шестнадцати четырехразрядных двоичных чисел в диапазоне 0000...1111. Входной вектор указывает адрес строки в таблице, а число в этой строке является выходным вектором. Затем четырехразрядные выходные векторы последовательно объединяют в 32-разрядный вектор. Узлы замены (таблицы-перестановки), представляют собой ключевые элементы, которые являются общими для сети ЭВМ и редко изменяются. Эти узлы замены должны сохраняться в секрете.

Вторая операция - циклический сдвиг влево (на 11 разрядов) 32-разрядного вектора, полученного с выхода блока подстановки S. Циклический сдвиг выполняется регистром сдвига R.

Далее результат работы функции шифрования f суммируют поразрядно па модулю 2 в сумматоре СМ2 с 32-разрядным начальным заполнением b(0) накопителя N2. Затем полученный на выходе СМ2 результат (значение а(1)) записывают в накопитель N1, а старое значение N1 (значение а(0)) переписывают в накопитель N2 (значение b(1) = а(0)). Первый цикл завершен.

Последующие циклы осуществляются аналогично, при этом во втором цикле из КЗУ считывают заполнение X1-подключ K1, в третьем цикле - подключ К2 и т.д., в восьмом цикле - подключ К7. В циклах с 9-го по 16-й, а также в циклах с 17-го по 24-й подключи из КЗУ считываются в том же порядке: К0, К1, К2,.... К6, К7. В последних восьми циклах с 25-го по 32-й порядок считывания подключей из КЗУ обратный: К7, К6, ..., К2, К1, К0. Таким образом, при зашифровании в 32 циклах осуществляется следующий порядок выборки из КЗУ подключей:

K0, K1, K2, К3, К4, K5, K6, К7, К0, К1, К2, К3, К4, K5, K6, K7,

K0, K1, К2, К3, К4, K5, К6, К7, K7, K6, K5, К4, К3, К2, K1, K0.

В 32-м цикле результат из сумматора СМ2 вводится в накопитель N2, а в накопителе N1 сохраняется прежнее заполнение. Полученные после 32-го цикла зашифрования заполнения накопителей N1 и N2 являются блоком зашифрованных данных Тш, соответствующим блоку открытых данных Т0.

Уравнения зашифрования в режиме простой замены имеют вид:

где a(j) = (a32 (i), a31(j),...., а1( j ))-заполнение N1 после j-гo цикла зашифрования; b(j) = (b32(j), b31(j), …,b1(j))-заполнение N2 после j- гo цикла зашифрования, j = 1... 32.

Блок зашифрованных данных Тш (64 разряда) выводится из накопителей Nl N2 в следующем порядке: из разрядов 1...32 накопителя N1, затем из разрядов 1... 32 накопителя N2, т.е. начиная c младших-разрядов:

Тш= (а1 (32), а2(32), ..., а32(32), b1(32), b2(32), .... b32(32)).

Остальные блоки открытых данных зашифровываются в режиме простой замены аналогично.

Расшифрование в режиме простой замены

Криптосхема, реализующая алгоритм расшифрования в режиме простой замены, имеет тот же вид, что и при зашифровании (см. рис. 3.11).

В КЗУ вводят 256 бит ключа, на котором осуществлялось зашифрование. Зашифрованные данные, подлежащие расшифрованию, разбиты на блоки Тш по 64 бита в каждом. Ввод любого блока

Тш = (a1 (32), а2(32),.... а32(32), b1(32), b2(32),.... b32(32))

в накопители N1 и N2 производят так, чтобы начальное значение накопителя N1 имело вид

32(32),а31(32), ...,а2(32),а1(32)),

32, 31, ..., 2, 1 ? номер разряда N1

а начальное заполнение накопителя N2 - вид

(b32(32)b31(32), ..., b2(32)b1(32)).

32 31, ..., 2, 1 ? номер разряда N2

Расшифрование осуществляется по тому же алгоритму, что и зашифрование, с тем изменением, что заполнения накопителей Х0, Xl ,..., Х7 считываются из КЗУ в циклах расшифрования в следующем порядке:

K0, K1, К2, К3, К4, K5, K6, К7, К7, K6, K5, K4, К3, К2, K1, K0,

K7, K6, K5, К4, K3, К2, K1, K0, K7, K6, K5, K4, K3, K2, K1, K0.

Уравнения расшифрования имеют вид:

Полученные после 32 циклов работы заполнения накопителей N1 и N2 образуют блок открытых данных

Т0 = (a1(0), а2(0), .... а32(0), b1(0), b2(0), ..., b32(0)),

соответствующий блоку зашифрованных данных Тш. При этом состояние накопителя N1

32(0),а31(0),..,а2(0),а1(0)),

32, 31, ..., 2, 1 ? номер разряда N1

состояние накопителя N2

(b32(0)b31(0), ..., b2(0)b1(0)).

32, 31, ..., 2, 1 ? номер разряда N2

Аналогично расшифровываются остальные блоки зашифрованных данных.

Если алгоритм зашифрования в режиме простой замены 64-битового блока Т0 обозначить через А, то

А (Т0) = А (а(0), b(0)) = (а (32), b (32)) =ТШ.

Алгоритм

На входе основного шага определяется 64-битный блок данных N = (N1, N2), где N1 - младшая 32-битовая часть, а N2 - старшая 32-битовая часть. Обе части рассматриваются как отдельные 32-битовые числа. На вход основного шага также поступает один из восьми элементов ключа (какой именно, будет рассказано далее). 32-битовый элемент ключа обозначается за X. Далее производятся следующие действия:

1. S = N1 + X (mod 232).

2. Число S разбивается на 8 частей: S0,S1,S2,S3, S4,S5,S6,S7 по 4 бита каждая, где S0 - младшая, а S7 - старшая части числа S.

3. Для всех i от 0 до 7: Si = T(i, Si), где T(a, b) означает ячейку таблицы замен с номером строки a и номером столбца b (счет с нуля).

4. Новое число S, полученное на предыдущем шаге циклически сдвигается в сторону старших разрядов на 11 бит.

5. S = S xor N2, где xor - операция исключающего или.

6. N2 = N1.

7. N1 = S.

Как результат основного шага криптопреобразования возвращается блок данных N = (N1, N2), где N2 равно исходному N1, а N1 - результат преобразований основного шага.

Берем блок данных N и вызываем последовательно процедуру основного шага криптопреобразования со следующими ключами:

· Для цикла зашифрования (32-З): X0,X1,X2,X3,X4, X5,X6,X7,X0,X1,X2,X3, X4,X5,X6,X7,X0,X1,X2, X3,X4,X5,X6,X7,X7,X6, X5,X4,X3,X2,X1,X0.

· Для цикла расшифрования (32-Р): X0,X1,X2,X3, X4,X5,X6,X7X7,X6,X5, X4,X3,X2,X1,X0X7,X6, X5,X4,X3,X2,X1,X0X7, X6,X5,X4,X3,X2,X1,X0.

Листинг

#include <stdio.h>

typedef unsigned long u4;

typedef unsigned char byte;

typedef struct {

u4 k[8];

/* Constant s-boxes -- set up in gost_init(). */

char k87[256],k65[256],k43[256],k21[256];

} gost_ctx;

/* Note: encrypt and decrypt expect full blocks--padding blocks is

caller's responsibility. All bulk encryption is done in

ECB mode by these calls. Other modes may be added easily

enough. */

void gost_enc(gost_ctx *, u4 *, int);

void gost_dec(gost_ctx *, u4 *, int);

void gost_key(gost_ctx *, u4 *);

void gost_init(gost_ctx *);

void gost_destroy(gost_ctx *);

#ifdef __alpha /* Any other 64-bit machines? */

typedef unsigned int word32;

#else

typedef unsigned long word32;

#endif

kboxinit(gost_ctx *c)

{int i;

byte k8[16] = {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6,

12, 5, 9, 0, 7 };

byte k7[16] = {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2,

13, 12, 0, 5, 10 };

byte k6[16] = {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12,

7, 11, 4, 2, 8 };

byte k5[16] = { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8,

5, 11, 12, 4, 15 };

byte k4[16] = { 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3,

15, 13, 0, 14, 9 };

byte k3[16] = {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3,

4, 14, 7, 5, 11 };

byte k2[16] = { 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9,

7, 5, 10, 6, 1 };

byte k1[16] = {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3,

14, 5, 0, 12, 7 };

for (i = 0; i < 256; i++) {

c->k87[i] = k8[i >> 4] << 4 | k7[i & 15];

c->k65[i] = k6[i >> 4] << 4 | k5[i & 15];

c->k43[i] = k4[i >> 4] << 4 | k3[i & 15];

c->k21[i] = k2[i >> 4] << 4 | k1[i & 15];}}

static word32

f(gost_ctx *c,word32 x)

{x = c->k87[x>>24 & 255] << 24 | c->k65[x>>16 & 255] << 16 |

c->k43[x>> 8 & 255] << 8 | c->k21[x & 255];

/* Rotate left 11 bits */

return x<<11 | x>>(32-11);}

void gostcrypt(gost_ctx *c, word32 *d){

register word32 n1, n2; /* As named in the GOST */

n1 = d[0];

n2 = d[1];

/* Instead of swapping halves, swap names each round */

n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);

n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);

n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);

n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);

n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);

n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);

n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);

n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);

n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);

n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);

n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);

n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);

n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

d[0] = n2; d[1] = n1;}

void

gostdecrypt(gost_ctx *c, u4 *d){

register word32 n1, n2; /* As named in the GOST */

n1 = d[0]; n2 = d[1];

n2 ^= f(c,n1+c->k[0]); n1 ^= f(c,n2+c->k[1]);

n2 ^= f(c,n1+c->k[2]); n1 ^= f(c,n2+c->k[3]);

n2 ^= f(c,n1+c->k[4]); n1 ^= f(c,n2+c->k[5]);

n2 ^= f(c,n1+c->k[6]); n1 ^= f(c,n2+c->k[7]);

n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);

n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);

n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);

n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);

n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);

n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);

n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

n2 ^= f(c,n1+c->k[7]); n1 ^= f(c,n2+c->k[6]);

n2 ^= f(c,n1+c->k[5]); n1 ^= f(c,n2+c->k[4]);

n2 ^= f(c,n1+c->k[3]); n1 ^= f(c,n2+c->k[2]);

n2 ^= f(c,n1+c->k[1]); n1 ^= f(c,n2+c->k[0]);

d[0] = n2; d[1] = n1;}

void gost_enc(gost_ctx *c, u4 *d, int blocks){

int i;

for(i=0;i<blocks;i++){

gostcrypt(c,d);

d+=2;}}

void gost_dec(gost_ctx *c, u4 *d, int blocks){

int i;

for(i=0;i<blocks;i++){

gostdecrypt(c,d);

d+=2;}}

void gost_key(gost_ctx *c, u4 *k){

int i;

for(i=0;i<8;i++) c->k[i]=k[i];}

void gost_init(gost_ctx *c){

kboxinit(c);}

void gost_destroy(gost_ctx *c){

int i;

for(i=0;i<8;i++) c->k[i]=0;}

int main(){

gost_ctx gc;

u4 k[8],data[10];

int i;

/* Initialize GOST context. */

gost_init(&gc);

/* Prepare key--a simple key should be OK, with this many

rounds! */

for(i=0;i<8;i++) k[i] = i;

gost_key(&gc,k);

/* Try some test vectors. */

data[0] = 0; data[1] = 0;

gostcrypt(&gc,data);

printf("Enc of zero vector: %08lx %08lx\n",data[0],data[1]);

gostcrypt(&gc,data);

printf("Enc of above: %08lx %08lx\n",data[0],data[1]);

data[0] = 0xffffffff; data[1] = 0xffffffff;

gostcrypt(&gc,data);

printf("Enc of ones vector: %08lx %08lx\n",data[0],data[1]);

gostcrypt(&gc,data);

printf("Enc of above: %08lx %08lx\n",data[0],data[1]);

/* Init data */

for(i=0;i<10;i++) data[i]=i;

/* Encrypt data as 5 blocks. */

gost_enc(&gc,data,5);

/* Display encrypted data. */

for(i=0;i<10;i+=2) printf("Block %02d = %08lx %08lx\n",

i/2,data[i],data[i+1]);

/* Decrypt in different sized chunks. */

gost_dec(&gc,data,1);

gost_dec(&gc,data+2,4);

printf("\n");

/* Display decrypted data. */

for(i=0;i<10;i+=2) printf("Block %02d = %08lx %08lx\n",

i/2,data[i],data[i+1]);

gost_destroy(&gc);

return 0;}

Пример выполнения

Литература

1. В.В. Подбельский, С.С. Фомин «Язык программирования Си»


Подобные документы

  • Принцип работы и назначение основного шага криптопреобразования, его параметры, базовые циклы и их принципиальное устройство. Пошаговый алгоритм действия криптопреобразования. Пример реализации процесса криптопреобразования в режиме простой замены.

    лабораторная работа [1,1 M], добавлен 26.08.2009

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

    реферат [823,8 K], добавлен 26.12.2011

  • Принцип работы и программная реализация однозвучного, одноалфавитного и полиграммного шифра. Шифрование по методу подстановки, замены и кодового слова. Безопасность шифровки простой замены. Частотные характеристики текстовых сообщений и дешифрация.

    контрольная работа [1,1 M], добавлен 02.02.2012

  • Основные требования к разрабатываемым программам и исходным текстовым файлам. Характеристика шифров замены. Укрупненные структурные схемы и коды программ шифрования и дешифрования, скриншоты их выполнения. Пример зашифрованного текста и его дешифрования.

    курсовая работа [556,8 K], добавлен 14.01.2013

  • Операторы генетического алгоритма. Пример простейшей программы. Процесс генерации и накопления информации о выживании и продолжении рода в ряде поколений популяции. Программа, реализующая простой генетический алгоритм для нахождения минимума функции.

    курсовая работа [39,3 K], добавлен 29.10.2012

  • Симметричная криптосистема, шифрование открытых данных в режиме гаммирования. Уравнение расшифрования и его значение. Формирование ключа в режиме "электронная кодовая книга" и перевод его в двоичный вид. Удаление контрольных бит и определение матрицы.

    контрольная работа [418,6 K], добавлен 21.10.2011

  • Понятие шифров сложной замены. Шифры сложной замены называют многоалфавитными. Данная подстановка последовательно и циклически меняет используемые алфавиты. Понятие схемы шифрования Вижинера. Стойкость шифрования методом гаммирования и свойство гаммы.

    реферат [52,2 K], добавлен 22.06.2010

  • Функциональное и эксплуатационное назначение данного изделия. Требования к составу и параметрам технических средств. Описание алгоритма ГОСТ 28147-89 в режиме гаммирования. Технико-экономические показатели разработки. Интерфейс программного продукта.

    курсовая работа [1,7 M], добавлен 27.02.2015

  • Схема работы и требования к программам шифрования и дешифрования. Алгоритмы и тексты программы шифрования и программы дешифрования, выполненные на языке программирования C/C++. Содержание файла с исходным текстом, с шифротекстом, с дешифрованным текстом.

    курсовая работа [24,7 K], добавлен 20.10.2014

  • Пример создания базы данных "Диспетчерская служба такси". Моделирование элементов системы. Концептуальные требования, нормализация таблицы. Создание структурной схемы базы данных, таблиц в режиме конструктора. Простой, перекрестный, повторяющийся запрос.

    курсовая работа [2,9 M], добавлен 21.04.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.