⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes encryption.txt

📁 aes加密算法的VHDL代码实现
💻 TXT
📖 第 1 页 / 共 2 页
字号:
		    "10111110" WHEN "00100010", --(X"BE")
		    "10100001" WHEN "00100011", --(X"A1")
		    "11111100" WHEN "00100100", --(X"FC")
		    "11100011" WHEN "00100101", --(X"E3")
		    "11000010" WHEN "00100110", --(X"C2")
		    "11011101" WHEN "00100111", --(X"DD")
		    "01111000" WHEN "00101000", --(X"78")
		    "01100111" WHEN "00101001", --(X"67")
		    "01000110" WHEN "00101010", --(X"46")
		    "01011001" WHEN "00101011", --(X"59")
		    "00000100" WHEN "00101100", --(X"04")
		    "00011011" WHEN "00101101", --(X"1B")
		    "00111010" WHEN "00101110", --(X"3A")
		    "00100101" WHEN "00101111", --(X"25")
		    --the 4st group
		    "01110001" WHEN "00110000", --(X"71")
		    "01101110" WHEN "00110001", --(X"6E")
		    "01001111" WHEN "00110010", --(X"4F")
		    "01010000" WHEN "00110011", --(X"50")
		    "00001101" WHEN "00110100", --(X"0D")
		    "00010010" WHEN "00110101", --(X"12")
		    "00110011" WHEN "00110110", --(X"33")
		    "00101100" WHEN "00110111", --(X"2C")
		    "10001001" WHEN "00111000", --(X"89")
		    "10010110" WHEN "00111001", --(X"96")
		    "10110111" WHEN "00111010", --(X"B7")
		    "10101000" WHEN "00111011", --(X"A8")
		    "11110101" WHEN "00111100", --(X"F5")
		    "11101010" WHEN "00111101", --(X"EA")
		    "11001011" WHEN "00111110", --(X"CB")
		    "11010100" WHEN "00111111", --(X"D4")
		    --the 5st group
		    "10100100" WHEN "01000000", --(X"A4") 
		    "10111011" WHEN "01000001", --(X"BB") 
		    "10011010" WHEN "01000010", --(X"9A") 
		    "10000101" WHEN "01000011", --(X"85") 
		    "11011000" WHEN "01000100", --(X"D8") 
		    "11000111" WHEN "01000101", --(X"C7") 
		    "11100110" WHEN "01000110", --(X"E6") 
		    "11111001" WHEN "01000111", --(X"F9") 
		    "01011100" WHEN "01001000", --(X"5C") 
		    "01000011" WHEN "01001001", --(X"43") 
		    "01100010" WHEN "01001010", --(X"62") 
		    "01111101" WHEN "01001011", --(X"7D") 
		    "00100000" WHEN "01001100", --(X"20") 
		    "00111111" WHEN "01001101", --(X"3F") 
		    "00011110" WHEN "01001110", --(X"1E") 
		    "00000001" WHEN "01001111", --(X"01") 
		    --the 6st group
		    "01010101" WHEN "01010000", --(X"55") 
		    "01001010" WHEN "01010001", --(X"4A") 
		    "01101011" WHEN "01010010", --(X"6B") 
		    "01110100" WHEN "01010011", --(X"74") 
		    "00101001" WHEN "01010100", --(X"29") 
		    "00110110" WHEN "01010101", --(X"36") 
		    "00010111" WHEN "01010110", --(X"17") 
		    "00001000" WHEN "01010111", --(X"08") 
		    "10101101" WHEN "01011000", --(X"AD") 
		    "10110010" WHEN "01011001", --(X"B2") 
		    "10010011" WHEN "01011010", --(X"93") 
		    "10001100" WHEN "01011011", --(X"8C") 
		    "11010001" WHEN "01011100", --(X"D1") 
		    "11001110" WHEN "01011101", --(X"CE") 
		    "11101111" WHEN "01011110", --(X"EF")
		    "11110000" WHEN "01011111", --(X"F0") 
		    --the 7st group
		    "01001111" WHEN "01100000", --(X"47") 
		    "01011000" WHEN "01100001", --(X"58") 
		    "01111001" WHEN "01100010", --(X"79") 
		    "01100110" WHEN "01100011", --(X"66") 
		    "00111011" WHEN "01100100", --(X"3B") 
		    "00100100" WHEN "01100101", --(X"24") 
		    "00000101" WHEN "01100110", --(X"05") 
		    "00011010" WHEN "01100111", --(X"1A") 
		    "10111111" WHEN "01101000", --(X"BF") 
		    "10100000" WHEN "01101001", --(X"A0") 
		    "10000001" WHEN "01101010", --(X"81") 
		    "10011110" WHEN "01101011", --(X"9E") 
		    "11000011" WHEN "01101100", --(X"C3") 
		    "11011100" WHEN "01101101", --(X"DC") 
		    "11111101" WHEN "01101110", --(X"FD") 
		    "11100010" WHEN "01101111", --(X"E2") 
		    --the 8st group
		    "10110110" WHEN "01110000", --(X"B6")
		    "10101001" WHEN "01110001", --(X"A9")
		    "10001000" WHEN "01110010", --(X"88")
		    "10010111" WHEN "01110011", --(X"97")
		    "11001010" WHEN "01110100", --(X"CA")
		    "11010101" WHEN "01110101", --(X"D5")
		    "11110100" WHEN "01110110", --(X"F4")
		    "11101011" WHEN "01110111", --(X"EB")
		    "01001110" WHEN "01111000", --(X"4E")
		    "01010001" WHEN "01111001", --(X"51")
		    "01110000" WHEN "01111010", --(X"70")
		    "01101111" WHEN "01111011", --(X"6F")
		    "00110010" WHEN "01111100", --(X"32")
		    "00101101" WHEN "01111101", --(X"2D")
		    "00001100" WHEN "01111110", --(X"0C")
		    "00010011" WHEN "01111111", --(X"13")
		    --the 9st group 
		    "11101100" WHEN "10000000", --(X"EC") 
		    "11110011" WHEN "10000001", --(X"F3") 
		    "11010010" WHEN "10000010", --(X"D2") 
		    "11001101" WHEN "10000011", --(X"CD") 
		    "10010000" WHEN "10000100", --(X"90") 
		    "10001111" WHEN "10000101", --(X"8F") 
		    "10101110" WHEN "10000110", --(X"AE") 
		    "10110001" WHEN "10000111", --(X"B1") 
		    "00010100" WHEN "10001000", --(X"14") 
		    "00001011" WHEN "10001001", --(X"0B") 
		    "00101010" WHEN "10001010", --(X"2A") 
		    "00110101" WHEN "10001011", --(X"35") 
		    "01101000" WHEN "10001100", --(X"68") 
		    "01110111" WHEN "10001101", --(X"77") 
		    "01010110" WHEN "10001110", --(X"56") 
		    "01001001" WHEN "10001111", --(X"49") 
		    --the 10st group
		    "00011101" WHEN "10010000", --(X"1D") 
		    "00000010" WHEN "10010001", --(X"02") 
		    "00100011" WHEN "10010010", --(X"23") 
		    "00111100" WHEN "10010011", --(X"3C") 
		    "01100001" WHEN "10010100", --(X"61") 
		    "01111110" WHEN "10010101", --(X"7E") 
		    "01011111" WHEN "10010110", --(X"5F") 
		    "01000000" WHEN "10010111", --(X"40") 
		    "11100101" WHEN "10011000", --(X"E5") 
		    "11111010" WHEN "10011001", --(X"FA") 
		    "11011011" WHEN "10011010", --(X"DB")
		    "11000100" WHEN "10011011", --(X"C4") 
		    "10011001" WHEN "10011100", --(X"99")
		    "10000110" WHEN "10011101", --(X"86") 
		    "10100111" WHEN "10011110", --(X"A7")
		    "10111000" WHEN "10011111", --(X"B8") 
		    --the 11th group
		    "00001111" WHEN "10100000", --(X"0F") 
		    "00010000" WHEN "10100001", --(X"10") 
		    "00110001" WHEN "10100010", --(X"31") 
		    "00101110" WHEN "10100011", --(X"2E") 
		    "01110011" WHEN "10100100", --(X"73") 
		    "01101100" WHEN "10100101", --(X"6C") 
		    "01001101" WHEN "10100110", --(X"4D") 
		    "01010010" WHEN "10100111", --(X"52") 
		    "11110111" WHEN "10101000", --(X"F7") 
		    "11101000" WHEN "10101001", --(X"E8") 
		    "11001001" WHEN "10101010", --(X"C9") 
		    "11010110" WHEN "10101011", --(X"D6") 
		    "10001011" WHEN "10101100", --(X"8B") 
		    "10010100" WHEN "10101101", --(X"94") 
		    "10110101" WHEN "10101110", --(X"B5") 
		    "10101010" WHEN "10101111", --(X"AA") 
		    --the 12th group
		    "11111110" WHEN "10110000", --(X"FE") 
		    "11100001" WHEN "10110001", --(X"E1") 
		    "11000000" WHEN "10110010", --(X"C0") 
		    "11011111" WHEN "10110011", --(X"DF") 
		    "10000010" WHEN "10110100", --(X"82") 
		    "10011101" WHEN "10110101", --(X"9D") 
		    "10111100" WHEN "10110110", --(X"BC") 
		    "10100011" WHEN "10110111", --(X"A3") 
		    "00000110" WHEN "10111000", --(X"06") 
		    "00011001" WHEN "10111001", --(X"19") 
		    "00111000" WHEN "10111010", --(X"38") 
		    "00100111" WHEN "10111011", --(X"27") 
		    "01111010" WHEN "10111100", --(X"7A") 
		    "01100101" WHEN "10111101", --(X"65") 
		    "01000100" WHEN "10111110", --(X"44") 
		    "01011011" WHEN "10111111", --(X"5B") 
		    --the 13th group
		    "00101011" WHEN "11000000", --(X"2B") 
		    "00110100" WHEN "11000001", --(X"34") 
		    "00010101" WHEN "11000010", --(X"15") 
		    "00001010" WHEN "11000011", --(X"0A") 
		    "01010111" WHEN "11000100", --(X"57")
		    "01001000" WHEN "11000101", --(X"48") 
		    "01101001" WHEN "11000110", --(X"69") 
		    "01110110" WHEN "11000111", --(X"76") 
		    "11010011" WHEN "11001000", --(X"D3") 
		    "11001100" WHEN "11001001", --(X"CC") 
		    "11101101" WHEN "11001010", --(X"ED") 
		    "11110010" WHEN "11001011", --(X"F2") 
		    "10101111" WHEN "11001100", --(X"AF") 
		    "10110000" WHEN "11001101", --(X"B0") 
		    "10010001" WHEN "11001110", --(X"91") 
		    "10001110" WHEN "11001111", --(X"8E") 
		    --the 14th group
		    "11011010" WHEN "11010000", --(X"DA") 
		    "11000101" WHEN "11010001", --(X"C5") 
		    "11100100" WHEN "11010010", --(X"E4") 
		    "11111000" WHEN "11010011", --(X"F8") 
		    "10100110" WHEN "11010100", --(X"A6") 
		    "10111001" WHEN "11010101", --(X"B9") 
		    "10011000" WHEN "11010110", --(X"98") 
		    "10000111" WHEN "11010111", --(X"87") 
		    "00100010" WHEN "11011000", --(X"22") 
		    "00111101" WHEN "11011001", --(X"3D") 
		    "00011100" WHEN "11011010", --(X"1C") 
		    "00000011" WHEN "11011011", --(X"03") 
		    "01011110" WHEN "11011100", --(X"5E") 
		    "01000001" WHEN "11011101", --(X"41") 
		    "01100000" WHEN "11011110", --(X"60") 
		    "01111111" WHEN "11011111", --(X"7F") 
		    --the 15th group
		    "11001000" WHEN "11100000", --(X"C8") 
		    "11010111" WHEN "11100001", --(X"D7") 
		    "11110110" WHEN "11100010", --(X"F6") 
		    "11101001" WHEN "11100011", --(X"E9") 
		    "10110100" WHEN "11100100", --(X"B4") 
		    "10101011" WHEN "11100101", --(X"AB") 
		    "10001010" WHEN "11100110", --(X"8A") 
		    "10010101" WHEN "11100111", --(X"95") 
		    "00110000" WHEN "11101000", --(X"30") 
		    "00101111" WHEN "11101001", --(X"2F")
		    "00001110" WHEN "11101010", --(X"0E") 
		    "00010001" WHEN "11101011", --(X"11") 
		    "01001100" WHEN "11101100", --(X"4C") 
		    "01010011" WHEN "11101101", --(X"53") 
		    "01110010" WHEN "11101110", --(X"72") 
		    "01101101" WHEN "11101111", --(X"6D") 
		    --the 16th group
		    "00111001" WHEN "11110000", --(X"39") 
		    "00100110" WHEN "11110001", --(X"26") 
		    "00000111" WHEN "11110010", --(X"07") 
		    "00011000" WHEN "11110011", --(X"18") 
		    "01000101" WHEN "11110100", --(X"45") 
		    "01011010" WHEN "11110101", --(X"5A") 
		    "01111011" WHEN "11110110", --(X"7B") 
		    "01100100" WHEN "11110111", --(X"64") 
		    "11000001" WHEN "11111000", --(X"C1") 
		    "11011110" WHEN "11111001", --(X"DE") 
		    "11111111" WHEN "11111010", --(X"FF") 
		    "11100000" WHEN "11111011", --(X"E0") 
		    "10111101" WHEN "11111100", --(X"BD") 
		    "10100010" WHEN "11111101", --(X"A2") 
		    "10000011" WHEN "11111110", --(X"83") 
		    "10011100" WHEN "11111111", --(X"9C") 
		    
		    "XXXXXXXX" WHEN OTHERS;


