-
Notifications
You must be signed in to change notification settings - Fork 0
/
Round.m
105 lines (104 loc) · 3.05 KB
/
Round.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
%
% Round function for DES
%
function [Lo, Ro] = Round(L, R, Ki)
%
% Expansion Matrix for Expansion
%
E = [32 1 2 3 4 5 ...
4 5 6 7 8 9 ...
8 9 10 11 12 13 ...
12 13 14 15 16 17 ...
16 17 18 19 20 21 ...
20 21 22 23 24 25 ...
24 25 26 27 28 29 ...
28 29 30 31 32 1];
%
% S-box for Substitution
%
S = zeros(4, 16, 8);
S(:,:,1) = [14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7;
0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8;
4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0;
15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13];
S(:,:,2) = [15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10;
3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5;
0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15;
13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9];
S(:,:,3) = [10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8;
13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1;
13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7;
1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12];
S(:,:,4) = [7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15;
13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9;
10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4;
3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14];
S(:,:,5) = [2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9;
14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6;
4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14;
11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3];
S(:,:,6) = [12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11;
10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8;
9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6;
4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13];
S(:,:,7) = [4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1;
13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6;
1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2;
6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12];
S(:,:,8) = [13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7;
1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2;
7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8;
2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11];
%
% P Matrix for Permutation
%
PF = [16 7 20 21 29 12 28 17 ...
1 15 23 26 5 18 31 10 ...
2 8 24 14 32 27 3 9 ...
19 13 30 6 22 11 4 25];
%
%
L_temp = L;
L = R;
%
% first, expansion
%
Rb = uint32(hex2dec(R));
%
% default number is in double(64 bits), but we're using the first 48 bits only
Rb_E = 0; % E for expansion
for i = 1 : 48
Rb_E = bitset(Rb_E, 49 - i, bitget(Rb, 33 - E(i)));
end
%
% XOR with key Ki, 64 bit key
%
Rb_E_K = bitxor(Rb_E, hex2dec(Ki));
%
% S-Box
%
S_8 = uint32(0);
for i = 1 : 8
x = bitget(Rb_E_K, (9-i)*6) * 2 + bitget(Rb_E_K, (9-i)*6 - 5) + 1; % row index
y = bitget(Rb_E_K, (9-i)*6 - 1) * 2^3 + bitget(Rb_E_K, (9-i)*6 - 2) * 2^2 + ...
bitget(Rb_E_K, (9-i)*6 - 3) * 2 + bitget(Rb_E_K, (9-i)*6 - 4) + 1; % col index
Si = S(x, y, i);
S_8 = S_8 + Si * 16^(8-i);
end
%
% 32-bit permutation function
%
temp = S_8;
for i = 1 : 32
S_8 = bitset(S_8, 33 - i, bitget(temp, 33 - PF(i)));
end
%
% XOR with L
%
R = dec2hex(bitxor(uint32(hex2dec(L_temp)), S_8), 8);
% R = dec2hex(bitxor(S_8, uint32(hex2dec(L_temp))), 8);
%
%
Lo = L;
Ro = R;
return