📄 des56.vhd
字号:
K11 <= inkey(8) & inkey(49) & inkey(32) & inkey(58) & inkey(18) & inkey(51) & inkey(2) & inkey(26) & inkey(0) & inkey(43) & inkey(17) & inkey(40) & inkey(1) & inkey(33) & inkey(24) & inkey(59) & inkey(42) & inkey(56) & inkey(57) & inkey(35) & inkey(34) & inkey(25) & inkey(16) & inkey(10) & inkey(22) & inkey(60) & inkey(4) & inkey(54) & inkey(37) & inkey(36) & inkey(12) & inkey(30) & inkey(5) & inkey(53) & inkey(19) & inkey(29) & inkey(61) & inkey(21) & inkey(38) & inkey(28) & inkey(11) & inkey(52) & inkey(45) & inkey(14) & inkey(13) & inkey(62) & inkey(20) & inkey(27); K12 <= inkey(57) & inkey(33) & inkey(16) & inkey(42) & inkey(2) & inkey(35) & inkey(51) & inkey(10) & inkey(49) & inkey(56) & inkey(1) & inkey(24) & inkey(50) & inkey(17) & inkey(8) & inkey(43) & inkey(26) & inkey(40) & inkey(41) & inkey(48) & inkey(18) & inkey(9) & inkey(0) & inkey(59) & inkey(6) & inkey(44) & inkey(19) & inkey(38) & inkey(21) & inkey(20) & inkey(27) & inkey(14) & inkey(52) & inkey(37) & inkey(3) & inkey(13) & inkey(45) & inkey(5) & inkey(22) & inkey(12) & inkey(62) & inkey(36) & inkey(29) & inkey(61) & inkey(60) & inkey(46) & inkey(4) & inkey(11); K13 <= inkey(41) & inkey(17) & inkey(0) & inkey(26) & inkey(51) & inkey(48) & inkey(35) & inkey(59) & inkey(33) & inkey(40) & inkey(50) & inkey(8) & inkey(34) & inkey(1) & inkey(57) & inkey(56) & inkey(10) & inkey(24) & inkey(25) & inkey(32) & inkey(2) & inkey(58) & inkey(49) & inkey(43) & inkey(53) & inkey(28) & inkey(3) & inkey(22) & inkey(5) & inkey(4) & inkey(11) & inkey(61) & inkey(36) & inkey(21) & inkey(54) & inkey(60) & inkey(29) & inkey(52) & inkey(6) & inkey(27) & inkey(46) & inkey(20) & inkey(13) & inkey(45) & inkey(44) & inkey(30) & inkey(19) & inkey(62); K14 <= inkey(25) & inkey(1) & inkey(49) & inkey(10) & inkey(35) & inkey(32) & inkey(48) & inkey(43) & inkey(17) & inkey(24) & inkey(34) & inkey(57) & inkey(18) & inkey(50) & inkey(41) & inkey(40) & inkey(59) & inkey(8) & inkey(9) & inkey(16) & inkey(51) & inkey(42) & inkey(33) & inkey(56) & inkey(37) & inkey(12) & inkey(54) & inkey(6) & inkey(52) & inkey(19) & inkey(62) & inkey(45) & inkey(20) & inkey(5) & inkey(38) & inkey(44) & inkey(13) & inkey(36) & inkey(53) & inkey(11) & inkey(30) & inkey(4) & inkey(60) & inkey(29) & inkey(28) & inkey(14) & inkey(3) & inkey(46); K15 <= inkey(17) & inkey(58) & inkey(41) & inkey(2) & inkey(56) & inkey(24) & inkey(40) & inkey(35) & inkey(9) & inkey(16) & inkey(26) & inkey(49) & inkey(10) & inkey(42) & inkey(33) & inkey(32) & inkey(51) & inkey(0) & inkey(1) & inkey(8) & inkey(43) & inkey(34) & inkey(25) & inkey(48) & inkey(29) & inkey(4) & inkey(46) & inkey(61) & inkey(44) & inkey(11) & inkey(54) & inkey(37) & inkey(12) & inkey(60) & inkey(30) & inkey(36) & inkey(5) & inkey(28) & inkey(45) & inkey(3) & inkey(22) & inkey(27) & inkey(52) & inkey(21) & inkey(20) & inkey(6) & inkey(62) & inkey(38); end if; end if; end if; end process RegData;-- Select the key value for the next encryption round-- Use the current value of COUNTUP to determine which round of encryption is next.-- Load the MYKEY register with the appropriate round key value.-- Note that on the first pass, the round key is not available, and must be-- loaded directly from the input signals. The correct value is determined by-- the state of the DECIPHER signal. SetKey: process (clk, countup, decipher) -- NOTE: according to ModelSim, the output value of some of these multiplexers -- is not stable for enough time before the clock is propagated. What can I do -- about that? begin if rising_edge(clk) then case countup is when 0 => if decipher = '1' then mykey <= inkey(17) & inkey(58) & inkey(41) & inkey(2) & inkey(56) & inkey(24) & inkey(40) & inkey(35) & inkey(9) & inkey(16) & inkey(26) & inkey(49) & inkey(10) & inkey(42) & inkey(33) & inkey(32) & inkey(51) & inkey(0) & inkey(1) & inkey(8) & inkey(43) & inkey(34) & inkey(25) & inkey(48) & inkey(29) & inkey(4) & inkey(46) & inkey(61) & inkey(44) & inkey(11) & inkey(54) & inkey(37) & inkey(12) & inkey(60) & inkey(30) & inkey(36) & inkey(5) & inkey(28) & inkey(45) & inkey(3) & inkey(22) & inkey(27) & inkey(52) & inkey(21) & inkey(20) & inkey(6) & inkey(62) & inkey(38); else mykey <= inkey(9) & inkey(50) & inkey(33) & inkey(59) & inkey(48) & inkey(16) & inkey(32) & inkey(56) & inkey(1) & inkey(8) & inkey(18) & inkey(41) & inkey(2) & inkey(34) & inkey(25) & inkey(24) & inkey(43) & inkey(57) & inkey(58) & inkey(0) & inkey(35) & inkey(26) & inkey(17) & inkey(40) & inkey(21) & inkey(27) & inkey(38) & inkey(53) & inkey(36) & inkey(3) & inkey(46) & inkey(29) & inkey(4) & inkey(52) & inkey(22) & inkey(28) & inkey(60) & inkey(20) & inkey(37) & inkey(62) & inkey(14) & inkey(19) & inkey(44) & inkey(13) & inkey(12) & inkey(61) & inkey(54) & inkey(30); end if; when 1 => mykey <= K01; when 2 => mykey <= K02; when 3 => mykey <= K03; when 4 => mykey <= K04; when 5 => mykey <= K05; when 6 => mykey <= K06; when 7 => mykey <= K07; when 8 => mykey <= K08; when 9 => mykey <= K09; when 10 => mykey <= K10; when 11 => mykey <= K11; when 12 => mykey <= K12; when 13 => mykey <= K13; when 14 => mykey <= K14; when 15 => mykey <= K15; when others => end case; end if; end process SetKey;-- Load the message word for the next encryption round-- As in SetKey, the data must be taken from the input ports on the first round.-- For all other rounds, the data value is taken from the OUTMSG signal. This signal-- is produced by combinatorial logic.---- The first round of this cycle can be the last round of the previous cycle. Output is-- driven at this time. SetData: process (clk, countup, rst, ds) variable C17: std_logic_vector(1 to 64); begin if rst = '1' then rdy <= '1'; elsif rising_edge(clk) then -- NOTE: INMSG is driven by a multiplexer. It seems that the output signal -- for this mux is not always stable before the clock is propagated. Same -- problem as above. Should I be using another construct? case countup is when 0 => if ds = '1' then inmsg <= indata(57) & indata(49) & indata(41) & indata(33) & indata(25) & indata(17) & indata(9) & indata(1) & indata(59) & indata(51) & indata(43) & indata(35) & indata(27) & indata(19) & indata(11) & indata(3) & indata(61) & indata(53) & indata(45) & indata(37) & indata(29) & indata(21) & indata(13) & indata(5) & indata(63) & indata(55) & indata(47) & indata(39) & indata(31) & indata(23) & indata(15) & indata(7) & indata(56) & indata(48) & indata(40) & indata(32) & indata(24) & indata(16) & indata(8) & indata(0) & indata(58) & indata(50) & indata(42) & indata(34) & indata(26) & indata(18) & indata(10) & indata(2) & indata(60) & indata(52) & indata(44) & indata(36) & indata(28) & indata(20) & indata(12) & indata(4) & indata(62) & indata(54) & indata(46) & indata(38) & indata(30) & indata(22) & indata(14) & indata(6); rdy <= '0'; -- Manage the "Data ready" signal end if; if ready = '0' then --ready is really a "crypto in progress" signal C17(1 to 32) := outmsg(32 to 63); C17(33 to 64) := outmsg(0 to 31); outdata <= C17(40) & C17(8) & C17(48) & C17(16) & C17(56) & C17(24) & C17(64) & C17(32) & C17(39) & C17(7) & C17(47) & C17(15) & C17(55) & C17(23) & C17(63) & C17(31) & C17(38) & C17(6) & C17(46) & C17(14) & C17(54) & C17(22) & C17(62) & C17(30) & C17(37) & C17(5) & C17(45) & C17(13) & C17(53) & C17(21) & C17(61) & C17(29) & C17(36) & C17(4) & C17(44) & C17(12) & C17(52) & C17(20) & C17(60) & C17(28) & C17(35) & C17(3) & C17(43) & C17(11) & C17(51) & C17(19) & C17(59) & C17(27) & C17(34) & C17(2) & C17(42) & C17(10) & C17(50) & C17(18) & C17(58) & C17(26) & C17(33) & C17(1) & C17(41) & C17(9) & C17(49) & C17(17) & C17(57) & C17(25); rdy <= '1'; end if; when others => inmsg <= outmsg; rdy <= '0'; end case; end if; end process setdata;-- This handles the READY signal and counts the counters Control: process (clk, ready, ds, RST, countup) begin if RST = '1' then ready <= '1'; countup <= 0; elsif rising_edge(clk) then if ready = '1' then if ds = '1' then ready <= '0'; countup <= 1; end if; else if countup = 0 then if ds = '0' then ready <= '1'; end if; elsif countup < 15 then countup <= countup + 1; else countup <= 0; end if; end if; end if; end process control;-- Combinatorial Logic-- all of this takes around 7-8ns. Is there a way to make it faster?---- expand 32 bits of the message word to 48 bits, mix it with the round key, -- then load it into 6-bit indexes. b1 <= (inmsg(63) & inmsg(36) & inmsg(32 to 35)) xor (mykey(0) & mykey(5) & mykey(1 to 4)); b2 <= (inmsg(35) & inmsg(40) & inmsg(36 to 39)) xor (mykey(6) & mykey(11) & mykey(7 to 10)); b3 <= (inmsg(39) & inmsg(44) & inmsg(40 to 43)) xor (mykey(12) & mykey(17) & mykey(13 to 16)); b4 <= (inmsg(43) & inmsg(48) & inmsg(44 to 47)) xor (mykey(18) & mykey(23) & mykey(19 to 22)); b5 <= (inmsg(47) & inmsg(52) & inmsg(48 to 51)) xor (mykey(24) & mykey(29) & mykey(25 to 28)); b6 <= (inmsg(51) & inmsg(56) & inmsg(52 to 55)) xor (mykey(30) & mykey(35) & mykey(31 to 34)); b7 <= (inmsg(55) & inmsg(60) & inmsg(56 to 59)) xor (mykey(36) & mykey(41) & mykey(37 to 40)); b8 <= (inmsg(59) & inmsg(32) & inmsg(60 to 63)) xor (mykey(42) & mykey(47) & mykey(43 to 46));-- 8 select statements to look up 4-bit S Box values based on the 6-bit indexes. with b1 select s1 <= x"e" when "000000", x"4" when "000001", x"d" when "000010", x"1" when "000011", x"2" when "000100", x"f" when "000101", x"b" when "000110", x"8" when "000111", x"3" when "001000", x"a" when "001001", x"6" when "001010", x"c" when "001011", x"5" when "001100", x"9" when "001101", x"0" when "001110", x"7" when "001111", x"0" when "010000", x"f" when "010001", x"7" when "010010", x"4" when "010011", x"e" when "010100", x"2" when "010101", x"d" when "010110", x"1" when "010111", x"a" when "011000", x"6" when "011001", x"c" when "011010", x"b" when "011011", x"9" when "011100", x"5" when "011101", x"3" when "011110", x"8" when "011111", x"4" when "100000", x"1" when "100001", x"e" when "100010", x"8" when "100011", x"d" when "100100", x"6" when "100101", x"2" when "100110", x"b" when "100111", x"f" when "101000", x"c" when "101001", x"9" when "101010", x"7" when "101011", x"3" when "101100", x"a" when "101101", x"5" when "101110", x"0" when "101111", x"f" when "110000", x"c" when "110001", x"8" when "110010", x"2" when "110011", x"4" when "110100", x"9" when "110101", x"1" when "110110", x"7" when "110111", x"5" when "111000", x"b" when "111001", x"3" when "111010", x"e" when "111011", x"a" when "111100", x"0" when "111101", x"6" when "111110", x"d" when "111111", "XXXX" when others; with b2 select s2 <= x"f" when "000000", x"1" when "000001", x"8" when "000010", x"e" when "000011", x"6" when "000100", x"b" when "000101", x"3" when "000110", x"4" when "000111", x"9" when "001000", x"7" when "001001", x"2" when "001010", x"d" when "001011", x"c" when "001100", x"0" when "001101", x"5" when "001110", x"a" when "001111", x"3" when "010000", x"d" when "010001", x"4" when "010010", x"7" when "010011", x"f" when "010100", x"2" when "010101", x"8" when "010110", x"e" when "010111", x"c" when "011000", x"0" when "011001", x"1" when "011010", x"a" when "011011", x"6" when "011100", x"9" when "011101", x"b" when "011110", x"5" when "011111", x"0" when "100000", x"e" when "100001", x"7" when "100010", x"b" when "100011", x"a" when "100100", x"4" when "100101", x"d" when "100110", x"1" when "100111", x"5" when "101000", x"8" when "101001", x"c" when "101010", x"6" when "101011", x"9" when "101100", x"3" when "101101", x"2" when "101110", x"f" when "101111", x"d" when "110000", x"8" when "110001", x"a" when "110010", x"1" when "110011", x"3" when "110100", x"f" when "110101", x"4" when "110110", x"2" when "110111", x"b" when "111000", x"6" when "111001", x"7" when "111010", x"c" when "111011", x"0" when "111100", x"5" when "111101", x"e" when "111110", x"9" when "111111", "XXXX" when others; with b3 select s3 <= x"a" when "000000", x"0" when "000001", x"9" when "000010", x"e" when "000011", x"6" when "000100", x"3" when "000101", x"f" when "000110", x"5" when "000111", x"1" when "001000", x"d" when "001001", x"c" when "001010", x"7" when "001011", x"b" when "001100", x"4" when "001101", x"2" when "001110", x"8" when "001111", x"d" when "010000", x"7" when "010001", x"0" when "010010", x"9" when "010011", x"3" when "010100", x"4" when "010101", x"6" when "010110", x"a" when "010111", x"2" when "011000", x"8" when "011001", x"5" when "011010", x"e" when "011011", x"c" when "011100", x"b" when "011101", x"f" when "011110", x"1" when "011111", x"d" when "100000",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -