Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_rabota_2_chast_Slobodyanyuk.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
357 Кб
Скачать
☆

Блок-схема алгоритму шифрування/дешифрування

Функція шифрування/дешифрування

Характеристика схеми проекту

- вхідні порти:

clk

тактовий сигнал

сlk_оut

тактовий сигнал виводу вихыдних даних

rd_da_fa

сигнал дозволу читання даних із файла

wr_da_fa

Дозвіл запису дешифрованої інформації у файл

–вихідні порти:

сode

для виводу зашифрованої інформації

-шифрування:

code=mess**5 mod 35

-розшифрування

decode=mess**29 mod 35

Д о проекту підключений бібліотечний пакет TEXTIO, в якому визначений спеціальний файловий тип TEXT, що дає доступ до текстової інформації у файлах ОС, а також виконувати операції READ, WRITE, APPEND.

Крім того, до проекту підключена бібліотека користувача під назвою library.work . Ця бібліотека використовується тільки в межах даного проекту. В ній описані функції конвертації даних.

Vhdl-проект криптографічного процесора

library IEEE;

use IEEE.STD_LOGIC_1164.all;

use std.textio.all;

USE IEEE.STD_LOGIC_TEXTIO.ALL;

library work;

use work.converters.all;

entity lr22 is

port(clk : in STD_LOGIC;

clk_out : in STD_LOGIC;

rd_da_fa : in STD_LOGIC;

wr_da_fa : in STD_LOGIC;

code : out string (1 to 32));

end lr22;

architecture lr22_arch of lr22 is

type masiv_int is array (1 to 32) of integer;

type mas_std is array (1 to 32)of std_logic_vector(0 to 7);

signal mas1_inf : string (1 to 32);

signal s_data_char: string (1 to 32);

signal s_decod_mess_char, s_cod_mess_char: string (1 to 32);

signal s_data_int : masiv_int;

signal s_data_vec, s_shifr_vec, s_data_vec2 : mas_std;

signal s_cod_mess_int: masiv_int ;

signal s_decod_int: masiv_int ;

signal cod_r_num, cod_l_num : masiv_int;

-------------------------------------

-- Функція шифрування/дешифрування---

-------------------------------------

function codfunc (X: integer; Y: integer ) return integer is

variable tmp : integer ;

begin

for i in 1 to Y-1 loop

if i = 1 then

tmp := X**2;

else

tmp := X*tmp;

tmp := tmp mod 35;

end if;

end loop ;

return tmp;

end codfunc;

-------------------------------------

begin

read_proc: process(clk)

variable read_buf1 : string(1 to 32);

variable wid1 : natural;

file read_cont_data : TEXT open READ_MODE is "message.txt";

begin

if clk'event and clk ='1' and rd_da_fa ='1' then

FILE_OPEN(read_cont_data,"message.txt", READ_MODE);

READ(read_cont_data, read_buf1, wid1);

mas1_inf <= read_buf1;

end if;

FILE_CLOSE(read_cont_data);

end process;

process(clk)

variable text_int, kluch_int, tmp,tmp2,tmp3, kod_tmp : integer ;

variable r_num, l_num, conv_temp : integer ;

variable r_num2, l_num2, cod_r_num2, cod_l_num2, conv_temp2 : integer ;

begin

if clk'event and clk = '1' then

s_data_char <= mas1_inf;

for i in 1 to 32 loop

s_data_vec(i) <= CONV(s_data_char(i));

s_data_int(i) <= CONV (s_data_vec(i));

conv_temp := s_data_int(i);

r_num := conv_temp mod 16;

l_num := (conv_temp - r_num)/16;

cod_r_num(i)<= codfunc(r_num, 5) ;

cod_l_num(i)<= codfunc(l_num, 5) ;

s_cod_mess_int(i) <= cod_l_num(i)*16+ cod_r_num(i);

s_shifr_vec(i) <= CONV8(s_cod_mess_int(i));

s_cod_mess_char(i) <= CONV (s_shifr_vec(i));

end loop ;

code <= s_cod_mess_char;

for i in 1 to 32 loop

cod_r_num2:= codfunc(cod_r_num(i), 29) ;

cod_l_num2:= codfunc(cod_l_num(i), 29) ;

s_decod_int(i) <= cod_l_num2*16+ cod_r_num2;

s_data_vec2(i) <= CONV8(s_decod_int(i));

s_decod_mess_char(i) <= CONV (s_data_vec2(i));

end loop ;

end if;

end process;

write_proc : process (clk_out)

variable wr_buf1, wr_buf2 : string(1 to 32);

file wtite_cont : TEXT open write_MODE is "shifr.txt";

file wtite_cont2 : TEXT open write_MODE is "deshifr.txt";

begin

if clk_out'event and clk_out = '1' and wr_da_fa = '1' then

for i in 1 to 32 loop

wr_buf1(i):= s_cod_mess_char(i);

