Шифратор на базе алгоритма ГОСТ 147-89

Автор: Пользователь скрыл имя, 23 Апреля 2013 в 23:32, курсовая работа

Описание работы

Под гаммированием понимают процесс наложения по определенному закону гаммы шифра на открытые данные. Гамма шифра - это псевдослучайная последовательность, выработанная по заданному алгоритму для зашифрования открытых данных и расшифрования зашифрованных данных.
Процесс зашифрования заключается в генерации гаммы шифра и наложении полученной гаммы на исходный открытый текст обратимым образом, например с использованием операции сложения по модулю два.
Следует отметить, что перед зашифрованием открытые данные разбивают на блоки одинаковой длины, обычно по 64 бита. Гамма шифра вырабатывается в виде последовательности блоков аналогичной длины.

Содержание

ИСХОДНЫЕ ДАННЫЕ 4
ВВЕДЕНИЕ 5
1 АНАЛИЗ ПОСТАВЛЕННОЙ ЗАДАЧИ 6
1.1 Общее описание алгоритма криптографического преобразования ГОСТ 28147-89 6
1.2 Описание режима работы алгоритма ГОСТ 28147-89 в режиме гаммирования 9
2 РЕАЛИЗАЦИЯ АЛГОРИТМА В СРЕДЕ ALTERA 12
3. ОПИСАНИЕ ИСПОЛЬЗУЕМОЙ ПЛИС 16
ЗАКЛЮЧЕНИЕ 18
СПИСОК ЛИТЕРАТУРЫ 19

Работа содержит 1 файл

Belov D.P.docx

— 932.25 Кб (Скачать)

 

На выходе «cle_test» гамма шифра, которая так же, как и синхропосылка, выглядит как шум. Выход «otext» - открытые данные, выход «shifr» - зашифрованные данные, «m_out» - восстановленные данные.

Видно, что восстановленные  данные совпадают с открытыми.

Рисунок 2.5 - Результат работы программы после  генерации гаммы шифра посредством  цикла 32-З/32-Р

 

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

 

3. ОПИСАНИЕ ИСПОЛЬЗУЕМОЙ  ПЛИС

Для реализации данного устройства была выбрана ПЛИС «EP1K30QC208-1». Схематическое изображение которой представлено в приложении Б.

Было использовано 90% входов/выходов  и 38% логических ячеек. Видно, что 62% логических ячеек ПЛИС остаются неиспользованными при 10% использованных входов/выходов.

Для предотвращения чрезмерного  увеличения задержки и во избежание  выхода устройства из строя при нагреве  ПЛИС, рассчитаем частоту тактового  генератора, исходя из данных симуляции.

Частота тактового генератора будет равняться:

 

Где T – период тактов генератора.

Учитывая, что за 32 такта  обрабатывается 64 бита информации, рассчитаем скорость работы устройства:

 

 

Описание входов/выходов:

«TCK» – контакт для программирования и тестирования ПЛИС, если не используется, то подключается на землю;

«CONF_DONE», «nCEO», «DATA0», «DCLK», «nCE», «MSEL0», «MSEL1», «nCONFIG», «nSTATUS» - в данном устройстве не используются, подключаются на питание 2.5 В;

 «TDI», «TMS» - контакты для программирования и тестирования ПЛИС, если не используются, то подключены на питание 2.5 В;

«TDO», «TRST» - контакты для программирования и тестирования;

«VCCIO», «VCCINT» - контакты питания ПЛИС (2.5 В);

«shifr0..shifr63» - выходные контакты микросхемы, содержат шифрованные данные (нулевой уровень : 0 В, единичный уровень: 2.5 В);

«otext0..otext63» - выходные контакты микросхемы, содержат открытые данные (нулевой уровень : 0 В, единичный уровень: 2.5 В);

«GND» - подключается на землю;

«RESERVED» - неиспользуемые входы/выходы, не подключаются.

«VCC_CKLK» - не используется, подключается на питание (2.5 В);

«GND_CKLK» - не используется, подключается на землю;

 «clk» - вход тактого генератора(нулевой уровень : -0.5..0.8 В, единичный уровень: 1.7..5.75 В, частота 5 МГц);

 «prn» - установка начальных значений счетчиков (нулевой уровень : -0.5..0.8 В, единичный уровень: 1.7..5.75 В);

 «cycle_switch» - осуществляет переключение начального цикла рандомизации синхропосылки и дальнейших циклов генерации гаммы шифра (нулевой уровень : -0.5..0.8 В, единичный уровень: 1.7..5.75 В);

 «main_load» - осуществляет загрузку синхропосылки в устройство генерации гаммы (нулевой уровень : -0.5..0.8 В, единичный уровень: 1.7..5.75 В);

 «mem_load» - осуществляет загрузку данных суммирования с константами C1 и C2 в регистр (нулевой уровень : -0.5..0.8 В, единичный уровень: 1.7..5.75 В);

 

