DES暗号・復号回路の設計


DES ICの暗号・復号回路を設計する。

DESアルゴリズム を参考にしながらHDLソースを完成させる。


DES IC (des.v)
module des ( DI, DO, KEY, MODE, PE );
  input  [1:64]	DI;
  output [1:64] DO;
  input  [1:64] KEY;
  input         MODE;
  output        PE;	// Parity error on key input 

  wire   [1:64] ..., ...;

  // Key parity check
  assign PE = ...;


  // IP
  assign IP = {
	DI[58],    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ...,    ...,
           ...,    ...,    ...,    ...,    ...,    ...,    ..., DI[07]
  };

  wire [1:32] L00, ...;
  wire [1:32] R00, ...;
  wire [1:32] F00, ...;
  wire [1:48]      K01, ...;

  keysched u_key ( .KEY(KEY), .K01(K01), ..., ..., ... );

  assign L00 = IP[ 1:32];
  assign R00 = IP[33:64];

  // 01
  ffunc u_ff01 ( .r(R00), .k( (MODE) ? K16 : K01 ), .f(F00) );
  assign R01 = L00 ^ F00;
  assign L01 = R00; 
  // 02
  ...
  // 03
  ...
  // 04
  ...
  // 05
  ...
  // 06
  ...
  // 07
  ...
  // 08
  ...
  // 09
  ...
  // 10
  ...
  // 11
  ...
  // 12
  ...
  // 13
  ...
  // 14
  ...
  // 15
  ...
  // 16
  ...
  assign RES = { R16, L16 };

  // Inverse IP
  assign DO = {
        RES[40],     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,     ...,
            ...,     ...,     ...,     ...,     ...,     ...,     ...,  RES[25]
  };

endmodule

F function (ffunc.v)
module ffunc ( r, k, f );
  input  [1:32] ...;
  input  [1:48] ...;
  output [1:32] ...;

  wire [1:48] ...;
  wire [1:48] ...;
  wire [1:32] ...;

  assign e = {
        r[32],   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ...,   ...,
          ...,   ...,   ...,   ...,   ..., r[01]
  };

  assign ... = ... ... ...;

  sbox sb ( .di(...), .do(...) );

  assign f = {
    sbout[16],       ...,       ...,       ..., 
          ...,       ...,       ...,       ..., 
          ...,       ...,       ...,       ..., 
          ...,       ...,       ...,       ..., 
          ...,       ...,       ...,       ..., 
          ...,       ...,       ...,       ..., 
          ...,       ...,       ..., sbout[25] 
  };

endmodule

S box (sbox.v)
module sbox (di, do);
  input  [1:48] ...;
  output [1:32] ...;

  wire [1:6] ddi1, ..., ..., ..., ..., ..., ..., ...;

  assign ddi1 = di[ 1: 6];
  ...

  reg [1:4] s1[0:63];
  ...

  initial
  begin
    $readmemh( "s1.mem", s0 );
    ...
  end

  assign do[ 1: 4] = s1[ { ddi1[1], ddi1[6] } * 16 + ddi1[2:5] ];
  ...

endmodule

S1 table (s1.mem) S2-S8 table も同様に作成
E
4
D
1
2
F
B
8
3
A
6
C
5
9
0
7
0
F
7
4
E
2
D
1
A
6
C
B
9
5
3
8
4
1
E
8
D
6
2
B
F
C
9
7
3
A
5
0
F
C
8
2
4
9
1
7
5
B
3
E
A
0
6
D

次は、 Key Schedule を設計する。
| Back |