В проекті використовуються наступні умовні позначення:
входные порты:
clk – тактовый сигнал;
clk_out – тактовый сигнал для вывода информации на выходные порты;
cod – тактовый сигнал, используемый процессе шифрования;
decod – тактовый сигнал используемый в процессе дешифрования;
en_rd_f – сигнал разрешения чтения текстовых данных из файла;
en_wr_f – сигнал разрешения записи дешифрованной информации в файл;
– выходные порты:
code – порт для вывода зашифрованной информации в формате integer;
code1 – порт для вывода зашифрованной информации в формате s_l_v;
decode – порт для вывода дешифрованной информации типом character.
Код програми:
library IEEE, lib_kyrs;
use IEEE.STD_LOGIC_1164.all;
use std.textio.all;
use CONVERTERS.all;
-
------------------------------------
entity elgamal is
port( clk : in std_logic;--тактовый сигнал
clk_out: in std_logic;-- т.с. для вывода инф-ии на вых. порты
cod : in std_logic;-- сигналы, используемые в процессах
decod : in std_logic;--шифрования и дешифрования
en_rd_f: in std_logic;--cигн.разреш. чтения текст. данных из файла ОС
en_wr_f: in std_logic;--cигн.разреш. записи деш.инф. в файл ОС
code : out integer; --порт для вывода зашифрованной инф.
code1 : out std_logic_vector (0 to 7);--порт для вывода зашифр. инф.
decode : out character );-- порт для вывода дешифрованной информации
end elgamal;
-------------------------------------
architecture arch of elgamal is
signal mas_inf :string(1 to 96);
signal sig_decod_ch :string(1 to 96);
signal sig_data_ch :string(1 to 96);
type mas_slv is array (1 to 96)of std_logic_vector(0 to 7);
type mas_int is array (1 to 96) of integer;
signal sig_cod1_slv : mas_slv;
signal sig_cod_int : mas_int;
signal sig_data_int : mas_int;
signal sig_decode_int:mas_int;
begin
-
-Оператор
process реализующий чтения текстовых данных
из файла "data.dat"
-- mas_inf и инициализацию текстового массива mas_inf
read_proc: process(clk)
variable read_buf1 : string(1 to 96); --буфер
variable wid1 : natural;
--объявление файла-контейнера, с помощью которого буде осуществлять
-- чтение из файла ОС
file read_cont_data : TEXT open READ_MODE is
"C:\my_designs\hhhhhhh\src\1.txt";
begin
if clk'event and clk ='1' and en_rd_f ='1' then
FILE_OPEN(read_cont_data,"C:\my_designs\hhhhhhh\src\1.txt",
READ_MODE );
-- Инициализация текстового массива
mas_inf <= read_buf1;
end if;
FILE_CLOSE(read_cont_data);
end process;
---------- шифрование / дешифрование-----------
--Оператор process реализует процедуру шифрования
--текстовой информации с предварительным конвертированием
--их из формата character в формат integer
process(clk)
process(clk)
constant p: integer:=11;
constant k: integer:=9;
constant y: integer:=3;
constant g: integer:=2;
variable i: positive;
begin
if clk'event and clk = '1' and cod ='1' then
-- инициализация вспомогательного внутреннего сигнала
sig_data_ch <= mas_inf;
---шифрование с использованием открытого ключа (p,g,y)---
for i in 1 to 96 loop
-- преобразование character в integer
sig_data_int(i) <= CONV(sig_data_ch(i));
sig_cod_int(i)<=(sig_data_int(i)and(step(k,y)))rem p;
--преобразование integer в std_logic_vector
sig_cod1_slv(i)<=CONV(sig_cod_int(i));
end loop;
end if;
end process;
---дешифрование с использованием секретного ключа (х)---
process(clk)
variable i: positive;
constant x: integer:=8;
constant p: integer:=11;
constant a: integer:=6;
begin
if clk'event and clk = '1' and decod ='1' then
for i in 1 to 96 loop
sig_decode_int(i)<=(sig_cod_int(i) and (step(-x,a)))rem p;
--преобразование integer в character
sig_decod_ch(i) <= CONV(sig_decode_int(i));
end loop;
end if;
end process;
--процесс вывода зашифрованной / дешифрованной информации
--на выходные порты
process (clk_out)
variable i:positive;
begin
if clk_out'event and clk_out = '1' and i<=96 then
code <= sig_cod_int(i);
code1 <= sig_cod1_slv(i);
decode <= sig_decod_ch(i);
i:=i+1;
end if;
end process;
--Оператор process реализует процедуру записи дешифровфнных
--текстовых данных в файл ОС decode.dat.
--При записи новых данных в файл старые данные автоматически
--уничтожаются.
process(clk)
-- Объявление программного буферного массива
variable write_buf : string(1 to 96);
-- Организация контейнера (величины файлового типа)
file wtite_conteiner : TEXT open write_MODE is
" C:\my_designs\hhhhhhh\src\2.txt";
begin
if clk'event and clk ='1' and en_wr_f ='1' then
--Инициализация программного буферного массива write_buf массивом
-- decod_ch
write_buf := sig_decod_ch;
FILE_OPEN(wtite_conteiner,
" C:\my_designs\hhhhhhh\src\2.txt",
write_MODE );
WRITE(wtite_conteiner, write_buf);
end if;
FILE_CLOSE(wtite_conteiner);
end process;
end arch;
К проекту подключен библиотечный пакет TEXTIO, в котором определен специальный файловый тип TEXT, дающий возможность получать доступ к текстовой информации в файлах ОС, а также выполнять операции READ, WRITE, APPEND.
Кроме того, к проекту подключена библиотека пользователя под названием lib_kyrs.lib. Эта библиотека используется только в пределах данного проекта. Библиотека lib_kyrs.lib содержит пакет func с описание функций conv ( ), конвертирующих данные разных типов, а также функцию возведения в степень step( ).
Используемые функции СONV конвертируюn данные таких типов:
–character -> integer;
–integer -> character;
–integer -> std_logic_vector;
Функция step( ) выполняет в проекте операции возведения в степень.
