Разработка программной реализации криптографического алгоритма ГОСТ 28147-89 в режиме гаммирования с обратной связью

 















Тема: «Разработка программной реализации криптографического алгоритма ГОСТ 28147-89 в режиме гаммирования с обратной связью»


Оглавление


1. Постановка задачи на проектирование

2. Описание компонентов сети конфиденциальной связи

2.1 Система распределения ключей на основе линейных преобразований (основная)

.2 Система распределения ключей на основе алгоритма Диффи и Хелмана (резервная)

.3 Отечественный алгоритм шифрования данных (ГОСТ 28147-89). Режим гаммирования с обратной связью

. Данные по скоростным качествам алгоритма шифрования

4. Результаты расчетов криптостойкости алгоритма шифрования

Заключение

Приложение


1. Постановка задачи на проектирование


В соответствии с исходными данными необходимо разработать систему засекреченной связи на основе использования симметричного блочного алгоритма ГОСТ 28147-89 в режиме с обратной связью при этом обеспечить распределение основных сеансовых ключей на основе линейных преобразований, а распределение резервных - с применением алгоритма Диффи и Хелмана.

Исходные данные (вариант №6)

  1. ГОСТ 28147 - 89 гаммирование с обратной связью;
  2. Число выдерживаемых компрометаций - 6;
  3. Простое число Р - 61;

(ADC69D1E91EE65C6712E0764E9F2F4C69A80B8EE9D5AFB36DA023A881BAE256F)

. Количество пользователей конфиденциальной сети -50000;


2. Описание компонентов сети конфиденциальной связи


.1 Система распределения ключей на основе линейных преобразований. (основная)


. ЦРК генерирует и рассылает пользователям их открытые ключи:


Рi = (Рi 1, Рi 2,….,Рi L),


где i=1,2,…,V (количество пользователей);

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

выбирается случайное число а (16 битовое основание);

вектор адресов рассчитывается следующим образом:


Рi = (ai, ai*2 ,…., ai*L),


где i=1,2,…,V , а L - количество компрометаций;

- размер Рij составляет 16 бит (максимальное значение 65535), что определяет количество пользователей (в задании 50000);

2. ЦРК генерирует L*L симметричную случайную матрицу Т=(m*n), где элементы матрицы tmn выбираются равновероятными и взаимонезависимыми, и имеют размерность равную длине ключа (256 бит).

. ЦРК генерирует и рассылает по конфиденциальным каналам связи каждому пользователю его секретный ключ:


Si = T*PiT;


4. Формирование парного ключа между i и j пользователем происходит следующим образом:

i пользователь извлекает из запоминающего устройства открытый адрес пользователя j и формирует парный ключ на основе своего секретного ключа Si:


Кij = Si*PjT;


j пользователь извлекает из запоминающего устройства открытый адрес пользователя i и формирует парный ключ на основе своего секретного ключа Sj:


Кji = Sj*PiT;


В виду симметричности матрицы Т ключи Кij и Kji будут равными. Далее ключ поступает в ключевое устройство блока шифрации алгоритма ГОСТ 28147-89.


.2 Система распределения ключей на основе алгоритма Диффи и Хелмана (резервная)


1. Пользователи сети заранее уславливаются о модуле Р (большом простом числе размерности 256 бит) и примитивном элементе gÎZp (в курсовом проекте g выбирается как корень из единицы степени N по модулю P и имеет размерность 128 бит).

2. Для установления связи между i и j пользователем они заранее выбирают собственные секретные ключи X и Y (256 бит).

. Далее пользователь i вычисляет открытый ключ:


Кi = gX(mod P),


а пользователь j - открытый ключ:


Кj = gY(mod P).


. Обменявшись открытыми ключами, пользователи вычисляют общий секретный ключ:

пользователь i: Кij = (gX)Y(mod P);

пользователь j: Кji = (gY)X(mod P);

Очевидно, ключи Кij и Kji будут равными. Далее ключ поступает в ключевое устройство блока шифрации алгоритма ГОСТ 28147-89.


.3 Отечественный алгоритм шифрования данных (ГОСТ 28147-89). Режим гаммирования с обратной связью


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

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

Открытые данные, разбитые на 64-разрядные блоки зашифровываются в режиме гаммирования с обратной связью путем поразрядного суммирования по модулю 2 в сумматоре СМ5 с гаммой шифра Гш, которая вырабатывается блоками по 64 бита, т.е. где М определяется объемом открытых данных,_ i-й 64-разрядный блок, Число двоичных разрядов в блоке может быть меньше 64.

В КЗУ вводятся 256 бит ключа. Синхропосылка S = (S1, S2,..., S64) из 64 бит вводится в N1 и N2. Исходное заполнение N1 и N2 зашифровывается в режиме простой замены. Полученное в результате зашифрования заполнение N1 и N2 образует первый 64-разрядный блок гаммы шифра который суммируется поразрядно по модулю 2 в сумматоре СМ5 с первым 64-разрядным блоком открытых данных

В результате получается 64-разрядный блок зашифрованных данных



Блок зашифрованных данных одновременно является также исходным состоянием N1, N2 для выработки второго блока гаммы шифра и по обратной связи записывается в указанные накопители. При этом значение вводится в 1-й разряд N1, значение вводится во 2-й разряд N1 и т.д. значение вводится в 32-й разряд N1; значение вводится в 1-й разряд N2, значение вводится во 2-й разряд N2 и т.д., значение вводится в 32-й разряд N2.

