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

📄 mickey_128.vhd

📁 Mickey-128流密码的VHDL源程序
💻 VHD
字号:
--This software is provided 'as-is', without any express or implied warranty.
--In no event will the authors be held liable for any damages arising from the use of this software.

--Permission is granted to anyone to use this software for any purpose,
--excluding commercial applications, and to alter it and redistribute
--it freely except for commercial applications. 
--File:         Mickey_128.vhd
--Author:       Richard Stern (rstern01@utopia.poly.edu)
--Organization: Polytechnic University
--------------------------------------------------------
--Description: Mickey_128 encryption algorithm
--------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity mickey_128 is
	port(	clk, rst	: in std_logic; 
		key	 : in std_logic_vector(127 downto 0);
		IV	 : in std_logic_vector(127 downto 0);
		IV_length : in std_logic_vector(7 downto 0);
		o_vld	 : out std_logic;
		z	 : out std_logic);
end mickey_128;


architecture do_it of mickey_128 is
signal input_bit_r, control_bit_r, input_bit: std_logic;
signal input_bit_s, control_bit_s: std_logic;
signal fbit, sbit: std_logic;
signal r_reg, s_reg, r_tmp, r_tmp_xor, r_select, s_tmp: std_logic_vector(159 downto 0);
signal comp0, comp1: std_logic_vector(158 downto 1);
signal fb0, fb1, fbs: std_logic_vector(159 downto 0);
type statetype is (reset, load_IV, load_K, preclock, run);
signal state : statetype;
signal count : integer range 0 to 160;

begin
	control_bit_r <= s_reg(54) xor r_reg(106);
	control_bit_s <= s_reg(106) xor r_reg(53);
 
 	--input bit r
 	with state select
 	input_bit_r <= input_bit when run,
 			input_bit xor s_reg(80) when OTHERS;
	
	--clock_r
	fbit <= r_reg(159) xor input_bit_r;
	
	r_tmp <= r_reg(158) & r_reg(157) & (r_reg(156) xor fbit) & (r_reg(155) xor fbit) & r_reg(154) & (r_reg(153) xor fbit)
			& (r_reg(152) xor fbit) & (r_reg(151) xor fbit) & r_reg(150) & (r_reg(149) xor fbit) & r_reg(148) & 
			(r_reg(147) xor fbit) & r_reg(146) & r_reg(145) & (r_reg(144) xor fbit) & r_reg(143) & r_reg(142) & 
			(r_reg(141) xor fbit) & r_reg(140) & (r_reg(139) xor fbit) & r_reg(138) & r_reg(137) & (r_reg(136) xor fbit) & 
			(r_reg(135) xor fbit) & (r_reg(134) xor fbit) & r_reg(133) & (r_reg(132) xor fbit) & r_reg(131) & 
			(r_reg(130) xor fbit) & (r_reg(129) xor fbit) & (r_reg(128) xor fbit) & (r_reg(127) xor fbit) & (r_reg(126) xor fbit) &
			r_reg(125) & r_reg(124) & r_reg(123) & r_reg(122) & r_reg(121) & r_reg(120) & r_reg(119) & 
			r_reg(118) & r_reg(117) & (r_reg(116) xor fbit) & (r_reg(115) xor fbit) & (r_reg(114) xor fbit) & r_reg(113) & 
			(r_reg(112) xor fbit) & (r_reg(111) xor fbit) & (r_reg(110) xor fbit) & r_reg(109) & (r_reg(108) xor fbit) & 
			(r_reg(107) xor fbit) & (r_reg(106) xor fbit) & (r_reg(105) xor fbit) & (r_reg(104) xor fbit) & r_reg(103) & 
			r_reg(102) & r_reg(101) & (r_reg(100) xor fbit) & (r_reg(99) xor fbit) & r_reg(98) & r_reg(97) & (r_reg(96) xor fbit) & 
			r_reg(95) & (r_reg(94) xor fbit) & r_reg(93) & r_reg(92) & (r_reg(91) xor fbit) & (r_reg(90) xor fbit) & 
			(r_reg(89) xor fbit) & r_reg(88) & r_reg(87) & r_reg(86) &
			(r_reg(85) xor fbit) & (r_reg(84) xor fbit) & r_reg(83) & r_reg(82) & (r_reg(81) xor fbit) & (r_reg(80) xor fbit) &
			(r_reg(79) xor fbit) & (r_reg(78) xor fbit) & r_reg(77) & r_reg(76) & (r_reg(75) xor fbit) & r_reg(74) &
			(r_reg(73) xor fbit) & (r_reg(72) xor fbit) & r_reg(71) & r_reg(70) & r_reg(69) & (r_reg(68) xor fbit) &
			r_reg(67) & r_reg(66) & (r_reg(65) xor fbit) & (r_reg(64) xor fbit) & r_reg(63) & (r_reg(62) xor fbit) &
			(r_reg(61) xor fbit) & (r_reg(60) xor fbit) & (r_reg(59) xor fbit) & r_reg(58) & r_reg(57) &
			(r_reg(56) xor fbit) & (r_reg(55) xor fbit) & (r_reg(54) xor fbit) & (r_reg(53) xor fbit) & (r_reg(52) xor fbit) &
			r_reg(51) & (r_reg(50) xor fbit) & (r_reg(49) xor fbit) & r_reg(48) & r_reg(47) & r_reg(46) & (r_reg(45) xor fbit) &
			r_reg(44) & r_reg(43) & (r_reg(42) xor fbit) & (r_reg(41) xor fbit) & r_reg(40) & r_reg(39) & r_reg(38) &
			(r_reg(37) xor fbit) & r_reg(36) & (r_reg(35) xor fbit) & (r_reg(34) xor fbit) & r_reg(33) & r_reg(32) &
			(r_reg(31) xor fbit) & r_reg(30) & (r_reg(29) xor fbit) & r_reg(28) & r_reg(27) & r_reg(26) & r_reg(25) &
			(r_reg(24) xor fbit) & r_reg(23) & r_reg(22) & r_reg(21) & r_reg(20) & (r_reg(19) xor fbit) & r_reg(18) &
			r_reg(17) & r_reg(16) & (r_reg(15) xor fbit) & r_reg(14) & (r_reg(13) xor fbit) & r_reg(12) & r_reg(11) &
			(r_reg(10) xor fbit) & (r_reg(9) xor fbit) & r_reg(8) & (r_reg(7) xor fbit) & r_reg(6) & r_reg(5) &
			(r_reg(4) xor fbit) & (r_reg(3) xor fbit) & r_reg(2) & r_reg(1) & r_reg(0) & fbit;

	r_tmp_xor <= (r_reg(158) & r_reg(157) & (r_reg(156) xor fbit) & (r_reg(155) xor fbit) & r_reg(154) & (r_reg(153) xor fbit)
			& (r_reg(152) xor fbit) & (r_reg(151) xor fbit) & r_reg(150) & (r_reg(149) xor fbit) & r_reg(148) & 
			(r_reg(147) xor fbit) & r_reg(146) & r_reg(145) & (r_reg(144) xor fbit) & r_reg(143) & r_reg(142) & 
			(r_reg(141) xor fbit) & r_reg(140) & (r_reg(139) xor fbit) & r_reg(138) & r_reg(137) & (r_reg(136) xor fbit) & 
			(r_reg(135) xor fbit) & (r_reg(134) xor fbit) & r_reg(133) & (r_reg(132) xor fbit) & r_reg(131) & 
			(r_reg(130) xor fbit) & (r_reg(129) xor fbit) & (r_reg(128) xor fbit) & (r_reg(127) xor fbit) & (r_reg(126) xor fbit) &
			r_reg(125) & r_reg(124) & r_reg(123) & r_reg(122) & r_reg(121) & r_reg(120) & r_reg(119) & 
			r_reg(118) & r_reg(117) & (r_reg(116) xor fbit) & (r_reg(115) xor fbit) & (r_reg(114) xor fbit) & r_reg(113) & 
			(r_reg(112) xor fbit) & (r_reg(111) xor fbit) & (r_reg(110) xor fbit) & r_reg(109) & (r_reg(108) xor fbit) & 
			(r_reg(107) xor fbit) & (r_reg(106) xor fbit) & (r_reg(105) xor fbit) & (r_reg(104) xor fbit) & r_reg(103) & 
			r_reg(102) & r_reg(101) & (r_reg(100) xor fbit) & (r_reg(99) xor fbit) & r_reg(98) & r_reg(97) & (r_reg(96) xor fbit) & 
			r_reg(95) & (r_reg(94) xor fbit) & r_reg(93) & r_reg(92) & (r_reg(91) xor fbit) & (r_reg(90) xor fbit) & 
			(r_reg(89) xor fbit) & r_reg(88) & r_reg(87) & r_reg(86) &
			(r_reg(85) xor fbit) & (r_reg(84) xor fbit) & r_reg(83) & r_reg(82) & (r_reg(81) xor fbit) & (r_reg(80) xor fbit) &
			(r_reg(79) xor fbit) & (r_reg(78) xor fbit) & r_reg(77) & r_reg(76) & (r_reg(75) xor fbit) & r_reg(74) &
			(r_reg(73) xor fbit) & (r_reg(72) xor fbit) & r_reg(71) & r_reg(70) & r_reg(69) & (r_reg(68) xor fbit) &
			r_reg(67) & r_reg(66) & (r_reg(65) xor fbit) & (r_reg(64) xor fbit) & r_reg(63) & (r_reg(62) xor fbit) &
			(r_reg(61) xor fbit) & (r_reg(60) xor fbit) & (r_reg(59) xor fbit) & r_reg(58) & r_reg(57) &
			(r_reg(56) xor fbit) & (r_reg(55) xor fbit) & (r_reg(54) xor fbit) & (r_reg(53) xor fbit) & (r_reg(52) xor fbit) &
			r_reg(51) & (r_reg(50) xor fbit) & (r_reg(49) xor fbit) & r_reg(48) & r_reg(47) & r_reg(46) & (r_reg(45) xor fbit) &
			r_reg(44) & r_reg(43) & (r_reg(42) xor fbit) & (r_reg(41) xor fbit) & r_reg(40) & r_reg(39) & r_reg(38) &
			(r_reg(37) xor fbit) & r_reg(36) & (r_reg(35) xor fbit) & (r_reg(34) xor fbit) & r_reg(33) & r_reg(32) &
			(r_reg(31) xor fbit) & r_reg(30) & (r_reg(29) xor fbit) & r_reg(28) & r_reg(27) & r_reg(26) & r_reg(25) &
			(r_reg(24) xor fbit) & r_reg(23) & r_reg(22) & r_reg(21) & r_reg(20) & (r_reg(19) xor fbit) & r_reg(18) &
			r_reg(17) & r_reg(16) & (r_reg(15) xor fbit) & r_reg(14) & (r_reg(13) xor fbit) & r_reg(12) & r_reg(11) &
			(r_reg(10) xor fbit) & (r_reg(9) xor fbit) & r_reg(8) & (r_reg(7) xor fbit) & r_reg(6) & r_reg(5) &
			(r_reg(4) xor fbit) & (r_reg(3) xor fbit) & r_reg(2) & r_reg(1) & r_reg(0) & fbit) xor r_reg;
			
	with control_bit_r select
		r_select <= r_tmp when '0', r_tmp_xor when OTHERS;
		
	--clock_s
	comp0 <= "00" & X"7DF035F1BD7EC98BC8038313C9304AAAEEB792F";
	comp1 <= "11" & X"FFA2DDAB33071A2BE0061F07F5B1E4C3E8C8F98";
	fb0   <= X"83630BC1D4544B9166E54D810E2FA322C43C1FAF";
	fb1   <= X"11A780EF6C4B7EE76F9A18B670798C909BF477AB";
		
	sbit <= s_reg(159) xor input_bit_s;
		
	with control_bit_s select
		fbs <= fb0 when '0', fb1 when OTHERS;
		
	clock_s : for i in 1 to 158 generate
		s_tmp(i) <= s_reg(i-1) xor ((s_reg(i) xor comp0(i)) and (s_reg(i+1) xor comp1(i))) xor (fbs(i) and sbit);	
	end generate clock_s;
		
	s_tmp(0) <= (fbs(0) and sbit);
	s_tmp(159) <= s_reg(158) xor (fbs(159) and sbit);

	--output
	z <= r_reg(0) xor s_reg(0);
	