end Behavioral;
--s_box_4模块
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use work.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity s_box_4 is
PORT(
    s_word_in    :	IN  STD_LOGIC_VECTOR(31 DOWNTO 0);
    s_word_out   :	OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
    );
end s_box_4;

architecture Behavioral of s_box_4 is

COMPONENT s_box 
--component instantiation
PORT(
    s_box_in    :	IN  STD_LOGIC_VECTOR(7 DOWNTO 0);
    s_box_out   :	OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
    );
END COMPONENT;

BEGIN
--generating 4 s-boxes 
sboxes: FOR i IN 3 DOWNTO 0 GENERATE
    sbox_map:	s_box
    PORT MAP(
	    s_box_in => s_word_in(8*i+7 downto 8*i),
	    s_box_out => s_word_out(8*i+7 downto 8*i)
	    );
END GENERATE sboxes;	    


end Behavioral;

--shift_row
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity shift_row is
PORT(
    shiftrow_in     :   IN  STD_LOGIC_VECTOR(127 DOWNTO 0);
    shiftrow_out    :   OUT STD_LOGIC_VECTOR(127 DOWNTO 0)
    );
end shift_row;

architecture Behavioral of shift_row is

TYPE matrix_index is array (15 downto 0) of std_logic_vector(7 downto 0);
SIGNAL b, c : matrix_index;

