- •Завдання
- •Тема курсової работи: Розробка програмного vhdl проекту криптографічного процесора текстової інформації в середовищі active-hdl.
- •К ороткі теоретичні відомості
- •Блок-схема алгоритму шифрування/дешифрування
- •Характеристика схеми проекту
- •Vhdl-проект криптографічного процесора
- •Ч асова діаграма проекту
- •В исновки
- •Список використаної літератури:
Блок-схема алгоритму шифрування/дешифрування
Функція шифрування/дешифрування
Характеристика схеми проекту
- вхідні порти:
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;