wr_buf2(i):= s_decod_mess_char(i);

end loop;

FILE_OPEN(wtite_cont, "shifr.txt", write_MODE );

FILE_OPEN(wtite_cont2, "deshifr.txt", write_MODE );

WRITE(wtite_cont, wr_buf1);

WRITE(wtite_cont2, wr_buf2);

end if;

FILE_CLOSE(wtite_cont);

FILE_CLOSE(wtite_cont2);

end process;

end lr22_arch;

Файл конвертуючих функцій

library IEEE;

use IEEE.STD_LOGIC_1164.all;

package CONVERTERS is

function CONV (X :STD_LOGIC_VECTOR) return BIT_VECTOR;

function CONV (X :BIT_VECTOR) return STD_LOGIC_VECTOR;

function CONV (X :STD_LOGIC_VECTOR (7 downto 0)) return CHARACTER;

function CONV (X :CHARACTER) return STD_LOGIC_VECTOR;

function CONV (X :STD_LOGIC_VECTOR) return INTEGER;

function CONV8 (X :INTEGER) return STD_LOGIC_VECTOR;

end CONVERTERS;

package body CONVERTERS is

-----------------------------------------------------------------------------

function CONV (X :STD_LOGIC_VECTOR) return BIT_VECTOR is

constant XMAP :BIT :='0';

variable RESULT :BIT_VECTOR (X'RANGE);

begin

for i in RESULT'RANGE loop

case X(i) is

when '0' | 'L' => RESULT(i) := '0';

when '1' | 'H' => RESULT(i) := '1';

when others => RESULT(i) := XMAP;

end case;

end loop;

return RESULT;

end CONV;

------------------------------------------------------------------------------

-- From BIT_VECTOR to STD_LOGIC_VECTOR converter

------------------------------------------------------------------------------

function CONV (X :BIT_VECTOR) return STD_LOGIC_VECTOR is

variable RESULT :STD_LOGIC_VECTOR (X'RANGE);

begin

for i in RESULT'RANGE loop

case X(i) is

when '0' => RESULT(i) := '0';

when '1' => RESULT(i) := '1';

end case;

end loop;

return RESULT;

end CONV;

------------------------------------------------------------------------------

-- From STD_LOGIC_VECTOR to CHARACTER converter

------------------------------------------------------------------------------

function CONV (X :STD_LOGIC_VECTOR (7 downto 0)) return CHARACTER is

constant XMAP :INTEGER :=0;

variable TEMP :INTEGER :=0;

begin

for i in X'RANGE loop

TEMP:=TEMP*2;

case X(i) is

when '0' | 'L' => null;

when '1' | 'H' => TEMP :=TEMP+1;

when others => TEMP :=TEMP+XMAP;

end case;

end loop;

return CHARACTER'VAL(TEMP);

end CONV;

------------------------------------------------------------------------------

-- From CHARACTER to STD_LOGIC_VECTOR (7 downto 0) converter

------------------------------------------------------------------------------

function CONV (X :CHARACTER) return STD_LOGIC_VECTOR is

variable RESULT :STD_LOGIC_VECTOR (7 downto 0);

variable TEMP :INTEGER :=CHARACTER'POS(X);

begin

for i in RESULT'REVERSE_RANGE loop

case TEMP mod 2 is

when 0 => RESULT(i):='0';

when 1 => RESULT(i):='1';

when others => null;

end case;

TEMP:=TEMP/2;

end loop;

return RESULT;

end CONV;

------------------------------------------------------------------------------

-- From STD_LOGIC_VECTOR to unsigned INTEGER converter

------------------------------------------------------------------------------

function CONV (X :STD_LOGIC_VECTOR) return INTEGER is

constant XMAP :INTEGER :=0;

variable RESULT :INTEGER :=0;

begin

for i in X'RANGE loop

RESULT:=RESULT*2;

case X(i) is

when '0' | 'L' => null;

when '1' | 'H' => RESULT :=RESULT+1;

when others => RESULT :=RESULT+XMAP;

end case;

end loop;

return RESULT;

end CONV;

------------------------------------------------------------------------------

-- From INTEGER to 8-bit STD_LOGIC_VECTOR converter

------------------------------------------------------------------------------

function CONV8 (X :INTEGER) return STD_LOGIC_VECTOR is

constant L :INTEGER :=8;

variable RESULT :STD_LOGIC_VECTOR (L-1 downto 0);

variable TEMP :INTEGER;

begin

if X<0 then

TEMP:=(2**RESULT'LENGTH)+X;

else

TEMP:=X;

end if;

for i in RESULT'REVERSE_RANGE loop

case TEMP mod 2 is

when 0 => RESULT(i):='0';

when 1 => RESULT(i):='1';

when others => null;

end case;

TEMP:=TEMP/2;

end loop;

return RESULT;

end;

end CONVERTERS;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]