BEGIN
--changing 128 bits to 16 bytes in order to fit the formation of the function
matrix_mapping:
PROCESS(shiftrow_in)
BEGIN
    FOR i IN 15 DOWNTO 0 LOOP
	b(15-i) <= shiftrow_in(8*i+7 DOWNTO 8*i);
    END LOOP;
END PROCESS matrix_mapping;
--shift row transformation
--	 b(i)	    -->		c(i)
--
--  |a b c d |          |a b c d |    (no shift)             
--  |e f g h |   ==>    |f g h e |    ( 1 left shift)     
--  |i j k l |          |k l i j |    ( 2 left shift)    
--  |m n o p |          |m n o p |    ( 4 left shift)  

--shifted 1st column
c(0)  <=  b(0);
c(1)  <=  b(5);
c(2)  <=  b(10);
c(3)  <=  b(3);
--shifted 2st column
c(4)  <=  b(4);
c(5)  <=  b(9);
c(6)  <=  b(14);
c(7)  <=  b(7);
--shfited 3th column
c(8)  <=  b(8);
c(9)  <=  b(13);
c(10) <=  b(2);
c(11) <=  b(11);
--shifted 4th column
c(12) <=  b(12);
c(13) <=  b(1);
c(14) <=  b(6);
c(15) <=  b(15);


matrix_mapping_back:
--changing 16 bytes to 128 bits for output
PROCESS(c)
BEGIN
    FOR i IN 15 DOWNTO 0 LOOP
	shiftrow_out(8*i+7 DOWNTO 8*i) <= c(15-i);
    END LOOP;
END PROCESS matrix_mapping_back;


end Behavioral;

--mixcolumn
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity mix_column is
PORT(
    mixcolumn_in     :   IN  STD_LOGIC_VECTOR(127 DOWNTO 0);
    mixcolumn_out    :   OUT STD_LOGIC_VECTOR(127 DOWNTO 0)
    );
end mix_column;

architecture Behavioral of mix_column is

TYPE matrix_index is array (15 downto 0) of std_logic_vector(7 downto 0); 
    TYPE shift_index is array (15 downto 0) of std_logic_vector(8 downto 0); 
    SIGNAL shifted_2, shifted_3, xored : shift_index;
    SIGNAL  c, c_out, mult_2, mult_3 : matrix_index;


BEGIN
-- MixColumn Transformation

--  multiplied matrix
--  | 02  03  01  01 |   | c(0) c(4)  c(8) c(12) |
--  | 01  02  03  01 | X | c(1) c(5)  c(9) c(13) |
--  | 01  01  02  03 |   | c(2) c(6) c(10) c(14) |
--  | 03  01  01  02 |   | c(3) c(7) c(11) c(15) |


