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 |