Заполнение N1, N2 зашифровывается в режиме простой замены в соответствии с требованиями ГОСТ 28147-89. Полученное в результате зашифрования заполнение N1, N2 образует второй 64-разрядный блок гаммы шифра , который суммируется поразрядно по модулю 2 в сумматоре СМ5 со вторым блоком открытых данных

Выработка последующих блоков гаммы шифра и зашифрование соответствующих блоков открытых данных производится аналогично. Если длина последнего М-го блока открытых данных меньше 64 разрядов, то из используется только соответствующее число разрядов гаммы шифра, остальные разряды отбрасываются.

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


В канал связи или память ЭВМ передаются синхропосылка S и блоки зашифрованных данных

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

При расшифровании криптосхема имеет тот же вид (см. рис. 1.1), что и при зашифровании. В КЗУ вводятся 256 бит того же ключа, на котором осуществлялось зашифрование . Синхропосылка S вводится в N1 и N2.

Исходное заполнение N1, N2 (синхропосылка S) зашифровывается в режиме простой замены. Полученное в результате зашифрования N1, N2 образует первый блок гаммы шифра который суммируется поразрядно по модулю 2 в сумматоре СМ5 с блоком зашифрованных. В результате получается первый блок данных открытых данных

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

Аналогично в N1, N2 последовательно записываются блоки зашифрованных данных , из которых в режиме простой замены вырабатываются блоки гаммы шифра . Блоки гаммы шифра суммируются поразрядно по модулю 2 в сумматоре СМ5 с блоками зашифрования данных , в результате получаются блоки открытых данных , при этом длина последнего блока открытых данных может содержать меньше 64 разрядов.

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



Рис. 1.1

Правила суммирования по модулю 232 и по модулю (232-1)

. Два целых числа a, b, где , представленные в двоичном виде

a = (a32, a31, ... , a2, a1), b = (b32, b31, ... , b2, b1),

т.е. a = a32231 + a31230 + ... + a22 + a1, b = b32231 + b31230 + ... + b22 + b1,

суммируются по модулю 232(операция ) по следующему правилу:

a b = a + b, если a + b < 232,

a b = a + b - 232, если a + b ³ 232

где операция +(-) есть арифметическая сумма(разность) двух целых чисел.

. Два целых числа a,b, где 0 £ a, b £ 232-1, представленные в двоичном виде a = (a32, a31, ... ,a2, a1), b = (b32, b31, ... ,b2, b1),

суммируются по модулю (232 - 1) (операция ¢) по следующему правилу:

a ¢ b = a + b, если a + b < 232,¢ b = a + b - 232 +1 , если a + b ³ 232.


3. Данные по скоростным качествам алгоритма шифрования


Листинг программной реализации криптографической системы представлен в приложении 1.

Работа программы осуществляется из командной строки:

> 28147_3.exe FileName.*,

где FileName.* - любой файл содержащий шифруемые данные.

Выходными данными работы программы являются:

FileName.crp - файл с зашифрованным сообщением;

-FileName.dcr - файл с расшифрованным сообщением;

FileName.key - файл-отчет, содержащий ключевую информацию (резервную и основную), а также некоторые характеристики процесса шифрования;

Вариант содержания файла-отчета FileName.key

== Исходные данные для шифрации == 1. Основные: Адрес первого абонента (№ 31945): ADRESS1 = 9FB2 FB62 44F5 485E E080 250C Адрес второго абонента (№ 25334): ADRESS2 = D15F EC7D 90CD 8F80 35DD 9610 Сеансовые ключи абонентов: К12 = C38D498F9E8DF8A9D077AD4E5606AE8600260E7189E60907011BC088E61C6411 К21 = C38D498F9E8DF8A9D077AD4E5606AE8600260E7189E60907011BC088E61C6411 Cинхропосылка : SYN = 04E21970 10C943E8 2. Резервные: P = 9D1EADC665C691EE0764712EF4C6E9F2B8EE9A80FB369D5A3A88DA02256F1BAE GEN = 76F8746A46E440E32F4E28D91CA73F3D X = 69F143C92C9F64516D4B43560E7C75FD Y = 203F1D35344D054C23D20AFE4FFB2630 Сеансовый ключ: KEY = 6FBC94F893EEE6EFD32B8CBD7F4BF87B9DE7D369FCC1A1BC7F900869C045EA95 Cинхропосылка : SYN = 04E21970 10C943E8 == Характеристики процесса шифрации == Размер сообщения (кбайт) - 9862.410 Время шифрации (в секундах) - 19.670 Скорость шифрации (кбайт/с) - 501.385 Обработка велась в резервном режиме.

При расчете скорости шифрования учитывалось общее время криптографического преобразования исходного сообщения и запись полученной шифрограммы в файл. Программа реализована в среде алгоритмического программирования Borland C++ 5.02, и применение программного языка Assembler позволит увеличить скорость шифрования приблизительно до 1,5 Мб/с. Аппаратная реализация данной системы конфиденциальной связи увеличит скорость до 10 Мб/с и более, что делает предпочтительным применение оптоволоконных линий связи, но повысит расходы на построение сети.


4. Результаты расчетов криптостойкости алгоритма шифрования

шифрование конфиденциальный связь преобразование

При использовании метода линейных преобразований для формирования общего ключа (основной режим) выбор размера используемых матриц определялся исходя из заданного количества выдерживаемых компрометаций (L=6). Таким образом, симметричная матрица Т имеет размерность Т[6,6] и длину каждого элемента матрицы равную длине ключа шифрования (256 бит), используемой в ГОСТ 28147-89. Элементы матрицы генерировались равновероятно и взаимонезависимо.