input_matrix_mapping:
PROCESS(mixcolumn_in)
BEGIN
    FOR i IN 15 DOWNTO 0 LOOP
	c(15-i) <= mixcolumn_in(8*i+7 DOWNTO 8*i);
    END LOOP;
END PROCESS input_matrix_mapping;

multiplication_by_2:
PROCESS(c, shifted_2)
BEGIN
--move every bit of a byte toward higher position a step to perform multiply2 
    FOR i IN  15 DOWNTO 0 LOOP
	shifted_2(i) <= c(i) & '0';	
	IF (shifted_2(i)(8)='1') THEN	
	    mult_2(i) <= shifted_2(i)(7 downto 0) XOR "00011011";
	ELSE
	    mult_2(i) <= shifted_2(i)(7 downto 0);
	END IF;
    END LOOP;
END PROCESS multiplication_by_2;
multiplication_by_3:
PROCESS(c, shifted_3, xored)
BEGIN
    FOR i IN  15 DOWNTO 0 LOOP
	shifted_3(i) <= c(i) & '0';	   
	xored(i) <= shifted_3(i) XOR '0' & c(i);  
	IF (xored(i)(8)='1') THEN	     
	    mult_3(i) <= xored(i)(7 downto 0) XOR "00011011";
	ELSE
	    mult_3(i) <= xored(i)(7 downto 0);
	END IF;
    END LOOP;
END PROCESS multiplication_by_3;
--group 1
c_out(0)  <= mult_2(0) XOR mult_3(1) XOR c(2) XOR c(3);
c_out(4)  <= mult_2(4) XOR mult_3(5) XOR c(6) XOR c(7);
c_out(8)  <= mult_2(8) XOR mult_3(9) XOR c(10) XOR c(11);
c_out(12) <= mult_2(12) XOR mult_3(13) XOR c(14) XOR c(15);
--group 2
c_out(1)  <= c(0) XOR mult_2(1) XOR mult_3(2) XOR c(3); 
c_out(5)  <= c(4) XOR mult_2(5) XOR mult_3(6) XOR c(7); 
c_out(9)  <= c(8) XOR mult_2(9) XOR mult_3(10) XOR c(11); 
c_out(13) <= c(12) XOR mult_2(13) XOR mult_3(14) XOR c(15); 
--group 3
c_out(2)  <= c(0) XOR c(1) XOR mult_2(2) XOR mult_3(3);
c_out(6)  <= c(4) XOR c(5) XOR mult_2(6) XOR mult_3(7);
c_out(10) <= c(8) XOR c(9) XOR mult_2(10) XOR mult_3(11);
c_out(14) <= c(12) XOR c(13) XOR mult_2(14) XOR mult_3(15);
--group 4
c_out(3)  <= mult_3(0) XOR c(1) XOR c(2) XOR mult_2(3);
c_out(7)  <= mult_3(4) XOR c(5) XOR c(6) XOR mult_2(7);
c_out(11) <= mult_3(8) XOR c(9) XOR c(10) XOR mult_2(11);
c_out(15) <= mult_3(12) XOR c(13) XOR c(14) XOR mult_2(15);


map_to_vector:
PROCESS(c_out)
BEGIN
    FOR i IN 15 DOWNTO 0 LOOP
	mixcolumn_out(8*i+7 DOWNTO 8*i) <= c_out(15-i);
    END LOOP;
END PROCESS map_to_vector;


end Behavioral;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -