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

📄 des.vhd

📁 基于 xinlinx 写的DES加密算法
💻 VHD
📖 第 1 页 / 共 4 页
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;


package des_lib is
  component des_fast
    port (clk		:in std_logic;
          reset		:in std_logic;
          stall		:in std_logic;

	  encrypt	:in std_logic;  -- 1=encrypt, 0=decrypt
          key_in	:in std_logic_vector (55 downto 0);
          din		:in std_logic_vector (63 downto 0);
          din_valid     :in std_logic;

          dout		:out std_logic_vector (63 downto 0);
          dout_valid	:out std_logic;
          key_out	:out std_logic_vector (55 downto 0)
         );
  end component;

        
  component des_round
    port (clk		:in std_logic;
          reset		:in std_logic;
          stall		:in std_logic;

	  encrypt_in	:in std_logic;
          encrypt_shift	:in std_logic_vector (4 downto 0);
          decrypt_shift	:in std_logic_vector (4 downto 0);
          key_in	:in std_logic_vector (55 downto 0);
          din		:in std_logic_vector (63 downto 0);
          din_valid     :in std_logic;	


	  encrypt_out	:out std_logic;
          key_out	:out std_logic_vector (55 downto 0);
          dout		:out std_logic_vector (63 downto 0);
          dout_valid	:out std_logic
         );
  end component;


  -- Inital permutation
  function des_ip(din	:std_logic_vector(63 downto 0))
                  return std_logic_vector;

  -- Final permutation
  function des_fp(din	:std_logic_vector(63 downto 0))
                  return std_logic_vector;

  -- Key permutation, converts a 64 bit key into a 56 bit key, ignoring parity
  function des_kp(din   :std_logic_vector (63 downto 0))
                  return std_logic_vector;

  -- Compression Permutation, converts a 56 bit key into a 48 bits.
  function des_cp(din   :std_logic_vector (55 downto 0))
                  return std_logic_vector;

  -- Expansion permutation
  function des_ep(din   :std_logic_vector (31 downto 0))
                  return std_logic_vector;

  -- S-Box Substitution, 48 bits in, 32 bits out.
  function des_sbox(din   :std_logic_vector (47 downto 0))
                    return std_logic_vector;

  -- P-Box Permutation
  function des_pbox(din   :std_logic_vector (31 downto 0))
                    return std_logic_vector;

  -- Key Shift
  function des_keyshift (din	:std_logic_vector (55 downto 0);
                         n 	:std_logic_vector (4 downto 0))
                         return std_logic_vector;
                  
end des_lib;


----------------------------------------------------------------------------
----------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library work;
use work.des_lib.all;

package body des_lib is
  --------------------------------------------------------
  -- Inital permutation
  function des_ip(din	:std_logic_vector(63 downto 0))
                  return std_logic_vector is
    variable val 	:std_logic_vector (63 downto 0);
  begin
    val := din(64-58) & din(64-50) & din(64-42) & din(64-34) & din(64-26) & din(64-18) & din(64-10) & din(64- 2) &
           din(64-60) & din(64-52) & din(64-44) & din(64-36) & din(64-28) & din(64-20) & din(64-12) & din(64- 4) &
           din(64-62) & din(64-54) & din(64-46) & din(64-38) & din(64-30) & din(64-22) & din(64-14) & din(64- 6) &
           din(64-64) & din(64-56) & din(64-48) & din(64-40) & din(64-32) & din(64-24) & din(64-16) & din(64- 8) &
           
           din(64-57) & din(64-49) & din(64-41) & din(64-33) & din(64-25) & din(64-17) & din(64- 9) & din(64- 1) &
           din(64-59) & din(64-51) & din(64-43) & din(64-35) & din(64-27) & din(64-19) & din(64-11) & din(64- 3) &
           din(64-61) & din(64-53) & din(64-45) & din(64-37) & din(64-29) & din(64-21) & din(64-13) & din(64- 5) &
           din(64-63) & din(64-55) & din(64-47) & din(64-39) & din(64-31) & din(64-23) & din(64-15) & din(64- 7);
    return val;
  end des_ip;


  --------------------------------------------------------
  -- Final permutation
  function des_fp(din	:std_logic_vector(63 downto 0))
                  return std_logic_vector is
    variable val 	:std_logic_vector (63 downto 0);
  begin
    val := din(64-40) & din(64- 8) & din(64-48) & din(64-16) & din(64-56) & din(64-24) & din(64-64) & din(64-32) &
           din(64-39) & din(64- 7) & din(64-47) & din(64-15) & din(64-55) & din(64-23) & din(64-63) & din(64-31) &
           din(64-38) & din(64- 6) & din(64-46) & din(64-14) & din(64-54) & din(64-22) & din(64-62) & din(64-30) &
           din(64-37) & din(64- 5) & din(64-45) & din(64-13) & din(64-53) & din(64-21) & din(64-61) & din(64-29) &           
           din(64-36) & din(64- 4) & din(64-44) & din(64-12) & din(64-52) & din(64-20) & din(64-60) & din(64-28) &
           din(64-35) & din(64- 3) & din(64-43) & din(64-11) & din(64-51) & din(64-19) & din(64-59) & din(64-27) &           
           din(64-34) & din(64- 2) & din(64-42) & din(64-10) & din(64-50) & din(64-18) & din(64-58) & din(64-26) &
           din(64-33) & din(64- 1) & din(64-41) & din(64- 9) & din(64-49) & din(64-17) & din(64-57) & din(64-25);
    return val;
  end des_fp;


  --------------------------------------------------------
  -- Key permutation, converts a 64 bit key into a 56 bit key, ignoring parity
  function des_kp(din   :std_logic_vector (63 downto 0))
                  return std_logic_vector is
    variable val 	:std_logic_vector (55 downto 0);
  begin
    val := din(64-57) & din(64-49) & din(64-41) & din(64-33) & din(64-25) & din(64-17) & din(64- 9) & din(64- 1) &
           din(64-58) & din(64-50) & din(64-42) & din(64-34) & din(64-26) & din(64-18) & din(64-10) & din(64- 2) &
           din(64-59) & din(64-51) & din(64-43) & din(64-35) & din(64-27) & din(64-19) & din(64-11) & din(64- 3) &
           din(64-60) & din(64-52) & din(64-44) & din(64-36) &

           din(64-63) & din(64-55) & din(64-47) & din(64-39) & din(64-31) & din(64-23) & din(64-15) & din(64- 7) &
           din(64-62) & din(64-54) & din(64-46) & din(64-38) & din(64-30) & din(64-22) & din(64-14) & din(64- 6) &
           din(64-61) & din(64-53) & din(64-45) & din(64-37) & din(64-29) & din(64-21) & din(64-13) & din(64- 5) &
           
           din(64-28) & din(64-20) & din(64-12) & din(64- 4);
    return val;
  end des_kp;


  --------------------------------------------------------
  -- Compression Permutation, converts a 56 bit key into a 48 bits.
  function des_cp(din   :std_logic_vector (55 downto 0))
                  return std_logic_vector is
    variable val 	:std_logic_vector (47 downto 0);
  begin
    val := din(56-14) & din(56-17) & din(56-11) & din(56-24) & din(56- 1) & din(56- 5) &
           din(56- 3) & din(56-28) & din(56-15) & din(56- 6) & din(56-21) & din(56-10) &
           din(56-23) & din(56-19) & din(56-12) & din(56- 4) & din(56-26) & din(56- 8) &
           din(56-16) & din(56- 7) & din(56-27) & din(56-20) & din(56-13) & din(56- 2) &
           din(56-41) & din(56-52) & din(56-31) & din(56-37) & din(56-47) & din(56-55) &
           din(56-30) & din(56-40) & din(56-51) & din(56-45) & din(56-33) & din(56-48) &
           din(56-44) & din(56-49) & din(56-39) & din(56-56) & din(56-34) & din(56-53) &
           din(56-46) & din(56-42) & din(56-50) & din(56-36) & din(56-29) & din(56-32);
    return val;
  end des_cp;


  --------------------------------------------------------
  -- Expansion permutation
  function des_ep(din   :std_logic_vector (31 downto 0))
                  return std_logic_vector is
    variable val 	:std_logic_vector (47 downto 0);
  begin
    val := din(32-32) & din(32- 1) & din(32- 2) & din(32- 3) & din(32- 4) & din(32- 5) &
           din(32- 4) & din(32- 5) & din(32- 6) & din(32- 7) & din(32- 8) & din(32- 9) &
           din(32- 8) & din(32- 9) & din(32-10) & din(32-11) & din(32-12) & din(32-13) &
           din(32-12) & din(32-13) & din(32-14) & din(32-15) & din(32-16) & din(32-17) &
           din(32-16) & din(32-17) & din(32-18) & din(32-19) & din(32-20) & din(32-21) &
           din(32-20) & din(32-21) & din(32-22) & din(32-23) & din(32-24) & din(32-25) &
           din(32-24) & din(32-25) & din(32-26) & din(32-27) & din(32-28) & din(32-29) &
           din(32-28) & din(32-29) & din(32-30) & din(32-31) & din(32-32) & din(32- 1);
    return val;
  end des_ep;


  --------------------------------------------------------
  -- S-Box Substitution, 48 bits in, 32 bits out.
  function des_sbox(din   :std_logic_vector (47 downto 0))
                    return std_logic_vector is
    variable val 	:std_logic_vector (31 downto 0);
  begin
    -- SBOX 8
    case din( 5 downto  0) is
      when "000000" =>  val(3 downto 0) := "1101";      when "000001" =>  val(3 downto 0) := "0001";
      when "000010" =>  val(3 downto 0) := "0010";      when "000011" =>  val(3 downto 0) := "1111";
      when "000100" =>  val(3 downto 0) := "1000";      when "000101" =>  val(3 downto 0) := "1101";
      when "000110" =>  val(3 downto 0) := "0100";      when "000111" =>  val(3 downto 0) := "1000";
      when "001000" =>  val(3 downto 0) := "0110";      when "001001" =>  val(3 downto 0) := "1010";
      when "001010" =>  val(3 downto 0) := "1111";      when "001011" =>  val(3 downto 0) := "0011";
      when "001100" =>  val(3 downto 0) := "1011";      when "001101" =>  val(3 downto 0) := "0111";
      when "001110" =>  val(3 downto 0) := "0001";      when "001111" =>  val(3 downto 0) := "0100";
      when "010000" =>  val(3 downto 0) := "1010";      when "010001" =>  val(3 downto 0) := "1100";

⌨️ 快捷键说明

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