Адреса абонентов являются векторами вида Рi=(P1i,P2i, …,PLi), где L = 6. Размер каждого элемента адреса равен 16 битам, что определяется максимальным количеством абонентов конфиденциальной сети (216 > 50000). Адрес каждого пользователя рассчитывается так, чтобы элементы вектора были линейно-независимыми.

При выполнении данных условий сформированные секретные ключи Si каждого пользователя сети будут также равновероятными и линейно-независимыми, что является необходимым условием криптостойкости на основе заданного числа компрометаций. Если же нарушитель перехватил (или ему стали известны) более 6 секретных ключей и соответствующих им адресов абонентов, то система конфиденциальной связи считается раскрытой, так как могут быть вычислены любые оставшиеся секретные ключи.

При использовании алгоритма Диффи и Хелмана для формирования сеансового ключа (резервный режим) использовались следующие данные:

Р - большое 256 битовое простое число (модуль);

-g - генератор поля Zp (в КП выбран случайным образом и имеет длину 128 бит, т. е. является корнем из единицы степени N по модулю Р);

X и Y - случайные числа размерности 128 бит;

Kij - сеансовый ключ, имеющий длину 256 бит;

Криптостойкость данной схемы распределения основывается на трудности решения задачи дискретного логарифмирования. Для ключа 256 бит задача практически неразрешима. Таким образом, выбор значений N и g имеет существенное влияние на безопасность этой системы. Число (N-1)/2 также должно быть большим простым числом, а число g должно быть генератором большой подгруппы мультипликативной группы по модулю N.

При обмене ключами по незащищенным каналам связи необходимо убедиться, что абонент А получил ключ именно от абонента B, и наоборот. Эта проблема решается с помощью электронной цифровой подписи.

В качестве криптосистемы в рамках курсового проекта используется криптосистема блочного шифрования с обратной связью, которой является алгоритм шифрования ГОСТ 28147-89. Используемая длина ключа равна 256 битам, и определяет криптостойкость данной системы. Достоинством данной схемы шифрования является возможность применения ее для обнаружения манипуляций сообщениями, производимых активными перехватчиками. При этом используется факт размножения ошибок. Однако размножение ошибок можно отнести и к недостаткам такого шифра. Схему шифрования с обратной связью следует применять для криптографического преобразования больших массивов данных (сообщений).


Заключение


Данная работа не преследует цели реализации реальной системы конфиденциальной связи, а предполагает лишь разработку модели ее функционирования, используя реальные алгоритмы и длины ключей.

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


Приложение


#include <io.h>

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#include <fstream.h>

#include <math.h>

#include <time.h>

#include <string.h>

#include <stdlib.h>unsigned long DWord; // Двойное слово;unsigned int Word; // слово;unsigned char HWord; // Половина слова;FILESIZE (FILE *flow);a_in_P_modN (DWord a, DWord r, DWord N);ADDFILE (FILE *flow,short ost,DWord MES[2]);DICRIMENT (Word P[32],Word Q[32],Word RES[32]);MULTIPLE (Word Mn1[16],Word Mn2[16],Word RES[32],Word R);X_in_Y_modN (Word a[16],Word r[16],Word MODULE[16],Word RES[16]);TAKE_MODULE(Word NUMBER[32],Word OST[16],Word MOD[16]);SUMMA (Word P[16],Word Q[16],Word RES[16]);DATE {num;byte[4];

}ptr;Result_Long_Word{BL32;BL16[2];

}W_ptr;part[8];main (int argc, char *argv[])

