📄 mickey_128.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 + -