ЗАКЛЮЧЕНИЕ

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

 

СПИСОК ЛИТЕРАТУРЫ

[1] Системы обработки информации. Защита криптографическая. Алгоритм криптографического преобразования. ГОСТ 28147-89 – М. : Филиал ИПК Издательство стандартов, 1996. – 26с.

[2]. RSDN [Электронный ресурс]. – Электронные данные. – Режим доступа : http://www.rsdn.ru

[3] Язык описания цифровых устройств Altera HDL. Практический курс. – М.: ИП Радио Софт, 2001. – 224 с.: ил.

 

 

ПРИЛОЖЕНИЕ А

(Обязательное)

 

Листинг программы блока  «gen_otext»

 

Subdesign gen_otext

(c_in[4..0] : input;

otext[63..0] : output)

Begin

if c_in[] == b"00000" then

otext[] =

b"0000000100000000000000100000000000000000000010000000000000000001";

end if;

end;

 

Листинг программы блока «Do_Xor»

 

SubDesign Do_Xor

(in_otext[63..0], in_gamma[63..0] : input;

out[63..0] : output;)

Begin

out[] = in_otext[] xor in_gamma[];

end;

 

Листинг программы блока  «main_cycle»

 

Subdesign main_cycle

(in[63..0],K[0..31],load: input;

out[63..0], out_n1[31..0], out_n2[31..0] : output;)

variable

ff[63..0]:dff;

a[31..0]:node;

b[31..0]:node;

c[31..0]:node;

d[31..0]:node;

e[31..0]:node;

f[31..0]:node;

h[31..0]:node;

g[31..0]:node;

 

Ha[15..0][3..0]:node;

Hb[15..0][3..0]:node;

Hc[15..0][3..0]:node;

Hd[15..0][3..0]:node;

He[15..0][3..0]:node;

Hf[15..0][3..0]:node;

Hg[15..0][3..0]:node;

Hh[15..0][3..0]:node;

begin

ff[].clk=load;

b[]=in[0..31];

d[]=in[32..63];

 

out_n1[] = d[];

out_n2[] = b[];

 

f[] = b"11111111111111111111111111111111";

g[] = b"00000000000000000000000000000001";

 

if d[] + K[] < f[] + g[] then

a[] = d[] + K[];

else a[] = d[] + K[] - f[];

end if;

 

Ha[][]=(b"0100",b"1010",b"1001",b"0010",b"1100",b"1000",b"0000",b"1110",b"0110",b"1011",b"0001",b"1100",b"0111",b"1111",b"0101",b"0011");

Hb[][]=(b"1110",b"1011",b"0100",b"1100",b"0110",b"1101",b"1111",b"1010",b"0010",b"0011",b"1000",b"0001",b"0000",b"0111",b"0101",b"1000");

Hc[][]=(b"1010",b"1000",b"0001",b"1101",b"1010",b"0011",b"0100",b"0010",b"1110",b"1111",b"1100",b"0111",b"0110",b"0000",b"1001",b"1000");

Hd[][]=(b"0111",b"1101",b"1010",b"0001",b"0000",b"1000",b"1001",b"1111",b"1110",b"0100",b"0110",b"1100",b"1011",b"0010",b"0101",b"1000");

He[][]=(b"0110",b"1100",b"0111",b"0001",b"0101",b"1111",b"1101",b"1000",b"0100",b"1010",b"1001",b"1110",b"0000",b"0011",b"1011",b"1000");

Hf[][]=(b"0100",b"1011",b"1010",b"0000",b"0111",b"0010",b"0001",b"1101",b"0011",b"0110",b"1000",b"0101",b"1001",b"1100",b"1111",b"1000");

Hg[][]=(b"1101",b"1011",b"0100",b"0001",b"0011",b"1111",b"0101",b"1001",b"0000",b"1010",b"1110",b"0111",b"0110",b"1000",b"0010",b"1000");

Hh[][]=(b"0001",b"1111",b"1101",b"0000",b"0101",b"0111",b"1010",b"0100",b"1001",b"0010",b"0011",b"1110",b"0110",b"1011",b"1000",b"1000");

 

for i in 0 to 15 generate