{

//--------------Программа реализации алгоритма шифрования ГОСТ 28147-89-------

//--------------в режиме обратной связи на основе алгоритма распределения-------

//--------------ключей c использованием линейных преобразований (основной)-------

//------------------------------и Диффи-Хелмана (запасной)----------------------

//----------------------------------Блок исходных данных-------------------------

clrscr();();*keystream;*datastream;*crptstream;*decrptstream;i=0,j=0,m=0,n=0,t=0;_t start,end;GAMMA[3];MESSAGE[2],CRT_MESSAGE[2];SYN[2];KEY_MAS[32];Y[16]={0x0,},X[16]={0x0,},GEN[16]={0x0,},A_KEY[16],B_KEY[16];P[16]={0x1BAE,0x256F,0xDA02,0x3A88,0x9D5A,0xFB36,0x9A80,0xB8EE,

xE9F2,0xF4C6,0x712E,0x0764,0x91EE,0x65C6,0xADC6,0x9D1E};T[6][6][16]={{{0x0,},},};ADRESS1[6][16]={{0x0,},},RES1[16]={0x0,},S1[6][16]={{0x0,},};ADRESS2[6][16]={{0x0,},},RES2[16]={0x0,},S2[6][16]={{0x0,},};K12[16]={0x0,},K21[16]={0x0,};L=0,a=1,user1,user2;size, file_size, length=0;ostatok, double prog_time;const S[1024] = {0xE4,0xEA,0xE9,0xE2,0xED,0xE8,0xE0,0xEE,0xE6,0xEB,0xE1,0xEC,0xE7,0xEF,0xE5,0xE3,

xB4,0xBA,0xB9,0xB2,0xBD,0xB8,0xB0,0xBE,0xB6,0xBB,0xB1,0xBC,0xB7,0xBF,0xB5,0xB3,

x44,0x4A,0x49,0x42,0x4D,0x48,0x40,0x4E,0x46,0x4B,0x41,0x4C,0x47,0x4F,0x45,0x43,

xC4,0xCA,0xC9,0xC2,0xCD,0xC8,0xC0,0xCE,0xC6,0xCB,0xC1,0xCC,0xC7,0xCF,0xC5,0xC3,

x64,0x6A,0x69,0x62,0x6D,0x68,0x60,0x6E,0x66,0x6B,0x61,0x6C,0x67,0x6F,0x65,0x63,

xD4,0xDA,0xD9,0xD2,0xDD,0xD8,0xD0,0xDE,0xD6,0xDB,0xD1,0xDC,0xD7,0xDF,0xD5,0xD3,

xF4,0xFA,0xF9,0xF2,0xFD,0xF8,0xF0,0xFE,0xF6,0xFB,0xF1,0xFC,0xF7,0xFF,0xF5,0xF3,

xA4,0xAA,0xA9,0xA2,0xAD,0xA8,0xA0,0xAE,0xA6,0xAB,0xA1,0xAC,0xA7,0xAF,0xA5,0xA3,

x24,0x2A,0x29,0x22,0x2D,0x28,0x20,0x2E,0x26,0x2B,0x21,0x2C,0x27,0x2F,0x25,0x23,

x34,0x3A,0x39,0x32,0x3D,0x38,0x30,0x3E,0x36,0x3B,0x31,0x3C,0x37,0x3F,0x35,0x33,

x84,0x8A,0x89,0x82,0x8D,0x88,0x80,0x8E,0x86,0x8B,0x81,0x8C,0x87,0x8F,0x85,0x83,

x14,0x1A,0x19,0x12,0x1D,0x18,0x10,0x1E,0x16,0x1B,0x11,0x1C,0x17,0x1F,0x15,0x13,

x04,0x0A,0x09,0x02,0x0D,0x08,0x00,0x0E,0x06,0x0B,0x01,0x0C,0x07,0x0F,0x05,0x03,

x74,0x7A,0x79,0x72,0x7D,0x78,0x70,0x7E,0x76,0x7B,0x71,0x7C,0x77,0x7F,0x75,0x73,

x54,0x5A,0x59,0x52,0x5D,0x58,0x50,0x5E,0x56,0x5B,0x51,0x5C,0x57,0x5F,0x55,0x53,

x94,0x9A,0x99,0x92,0x9D,0x98,0x90,0x9E,0x96,0x9B,0x91,0x9C,0x97,0x9F,0x95,0x93,

x75,0x78,0x71,0x7D,0x7A,0x73,0x74,0x72,0x7E,0x7F,0x7C,0x77,0x76,0x70,0x79,0x7B,

xD5,0xD8,0xD1,0xDD,0xDA,0xD3,0xD4,0xD2,0xDE,0xDF,0xDC,0xD7,0xD6,0xD0,0xD9,0xDB,

xA5,0xA8,0xA1,0xAD,0xAA,0xA3,0xA4,0xA2,0xAE,0xAF,0xAC,0xA7,0xA6,0xA0,0xA9,0xAB,

x15,0x18,0x11,0x1D,0x1A,0x13,0x14,0x12,0x1E,0x1F,0x1C,0x17,0x16,0x10,0x19,0x1B,

x05,0x08,0x01,0x0D,0x0A,0x03,0x04,0x02,0x0E,0x0F,0x0C,0x07,0x06,0x00,0x09,0x0B,

x85,0x88,0x81,0x8D,0x8A,0x83,0x84,0x82,0x8E,0x8F,0x8C,0x87,0x86,0x80,0x89,0x8B,

x95,0x98,0x91,0x9D,0x9A,0x93,0x94,0x92,0x9E,0x9F,0x9C,0x97,0x96,0x90,0x99,0x9B,

xF5,0xF8,0xF1,0xFD,0xFA,0xF3,0xF4,0xF2,0xFE,0xFF,0xFC,0xF7,0xF6,0xF0,0xF9,0xFB,

xE5,0xE8,0xE1,0xED,0xEA,0xE3,0xE4,0xE2,0xEE,0xEF,0xEC,0xE7,0xE6,0xE0,0xE9,0xEB,

x45,0x48,0x41,0x4D,0x4A,0x43,0x44,0x42,0x4E,0x4F,0x4C,0x47,0x46,0x40,0x49,0x4B,

x65,0x68,0x61,0x6D,0x6A,0x63,0x64,0x62,0x6E,0x6F,0x6C,0x67,0x66,0x60,0x69,0x6B,

xC5,0xC8,0xC1,0xCD,0xCA,0xC3,0xC4,0xC2,0xCE,0xCF,0xCC,0xC7,0xC6,0xC0,0xC9,0xCB,

xB5,0xB8,0xB1,0xBD,0xBA,0xB3,0xB4,0xB2,0xBE,0xBF,0xBC,0xB7,0xB6,0xB0,0xB9,0xBB,

x25,0x28,0x21,0x2D,0x2A,0x23,0x24,0x22,0x2E,0x2F,0x2C,0x27,0x26,0x20,0x29,0x2B,

x55,0x58,0x51,0x5D,0x5A,0x53,0x54,0x52,0x5E,0x5F,0x5C,0x57,0x56,0x50,0x59,0x5B,

x35,0x38,0x31,0x3D,0x3A,0x33,0x34,0x32,0x3E,0x3F,0x3C,0x37,0x36,0x30,0x39,0x3B,

x46,0x4C,0x47,0x41,0x45,0x4F,0x4D,0x48,0x44,0x4A,0x49,0x4E,0x40,0x43,0x4B,0x42,

xB6,0xBC,0xB7,0xB1,0xB5,0xBF,0xBD,0xB8,0xB4,0xBA,0xB9,0xBE,0xB0,0xB3,0xBB,0xB2,

xA6,0xAC,0xA7,0xA1,0xA5,0xAF,0xAD,0xA8,0xA4,0xAA,0xA9,0xAE,0xA0,0xA3,0xAB,0xA2,

x06,0x0C,0x07,0x01,0x05,0x0F,0x0D,0x08,0x04,0x0A,0x09,0x0E,0x00,0x03,0x0B,0x02,

x76,0x7C,0x77,0x71,0x75,0x7F,0x7D,0x78,0x74,0x7A,0x79,0x7E,0x70,0x73,0x7B,0x72,

x26,0x2C,0x27,0x21,0x25,0x2F,0x2D,0x28,0x24,0x2A,0x29,0x2E,0x20,0x23,0x2B,0x22,

x16,0x1C,0x17,0x11,0x15,0x1F,0x1D,0x18,0x14,0x1A,0x19,0x1E,0x10,0x13,0x1B,0x12,

xD6,0xDC,0xD7,0xD1,0xD5,0xDF,0xDD,0xD8,0xD4,0xDA,0xD9,0xDE,0xD0,0xD3,0xDB,0xD2,

x36,0x3C,0x37,0x31,0x35,0x3F,0x3D,0x38,0x34,0x3A,0x39,0x3E,0x30,0x33,0x3B,0x32,

x66,0x6C,0x67,0x61,0x65,0x6F,0x6D,0x68,0x64,0x6A,0x69,0x6E,0x60,0x63,0x6B,0x62,

x86,0x8C,0x87,0x81,0x85,0x8F,0x8D,0x88,0x84,0x8A,0x89,0x8E,0x80,0x83,0x8B,0x82,

x56,0x5C,0x57,0x51,0x55,0x5F,0x5D,0x58,0x54,0x5A,0x59,0x5E,0x50,0x53,0x5B,0x52,

x96,0x9C,0x97,0x91,0x95,0x9F,0x9D,0x98,0x94,0x9A,0x99,0x9E,0x90,0x93,0x9B,0x92,

xC6,0xCC,0xC7,0xC1,0xC5,0xCF,0xCD,0xC8,0xC4,0xCA,0xC9,0xCE,0xC0,0xC3,0xCB,0xC2,

xF6,0xFC,0xF7,0xF1,0xF5,0xFF,0xFD,0xF8,0xF4,0xFA,0xF9,0xFE,0xF0,0xF3,0xFB,0xF2,

xE6,0xEC,0xE7,0xE1,0xE5,0xEF,0xED,0xE8,0xE4,0xEA,0xE9,0xEE,0xE0,0xE3,0xEB,0xE2,

x1D,0x1B,0x14,0x11,0x13,0x1F,0x15,0x19,0x10,0x1A,0x1E,0x17,0x16,0x18,0x12,0x1C,

xFD,0xFB,0xF4,0xF1,0xF3,0xFF,0xF5,0xF9,0xF0,0xFA,0xFE,0xF7,0xF6,0xF8,0xF2,0xFC,

xDD,0xDB,0xD4,0xD1,0xD3,0xDF,0xD5,0xD9,0xD0,0xDA,0xDE,0xD7,0xD6,0xD8,0xD2,0xDC,

x0D,0x0B,0x04,0x01,0x03,0x0F,0x05,0x09,0x00,0x0A,0x0E,0x07,0x06,0x08,0x02,0x0C,

x5D,0x5B,0x54,0x51,0x53,0x5F,0x55,0x59,0x50,0x5A,0x5E,0x57,0x56,0x58,0x52,0x5C,

x7D,0x7B,0x74,0x71,0x73,0x7F,0x75,0x79,0x70,0x7A,0x7E,0x77,0x76,0x78,0x72,0x7C,

xAD,0xAB,0xA4,0xA1,0xA3,0xAF,0xA5,0xA9,0xA0,0xAA,0xAE,0xA7,0xA6,0xA8,0xA2,0xAC,

x4D,0x4B,0x44,0x41,0x43,0x4F,0x45,0x49,0x40,0x4A,0x4E,0x47,0x46,0x48,0x42,0x4C,

x9D,0x9B,0x94,0x91,0x93,0x9F,0x95,0x99,0x90,0x9A,0x9E,0x97,0x96,0x98,0x92,0x9C,

x2D,0x2B,0x24,0x21,0x23,0x2F,0x25,0x29,0x20,0x2A,0x2E,0x27,0x26,0x28,0x22,0x2C,

x3D,0x3B,0x34,0x31,0x33,0x3F,0x35,0x39,0x30,0x3A,0x3E,0x37,0x36,0x38,0x32,0x3C,

xED,0xEB,0xE4,0xE1,0xE3,0xEF,0xE5,0xE9,0xE0,0xEA,0xEE,0xE7,0xE6,0xE8,0xE2,0xEC,

x6D,0x6B,0x64,0x61,0x63,0x6F,0x65,0x69,0x60,0x6A,0x6E,0x67,0x66,0x68,0x62,0x6C,

xBD,0xBB,0xB4,0xB1,0xB3,0xBF,0xB5,0xB9,0xB0,0xBA,0xBE,0xB7,0xB6,0xB8,0xB2,0xBC,

x8D,0x8B,0x84,0x81,0x83,0x8F,0x85,0x89,0x80,0x8A,0x8E,0x87,0x86,0x88,0x82,0x8C,

xCD,0xCB,0xC4,0xC1,0xC3,0xCF,0xC5,0xC9,0xC0,0xCA,0xCE,0xC7,0xC6,0xC8,0xC2,0xCC

};

//------------------Подготовка необходимых файлов-----------------------------------((datastream = fopen( argv[1], "rb")) == NULL){ << " Файл " << argv[1] << " не найден .\n";

return 1;

}extention[4]="crp";extention[3]=NULL;*point = ".";*rout;(rout,argv[1]);=strcspn(rout,point);[length+1]=NULL; strcat(rout,extention);((crptstream = fopen (rout,"w+b")) == NULL){ << " Файл "<<rout<<" не найден .\n";

return 1;

}[0]='d';extention[1]='c';extention[2]='r';extention[3]=NULL;[length+1]=NULL; strcat(rout,extention);((decrptstream = fopen ( rout , "w+b"))==NULL)