--s_reg
process(rst, clk)
begin
if (rst = '1' or state = reset) then
	s_reg <= (others => '0');
elsif (clk'event and clk = '1') then
	s_reg <= s_tmp;
end if;
end process;

--r_reg
process(rst, clk)
begin
if (rst = '1' or state = reset) then
	r_reg <= (others => '0');
elsif (clk'event and clk = '1') then
	r_reg <= r_select;
end if;
end process;

--state machine
process(rst, clk)
begin
if (rst = '1') then
	if (IV_length /= "00000000") then
		state <= load_IV;
		count <= 1;
		o_vld <= '0';
		input_bit <= IV(0);
		input_bit_s <= IV(0);
	else
		state <= load_K;
		count <= 1;
		o_vld <= '0';
		input_bit <= key(0);
		input_bit_s <= key(0);
	end if;
elsif (clk'event and clk = '1') then
	case state is
		
		when load_IV =>
			input_bit <= IV(count);
			input_bit_s <= IV(count);
			if(count = conv_integer(IV_length-1)) then
				count <= 0;
				state <= load_K;
			else
				count <= count + 1;
			end if;
		when load_K =>
			input_bit <= key(count);
			input_bit_s <= key(count);

			if(count = 127) then
				count <= 0;
				state <= preclock;
			else
				count <= count + 1;
			end if;
			
		when preclock =>
			input_bit <= '0';
			input_bit_s <= '0';

			if(count = 160) then
				count <= 0;
				state <= run;
				o_vld <= '1';
			else
				count <= count + 1;
			end if;
			
		when run =>
			input_bit <= '0';
			input_bit_s <= '0';

		when others =>
		
	end case;
end if;
end process;

end do_it;

⌨️ 快捷键说明

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