if a[3..0] == i then c[3..0]= Ha[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[7..4] == i then c[7..4]= Hb[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[11..8] == i then c[11..8]= Hc[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[15..12] == i then c[15..12]= Hd[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[19..16] == i then c[19..16]= He[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[23..20] == i then c[23..20]= Hf[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[27..24] == i then c[27..24]= Hg[i][];

end if;

end generate;

 

for i in 0 to 15 generate

if a[31..28] == i then c[31..28]= Hh[i][];

end if;

end generate;

 

e[]=(c[20..0],c[31..21]);

 

h[] = e[] xor b[];

 

ff[].d=(h[], d[]);

out[]=ff[].q;

end;

 

Листинг программы блока  «summ232»

 

SubDesign summ232

(in[63..0], load : input;

out[63..0], out_dff[63..0] : output;)

 

variable

ff[63..0] : dff;

 

a[31..0] : node;

b[31..0] : node;

c[31..0] : node;

d[31..0] : node;

e[31..0] : node;

f[31..0] : node;

o1[31..0] : node;

o2[31..0] : node;

 

begin

c[] = b"11111111111111111111111111111111";

d[] = b"00000000000000000000000000000001";

e[] = b"00000001000000010000000100000100";

f[] = b"00000001000000010000000100000001";

 

 

a[] = in[32..63];

b[] = in[0..31];

 

if a[] + e[] < c[] + d[] then

o1[] = a[] + e[];

else o1[] = a[] + e[] - c[];

end if;

 

if b[] + f[] < c[] + d[] then

o2[] = b[] + f[];

else o2[] = b[] + f[] - c[] + d[];

end if;

 

out[] = (o2[], o1[]);

 

ff[].clk = load;

ff[].d = (o2[], o1[]);

out_dff[] = ff[].q;

end;

 

Листинг программы блока  «kzy»

 

Subdesign kzy

(in[4..0] : input;

out[31..0] : output;)

variable

a[31..0]:node;

b[31..0]:node;

c[31..0]:node;

d[31..0]:node;

e[31..0]:node;

f[31..0]:node;

g[31..0]:node;

h[31..0]:node;

begin

a[] = b"00000000000000000000000000000000";

b[] = b"00000000000000000000000000000001";

c[] = b"00000000000000000000000000000010";

d[] = b"00000000000000000000000000000011";

e[] = b"00000000000000000000000000000100";

f[] = b"00000000000000000000000000000101";

g[] = b"00000000000000000000000000000110";

h[] = b"00000000000000000000000000000111";

if in[] == b"00000" then

out[] = a[]; end if;

if in[] == b"00001" then

out[] = b[]; end if;

if in[] == b"00010" then

out[] = c[]; end if;

if in[] == b"00011" then

out[] = d[]; end if;

if in[] == b"00100" then

out[] = e[]; end if;

if in[] == b"00101" then

out[] = f[]; end if;

if in[] == b"00110" then

out[] = g[]; end if;

if in[] == b"00111" then

out[] = h[]; end if;

if in[] == b"01000" then

out[] = a[]; end if;

if in[] == b"01001" then

out[] = b[]; end if;

if in[] == b"01010" then

out[] = c[]; end if;

if in[] == b"01011" then

out[] = d[]; end if;

if in[] == b"01100" then

out[] = e[]; end if;

if in[] == b"01101" then

out[] = f[]; end if;

if in[] == b"01110" then

out[] = g[]; end if;

if in[] == b"01111" then

out[] = h[]; end if;

if in[] == b"10000" then

out[] = a[]; end if;

if in[] == b"10001" then

out[] = b[]; end if;

if in[] == b"10010" then

out[] = c[]; end if;

if in[] == b"10011" then

out[] = d[]; end if;

if in[] == b"10100" then

out[] = e[]; end if;

if in[] == b"10101" then

out[] = f[]; end if;

if in[] == b"10110" then

out[] = g[]; end if;

if in[] == b"10111" then

out[] = h[]; end if;

if in[] == b"11000" then

out[] = h[]; end if;

if in[] == b"11001" then

out[] = g[]; end if;

if in[] == b"11010" then

out[] = f[]; end if;

if in[] == b"11011" then

out[] = e[]; end if;

if in[] == b"11100" then

out[] = d[]; end if;

if in[] == b"11101" then

out[] = c[]; end if;

if in[] == b"11110" then

out[] = b[]; end if;

if in[] == b"11111" then

out[] = a[]; end if;

 

end;

 

Листинг программы блока  «gen_synchro»

 

Subdesign gen_synchro

(send_out[63..0] : output;)

begin

send_out[]= b"0000000000000000000000000000000000000000000000000000000000000001";

end;

 

ПРИЛОЖЕНИЕ Б

 

Схематичное изображение  ПЛИС «EP1K30QC208-1»:

 

Принципиальная схема  устройства:


Информация о работе Шифратор на базе алгоритма ГОСТ 147-89