{ cout << " Файл "<<rout<<" невозможно открыть.\n";

return 1;

}[0]='k';extention[1]='e';extention[2]='y';extention[3]=NULL;[length+1]=NULL; strcat(rout,extention);((keystream = fopen (rout,"w+t"))==NULL){ << " Файл "<<rout<<" невозможно открыть.\n";

return 1;

}(i=0;i<10;i++)<<endl;

cout<<" Идет обработка сообщения. "<<endl;

cout<<" Please, wait! ";

//--------------Блок генерации и распределения ключей на основе -----------------

//-------------------------линейных преобразований-------------------------------

//-------------------------------(основной)--------------------------------------

// 1. Генерация симетричной матрицы Т из равновероятных элементов tij:

for(t=0;t<6;t++){(int i=L;i<6;i++){(int j=0;j<16;j++){[t][i][j]=(DWord)rand()%0xFFFF;[i][t][j]=T[t][i][j];

}

}

L++;

}

// 2. Формирование открытых адресов пользователей:

while(a==1)

a=rand()%0xFFFF; // выбор основания а;

user1=rand()%0xC351; // случайный выбор двух

user2=rand()%0xC351; // из 50.000 пользователей;

for(j=0;j<6;j++){[j][0]=a_in_P_modN(a,user1*(j+1),0xFFFF);[j][0]=a_in_P_modN(a,user2*(j+1),0xFFFF);

}

// 3. Формирование секретных ключей пользователей:

for(t=0;t<6;t++){

f or(i=0;i<6;i++){(T[t][i],ADRESS2[i],RES2,16);(S2[t],RES2,S2[t]);(T[t][i],ADRESS1[i],RES1,16);(S1[t],RES1,S1[t]);

}

}

// 4. Формирование общего сеансового ключа К12=К21:

for(i=0;i<6;i++){(S1[i],ADRESS2[i],RES1,16);(K12,RES1,K12);(S2[i],ADRESS1[i],RES2,16);(K21,RES2,K21);

}*Key_USER1=(DWord*)(K12);*Key_USER2=(DWord*)(K21);

//--------------Блок генерации и распределения ключей на основе алгоритма--------

//--------------------------------Диффи-Хелмана----------------------------------

//---------------------------------(резервный)-----------------------------------

// 1. Выбор общего генератора поля (128 бит):

for(j=0;j<8;j++)[j]=rand()%0xFFFF;

// 2. Абонент А генерирует случайное число Х(128 бит) и выч. GEN^X(mod P):(j=0;j<8;j++)[j]=rand()%0xFFFF;_in_Y_modN (GEN,X,P,A_KEY);

// 3. Абонент Б генерирует случайное число Y(128 бит) и выч. GEN^Y(mod P):(j=0;j<8;j++)[j]=rand()%0xFFFF;_in_Y_modN (GEN,Y,P,B_KEY);

// 4. Вычисление сеансового ключа:(A_KEY,B_KEY,KEY_MAS,32);_MODULE(KEY_MAS,KEY_MAS,P);*KEYS=(DWord*)(KEY_MAS);

//--------------------Блок шифрации и дешифрации сообщения-----------------------

// 1. Генерация синхропосылки и установка нач.заполнения регистров N1 и N2:

for(j=0;j<2;j++){[j]=((DWord)rand()%0xFFFF)*((DWord)rand()%0xFFFF);[j]=SYN[j];

}

// 2. Шифрация и дешифрация сообщения:

char reserv; // резервное распределение ключей;

int FELUER=rand()%2;(FELUER==1)eserv='Y';='N'; action='Ш'; // действие-шифрация;

for(int act=0;act<2;act++){(act==1){

action='Д'; // действие-дешифрация;

for(j=0;j<2;j++)[j]=SYN[j];_size=FILESIZE(crptstream);

}{= clock();_size=FILESIZE(datastream);

}=file_size;=size%8;=size/8;(ostatok!=0)

++size;(DWord cicle=0;cicle<size;cicle++){(cicle==(size-1)){(action=='Д')(crptstream,ostatok,MESSAGE);(datastream,ostatok,MESSAGE);

}{(action=='Д'){(i=0;i<2;i++){(part,4,1,crptstream);[i]=*(DWord*)(part);

}

}{(i=0;i<2;i++){(part,4,1,datastream);[i]=*(DWord*)(part);

}

}

}step=0;metka=0;(n=0;n<4;n++){(m=0;m<8;m++){(n==3)=7-m;=m;((action=='Ш')&&(reserv=='N')).num=GAMMA[0]+Key_USER1[step];if((action=='Д')&&(reserv=='N')).num=GAMMA[0]+Key_USER2[step];.num=GAMMA[0]+KEYS[step];=0x00;(t=0;t<4;t++){.byte[t]=(int)S[(int)ptr.byte[t]+metka];+=0x100;

}.num=(ptr.num << 11) | (ptr.num >> 21);((n==3)&&(step==0))[1]=(ptr.num)^GAMMA[1];{[3]=GAMMA[0];[0]=ptr.num^GAMMA[1];[1]=GAMMA[3];

}

}

}(j=0;j<2;j++){(action=='Д'){_MESSAGE[j]=MESSAGE[j];[j]=GAMMA[j]^MESSAGE[j];[j]=CRT_MESSAGE[j];

}{[j]=GAMMA[j]^MESSAGE[j];[j]=MESSAGE[j];

}

}(cicle==(size-1)){*uk=(HWord*)(MESSAGE);[ostatok]=NULL;(action=='Ш')(uk,ostatok,1,crptstream);(uk,ostatok,1,decrptstream);

}{(action=='Ш')(MESSAGE,4,2,crptstream);(MESSAGE,4,2,decrptstream);

}

}(act==0)= clock();

}_time=((double)(end)-(double)(start))/CLK_TCK; // Определение времени шифрования

//------------------Заполнение файла отчета--------------------------------------

fprintf(keystream," == Исходные данные для шифрации ==\r\r");

fprintf(keystream," 1. Основные: \r\r");(keystream," Адрес первого абонента (№ %d):\r\r ",user1);(keystream," ADRESS1 = ");(i=0;i<6;i++)(keystream,"%04X",ADRESS1[i][0]);(keystream,"\r\r Адрес второго абонента (№ %d):\r\r ",user2);(keystream," ADRESS2 = ");(i=0;i<6;i++)(keystream,"%04X",ADRESS2[i][0]);(keystream,"\r\r Сеансовые ключи абонентов:\r\r ");(keystream," К12 = ");(i=0;i<8;i++)(keystream,"%08lX",Key_USER1[i]);(keystream,"\r\r К21 = ");(i=0;i<8;i++)(keystream,"%08lX",Key_USER2[i]);(keystream,"\r\r Cинхропосылка :\r\r ");(keystream," SYN = ");(i=0;i<2;i++)(keystream,"%08lX ",SYN[i]);(keystream,"\r\r 2. Резервные:\r\r ");(keystream," P = ");(i=15;i>=0;i--)(keystream,"%04X",P[i]);(keystream,"\r\r GEN = ");(i=7;i>=0;i--)(keystream,"%04X",GEN[i]);(keystream,"\r\r X = ");(i=7;i>=0;i--)(keystream,"%04X",X[i]);(keystream,"\r\r Y = ");(i=7;i>=0;i--)(keystream,"%04X",Y[i]);(keystream,"\r\r Сеансовый ключ:\r\r ");(keystream," KEY = ");(i=7;i>=0;i--)(keystream,"%08lX",KEYS[i]);(keystream,"\r\r Cинхропосылка :\r\r ");(keystream," SYN = ");(i=0;i<2;i++)(keystream,"%08lX ",SYN[i]);(keystream,"\r\r == Характеристикип процесса шифрации ==\r\r");(keystream," Размер сообщения (кбайт) - %.3lf \r\r",(double)file_size/1024);(keystream," Время шифрации (в секундах) - %.3lf \r\r",prog_time);(keystream," Скорость шифрации (кбайт/с) - %.3lf \r\r",(double)file_size/(1024*prog_time));(keystream," Обработка велась в ");

if(reserv=='Y')(keystream," резервном режиме. ");(keystream," основном режиме. ");(crptstream);(decrptstream);(keystream);(datastream);();

return 0;

}

//----------Функция считывания данных из файла с дополнением --------------------

void ADDFILE (FILE *flow,short ost,DWord MES[2]){times;(int i=0;i<2;i++)[i]=0x0;= (short)floor((double)ost/4);(times==1){(part,4,1,flow);ES[0]=*(DWord*)(part);

}(ost%4!=0){(part,ost%4,1,flow);(int s=ost%4;s<4;s++)[s]=NULL;[times]=*(DWord*)(part);

}

fseek(flow,0,SEEK_SET);

}

//-------------------Функция определения длины файла --------------------

DWord FILESIZE (FILE *flow){size;(flow,0,SEEK_END);=ftell(flow);(flow,0,SEEK_SET);size;

}

//--------------------Функция разности двух 512 битовых чисел--------------

void DICRIMENT (Word P[32],Word Q[32],Word RES[32]){CUR_RES[32]={0x0,};ZAEM=0x0;(int e=0;e<32;e++){(P[e]<Q[e]){_RES[e]=0x10000-Q[e]+P[e]-ZAEM;=0x1;

}{_RES[e]=P[e]-Q[e]-ZAEM;=0x0;

}

}(e=0;e<32;e++)[e]=CUR_RES[e];

}

//-------------------Функция умножения двух 256 битовых чисел---------------

void MULTIPLE (Word Mn1[16],Word Mn2[16],Word RES[32],Word R){_ptr.BL32=0;BUF=0x0;Previece_ST_part=0,Current_ML_part=0;CUR_RES[32]={0x0,};(int j=0;j<16;j++){(int i=0;i<16;i++){(i==0){_RES[15+j]=Previece_ST_part;_ST_part=0;

}_ptr.BL32=(DWord)Mn1[i]*(DWord)Mn2[j];_ML_part=W_ptr.BL16[0];=(DWord)CUR_RES[i+j]+(DWord)Current_ML_part+Previece_ST_part;_RES[i+j]+=Current_ML_part+Previece_ST_part;_ST_part=W_ptr.BL16[1]+(Word)(BUF>>16);((j==15)&&(i==15)) CUR_RES[i+j+1]=Previece_ST_part;

}

}(int e=0;e<R;e++)[e]=CUR_RES[e];

}

//-----------------------Функция вычисления 256 битового модуля 512 битового числа---------------

void TAKE_MODULE(Word NUMBER[32],Word OST[16],Word MOD[16]){ii=31,jj=15;K[16]={0x0,},CUR_MOD[32],CUR_NUM[32];(int i=31;i>=0;i--)_NUM[i]=NUMBER[i];(MOD[jj]==0x0)-;((CUR_NUM[ii]==0x0)&&(ii>0))-;(ii>=jj){(CUR_NUM[ii]>=MOD[jj]){((ii-jj)>15){[0]=CUR_NUM[ii]/MOD[jj];(K,MOD,CUR_MOD,32);(i=15;i>=0;i--)[i]=0x0;[ii-jj-16]=0x1;(K,CUR_MOD,CUR_MOD,32);(i=ii;i>ii-16;i--){_MOD[i]=CUR_MOD[i-16];_MOD[i-16]=0x0;

}(CUR_NUM,CUR_MOD,CUR_NUM);

}{[ii-jj]=CUR_NUM[ii]/MOD[jj];(K,MOD,CUR_MOD,32);(CUR_NUM,CUR_MOD,CUR_NUM);

}

}{(ii>jj){((ii-jj)>15){_ptr.BL32=0;_ptr.BL16[1]=CUR_NUM[ii];[0]=W_ptr.BL32/(DWord)MOD[jj];(K,MOD,CUR_MOD,32);(i=15;i>=0;i--)[i]=0x0;((ii-jj)!=16){[ii-jj-16]=0x1;(K,CUR_MOD,CUR_MOD,32);

}(i=ii;i>=ii-14;i--){_MOD[i]=CUR_MOD[i-15];_MOD[i-15]=0x0;

}(CUR_NUM,CUR_MOD,CUR_NUM);

}{_ptr.BL32=0x0;_ptr.BL16[1]=CUR_NUM[ii];[ii-jj-1]=W_ptr.BL32/(DWord)MOD[jj];(K,MOD,CUR_MOD,32);(CUR_NUM,CUR_MOD,CUR_NUM);

}

};

}(CUR_NUM[ii]==0x0){(ii==0);-;

}(i=15;i>=0;i--)[i]=0x0;

}(i=15;i>=0;i--)[i]=CUR_NUM[i];

}

//---------------------Функция вычисления 256 битового модуля степени 256 битового числа------------

void X_in_Y_modN (Word a[16],Word r[16],Word MODULE[16],Word RES[16]){short bit,cicle,MASK = 0x01;B[16],A[16],stepen;BUFFER1[32];BUFFER2[32];step;(int j=15;j>=0;j--){[j]=a[j];[j]=a[j];

}(int k=15;k>=0;k--){=r[k];= 0;step=16;((bit==0)&&(step>0)){-;= (stepen>>step)&MASK;

}= step-1;-;(step>=0){(j=0;j<=cicle;j++){= (stepen>>step)&MASK;(bit == 0){(A,A,BUFFER1,32);_MODULE(BUFFER1,A,MODULE);

}{(A,A,BUFFER1,32);_MODULE(BUFFER1,A,MODULE);(B,A,BUFFER2,32);_MODULE(BUFFER2,A,MODULE);

}-;

}

}

}(int i=15;i>=0;i--)[i]=A[i];

}

SUMMA (Word P[16],Word Q[16],Word RES[16]){CUR_RES[16]={0x0,};SUMMA=0x0;PERENOS=0x0;(int e=0;e<16;e++){=(DWord)P[e]+(DWord)Q[e]+PERENOS;_RES[e]=(Word)SUMMA;(SUMMA>0xFFFF)=0x1;=0x0;

}(e=0;e<16;e++)[e]=CUR_RES[e];

}a_in_P_modN (DWord a, DWord r, DWord N){B,A,stepen;double complit_part;short bit,cicle;short MASK = 0x01;step = 32;= r;=a; B=a;= 0;(stepen==1){=(unsigned long)(A - floor(A/(long double)N)*(long double)N);A;

}(bit==0){-;= (stepen>>step)&MASK;

}= step-1;-;(int j=0;j<=cicle;j++){= (stepen>>step)&MASK;(bit == 0){_part = pow((long double)A,2);=(unsigned long)(complit_part - floor(complit_part/(long double)N)*(long double)N);

}{_part = pow((long double)A,2);=(unsigned long)(complit_part - floor(complit_part/(long double)N)*(long double)N);_part = (long double)A*(long double)B;=(unsigned long)(complit_part - floor(complit_part/(long double)N)*(long double)N);

}-;

}A;

}


Тема: «Разработка программной реализации криптографического алгоритма ГОСТ 28147-89 в режиме гаммир

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