DES (viết tắt của Data Encryption Standard, hay Tiêu chuẩn Mã hóa Dữ liệu) là một phương pháp mật mã hóa được FIPS (Tiêu chuẩn Xử lý Thông tin Liên bang Hoa Kỳ) chọn làm chuẩn chính thức vào năm 1976. Sau đó chuẩn này được sử dụng rộng rãi trên phạm vi thế giới. Ngay từ đầu, thuật toán của nó đã gây ra rất nhiều tranh cãi, do nó bao gồm các thành phần thiết kế mật,độ dài khóa tương đối ngắn, và các nghi ngờ về cửa sau để Cơ quan An ninh quốc gia Hoa Kỳ (NSA) có thể bẻ khóa. Do đó, DES đã được giới nghiên cứu xem xét rất kỹ lưỡng, việc này đã thúc đẩy hiểu biết hiện đại về mật mã khối (block cipher) và các phương pháp thám mã tương ứng.
Trang 1Học viên: Nguyễn Đức Dũng
Lớp : 13SCT11
Thuật toán mã hóa DES
I/ Giới thiệu sơ lược
DES (viết tắt của Data Encryption Standard, hay Tiêu chuẩn Mã hóa Dữ liệu) là một
phương pháp mật mã hóa được FIPS (Tiêu chuẩn Xử lý Thông tin Liên bang Hoa Kỳ) chọn làm chuẩn chính thức vào năm 1976 Sau đó chuẩn này được sử dụng rộng rãi trên phạm vi thế giới Ngay từ đầu, thuật toán của nó đã gây ra rất nhiều tranh cãi, do nó bao gồm các thành phần thiết
kế mật,độ dài khóa tương đối ngắn, và các nghi ngờ về cửa sau để Cơ quan An ninh quốc gia Hoa
Kỳ (NSA) có thể bẻ khóa Do đó, DES đã được giới nghiên cứu xem xét rất kỹ lưỡng, việc này đã thúc đẩy hiểu biết hiện đại về mật mã khối (block cipher) và các phương pháp thám mã tương
ứng
II/ Cách thức hoạt động của DES
DES là một thuật toán mã hóa khối - có nghĩa là nó hoạt động trên một khối kích thước
nhất định (64-bit) và trả về mã khối có cùng kích thước Vì vậy kết quả DES trong một hoán vị có thể của 64 bit (kết quả là 2^64), mỗi bit trong số đó chỉ có thể là 0 hoặc 1 Mỗi khối 64 bit được chia thành hai khối 32 bit, một khối nửa trái L và một khối nửa phải R (phân chia này chỉ được sử
dụng trong các hoạt động nhất định (
VD: Cho M là một tin văn bản đơn giản M = 0123456789ABCDEF, trong đó M được
biểu diễn bằng hệ thập lục phân M viết lại dưới dạng nhị phân 64-bit của văn bản :
M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
L = 0000 0001 0010 0011 0100 0101 0110 0111
R = 1000 1001 1010 1011 1100 1101 1110 1111
DES hoạt động trên các khối 64 bit, sử dụng Khóa với độ dài 56 bit Các khóa này thực ra
được lưu trữ với độ dài 64 bit, nhưng mỗi bit thứ 8 của khóa không được sử dụng (bit thứ 8, 16,
24, 32, 40, 48, 56, và 64) Tuy nhiên, 8 bit này chỉ được loại bỏ khi tạo khóa con
VD: Cho K là một dãy thập lục phân có giá trị K = 133457799BBCDFF1 K được viết lại
dưới dạng nhị phân :
K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
Thuật giải mã hóa DES được tiến hành với các bước sau :
Trang 2Bước 1: Tạo 16 khóa con, mỗi khóa có độ dài 48 bit
Quá trình tạo khóa con trong DES
64 bit khóa được mã hóa dựa vào bảng mã hóa dưới đây, bảng PC-1 Bit thứ 57 của dãy
trở thành bit đầu tiên của khóa K+ mới, bit 49 là bit thứ 2, … và bit thứ 4 trở thành bit cuối Lưu ý
là chỉ còn 56 bit so với độ dài bit ban đầu
PC-1
57
49 41 33 25 17 9
1
58 50 42 34 26 18
10
2 59 51 43 35 27
19
11 3 60 52 44 36
63
55 47 39 31 23 15
7
62 54 46 38 30 22
14
6 61 53 45 37 29
21
13 5 28 20 12 4
VD: Từ 64 bit khóa ban đầu
K = 00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
Sau khi hoán vị, ta có
K+ = 1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
Chia Khóa K+ thành 2 nửa, C0 và D0, mỗi nửa là 28 bit
C 0 = 1111000 0110011 0010101 0101111
D 0 = 0101010 1011001 1001111 0001111 Với C0 và D0, ta tạo ra 16 khối Cn và Dn, 1<=n<=16 Mỗi cặp của các khối Cn và Dn được
hình thành từ các cặp Cn-1 và Dn-1 trước, tương ứng, for n = 1, 2, , 16, dịch trái khối các bit sử
dụng lịch dịch trái từ các khối đã dịch trái trước Để thực hiện dịch trái, dịch chuyển mỗi bit về
bên trái, trừ bit đầu tiên, bit đầu tiên sẽ quay lại bit cuối của khối
Iteration Number of
Number Left Shifts
1
1
2
1
3
2
Trang 34
2
5
2
6
2
7
2
8
2
9
1
10
2
11
2
12
2
13
2
14
2
15
2
16
1
VD: Từ 1 cặp C0 và D0 ban đầu, ta có
:
C 0 = 1111000011001100101010101111
D 0 = 0101010101100110011110001111
C 1 = 1110000110011001010101011111
D 1 = 1010101011001100111100011110
C 2 = 1100001100110010101010111111
D 2 = 0101010110011001111000111101
C 3 = 0000110011001010101011111111
D 3 = 0101011001100111100011110101
C 4 = 0011001100101010101111111100
D 4 = 0101100110011110001111010101
C 5 = 1100110010101010111111110000
D 5 = 0110011001111000111101010101
C 6 = 0011001010101011111111000011
D 6 = 1001100111100011110101010101
C 7 = 1100101010101111111100001100
D 7 = 0110011110001111010101010110
C 8 = 0010101010111111110000110011
D 8 = 1001111000111101010101011001
C 9 = 0101010101111111100001100110
D 9 = 0011110001111010101010110011
C 10 = 0101010111111110000110011001
D 10 = 1111000111101010101011001100
C 11 = 0101011111111000011001100101
D 11 = 1100011110101010101100110011
C 12 = 0101111111100001100110010101
D 12 = 0001111010101010110011001111
C 13 = 0111111110000110011001010101
D 13 = 0111101010101011001100111100
C 14 = 1111111000011001100101010101
D 14 = 1110101010101100110011110001
C 15 = 1111100001100110010101010111
D 15 = 1010101010110011001111000111
C 16 = 1111000011001100101010101111
D 16 = 0101010101100110011110001111 Các khóa Kn tương ứng được tạo thành, 1<=n<=16, bằng cách áp dụng bảng hoán vị sau
cho các cặp Cn D n Mỗi cặp có 56 bits, nhưng bảng PC-2 chỉ sử dụng 48 bit
PC-2
Trang 414
17 11 24 1 5
3
28 15 6 21 10
23
19 12 4 26 8
16
7 27 20 13 2
41
52 31 37 47 55
30
40 51 45 33 48
44
49 39 56 34 53
46
42 50 36 29 32
Bit đầu tiên của Kn là bit thứ 14 của Cn D n, bit thứ 2 là bit thứ 17, tiếp tục và và kết thúc là
bit thứ 48 của Kn trở thành bit thứ 32 của Cn D n
VD: Khóa đầu tiên ta có C1 D 1 = 1110000 1100110 0101010 1011111 1010101 0110011
0011110 0011110
Sau khi qua bảng hoán vị PC-2, nó trở thành
K 1 = 000110 110000 001011 101111 111111 000111 000001 110010
Các khóa con khác :
K 2 = 011110 011010 111011 011001 110110 111100 100111 100101
K 3 = 010101 011111 110010 001010 010000 101100 111110 011001
K 4 = 011100 101010 110111 010110 110110 110011 010100 011101
K 5 = 011111 001110 110000 000111 111010 110101 001110 101000
K 6 = 011000 111010 010100 111110 010100 000111 101100 101111
K 7 = 111011 001000 010010 110111 111101 100001 100010 111100
K 8 = 111101 111000 101000 111010 110000 010011 101111 111011
K 9 = 111000 001101 101111 101011 111011 011110 011110 000001
K 10 = 101100 011111 001101 000111 101110 100100 011001 001111
K 11 = 001000 010101 111111 010011 110111 101101 001110 000110
K 12 = 011101 010111 000111 110101 100101 000110 011111 101001
K 13 = 100101 111100 010111 010001 111110 101011 101001 000001
K 14 = 010111 110100 001110 110111 111100 101110 011100 111010
K 15 = 101111 111001 000110 001101 001111 010011 111100 001010
K 16 = 110010 110011 110110 001011 000011 100001 011111 110101
Trang 5Bước 2: Mã hóa khối dữ liệu 64 bit
Cấu trúc tổng quát xử lý khối dữ liệu
Đầu tiên là hoán vị đầu vào bảng IP (initial permutation) khối dữ liệu 64 bit M Việc hoán
vị này sắp xếp các bit dựa theo bảng sau, Bit thứ 58 của M trở thành bit đầu tiên của IP Bit thứ
50 của M trở thành bit thứ 2 của IP Bit thứ 7 của M trở thành bit cuối của IP
IP
58
50 42 34 26 18 10 2
60
52 44 36 28 20 12 4
62
54 46 38 30 22 14 6
64
56 48 40 32 24 16 8
57
49 41 33 25 17 9 1
59
51 43 35 27 19 11 3
61
53 45 37 29 21 13 5
63
55 47 39 31 23 15 7
VD: Áp dụng hoán vị đầu vào cho khối văn bản M, ta có
:
M = 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
IP = 1100 1100 0000 0000 1100 1100 1111 1111 1111 0000 1010 1010 1111 0000 1010 1010
Chia khối dữ liệu IP thành 2 nửa 32 bit trái L0 và phải R0
VD: Từ IP, ta có L0 và R0
L 0 = 1100 1100 0000 0000 1100 1100 1111 1111
R 0 = 1111 0000 1010 1010 1111 0000 1010 1010 Bây giờ chúng ta tiến hành thông qua 16 lần lặp, for 1<=n<=16, sử dụng hàm f hoạt động
trên 2 khối dữ liệu—1 dữ liệu chứa 32 bit R và 1 dữ liệu chứa 48 bit khóa Kn để sản sinh ra một
khối 32 bits (Dấu + biểu diễn phép toán XOR), (bit-by-bit addition modulo 2) Sau đó tăng n
từ 1 lên đến 16 để tính toán tiếp
L n = Rn-1
R n = Ln-1 + f(Rn-1,Kn
(
Trang 6Cấu trúc thuật toán Feistel dùng trong DES
Khối kết quả cuối cùng, với n = 16 là L16 R 16 Mỗi lần lặp, 32 bits phải của kết quả trước
trở thành 32 bits trái của bước hiện tại Và 32 bit phải của bước hiện tại được tính bằng cách XOR
32 bit trái của kết quả trước với hàm f
VD: Với n = 1, ta có
:
K 1 = 000110 110000 001011 101111 111111 000111 000001 110010
L 1 = R0 = 1111 0000 1010 1010 1111 0000 1010 1010
R 1 = L0 + f(R0,K1
(
Đây là cách hàm f hoạt động
Để tính f, đầu tiên ta mở rộng mỗi khối Rn-1 từ 32 bits lên 48 bits Điều này được thực hiện
bằng cách sử dụng bảng lựa chọn lặp lại một số bits trong Rn-1 Ta gọi việc sử dụng bảng này bằng
hàm E Do đó, E(Rn-1) có 32 bit đầu vào, và có 48 bit đầu ra
E BIT-SELECTION TABLE
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
Tương tự như các bảng khác, bit đầu tiên của E(Rn-1) nằm ở vị trí thứ 32, và 2 bit cuối của
E(Rn-1) nằm ở vị trí thứ 32 và 1
VD: Ta tính E(R0) từ R0 như sau
:
R 0 = 1111 0000 1010 1010 1111 0000 1010 1010 E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101
) Nhận xét: Từ mỗi 4 bit 1 khối giờ đã được mở rộng lên 6 bit mỗi khối (
Sau đó tính hàm f, bằng cách XOR giá trị đầu ra của E(Rn-1) với khóa Kn
:
K n + E(Rn-1
(
VD: Với K1 và E(R0), ta có
:
K 1 = 000110 110000 001011 101111 111111 000111 000001 110010 E(R0) = 011110 100001 010101 010101 011110 100001 010101 010101
K 1+E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111
Việc tính toán hàm f vẫn chưa hoàn thành Đến thời điểm này, ta đã mở rộng Rn-1 từ 32 bits
lên 48 bits bằng cách sử dụng bảng mở rộng, và XOR kết quả với khóa Kn Bây giờ ta có 48 bits,
Trang 7hay 8 nhóm 6 bits Ta sẽ sử dụng nhóm 6 bit này như là địa chỉ trong các bảng gọi là "S boxes".
Mỗi nhóm 6 bits sẽ cho 1 địa chỉ cho các S boxes khác nhau Sẽ có 4 bit số nằm tại địa chỉ đó, 4 bit số này sẽ thay thế 6 bit ban đầu Kết quả sẽ biến 8 nhóm 6 bit thành 8 nhóm 4 bit (tổng cộng là
32 bit .(
Với 48 bits Kn+E(Rn-1) như trên, ta viết lại theo dạng sau
:
K n + E(Rn-1) =B1 B 2 B 3 B 4 B 5 B 6 B 7 B 8
,
với mỗi Bi là một nhóm 6 bits Ta sẽ tính toán
:
S 1 (B 1 )S 2 (B 2 )S 3 (B 3 )S 4 (B 4 )S 5 (B 5 )S 6 (B 6 )S 7 (B 7 )S 8 (B 8
(
với Si (B i ) là đầu ra của hộp S box thứ i
Để lặp lại, mỗi hàm S1, S2, , S8, lấy từng khối 6-bit đầu vào và sinh ra từng khối 4-bit đầu ra
S1
Column Number
Row
No 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
1 0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
2 4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
3 15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
Gọi S1 là hàm được định nghĩa bằng cách sử dụng bảng trên và B là khối 6 bits, thì S1 (B)
được định nghĩa như sau: Bit đầu và bit cuối của B ghép lại sẽ được1 số tự nhiên trong khoảng từ
0 đến 3 (00 đến 11), gọi số này là i 4 bits giữa của B ghép lại sẽ được một con số tự nhiên trong khoảng từ 0 đến 15 (0000 đến 1111), gọi số này là j Tra trong bảng con số này với dòng thứ i và cột thứ j, ta được một con số trong khoảng từ 0 đến 15 và thể hiện nó bằng một khối 4 bit Khối này là đầu ra của S1 (B) of S 1 for the input B Lấy ví dụ, khối đầu vào B có giá trị = 011011, bit
đầu tiên là “0”, bit cuối cùng là "1", => hàng 1 Bốn bit giữa là "1101", đây là số nhị phân của số
13, => cột 13 Dò trong bảng, cột 1, hàng 13 là số “5”; 5 biểu diễn nhị phân là 0101, thế nên đầu
ra là 0101 Vì vậy, S1(011011) = 0101
Việc xác định S1 , ,S 8 dựa trên bảng sau
:
S1
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
S2
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
S3
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
S4
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
Trang 810 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
S5
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
S6
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
S7
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
S8
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
VD: với vòng lặp đầu tiên, ta tìm được đầu ra thông qua 8 S-boxes
:
K 1 + E(R0) = 011000 010001 011110 111010 100001 100110 010100 100111
S 1 (B 1 )S 2 (B 2 )S 3 (B 3 )S 4 (B 4 )S 5 (B 5 )S 6 (B 6 )S 7 (B 7 )S 8 (B 8 ) = 0101 1100 1000 0010 1011 0101 1001 0111
Giai đoạn cuối cùng của hàm f là dùng hoán vị P dựa vào bảng hoán vị P đối với đầu ra
của S-box, ta sẽ tính được giá trị cuối cùng của f
:
f = P(S 1 (B 1 )S 2 (B 2 ) S 8 (B 8
(
(
Phép hoán vị P được định nghĩa bằng cách sử dụng bảng sau P cho ra 32-bit đầu ra từ 32-bit đầu
vào bằng cách hoán vị các bit trong khối đầu vào
P
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
VD: Từ đầu vào của 8 S boxes
:
S 1 (B 1 )S 2 (B 2 )S 3 (B 3 )S 4 (B 4 )S 5 (B 5 )S 6 (B 6 )S 7 (B 7 )S 8 (B 8 ) = 0101 1100 1000 0010 1011 0101 1001 0111
Ta có :
f = 0010 0011 0100 1010 1010 1001 1011 1011
R 1 = L0 + f(R0 , K1
(
= 1100 1100 0000 0000 1100 1100 1111 1111
+ 0010 0011 0100 1010 1010 1001 1011 1011
= 1110 1111 0100 1010 0110 0101 0100 0100
Trang 9Ở vòng lặp tiếp theo, ta sử dụng L2 = R1, khối mà ta vừa tính toán, và ta lại tính toán R2 =L1 + f(R 1 , K 2 ), và tiếp tục với 16 vòng lặp Ở cuối vòng lặp thứ 16, ta có L 16 and R16 ,ta sẽ đảo lộn trình
tự của 2 khối này thành 1 khối 64 bit
R 16 L 16
Và cuối cùng áp dụng hoán vị cuối cùng, IP -1 được định nghĩa theo bảng sau :
IP -1
40
8 48 16 56 24 64 32
39
7 47 15 55 23 63 31
38
6 46 14 54 22 62 30
37
5 45 13 53 21 61 29
36
4 44 12 52 20 60 28
35
3 43 11 51 19 59 27
34
2 42 10 50 18 58 26
33
1 41 9 49 17 57 25
VD: Nếu ta tiến hành tất cả 16 khối bằng cách sử dụng phương pháp trên, thì ở vòng lặp 16
,
L 16 = 0100 0011 0100 0010 0011 0010 0011 0100
R 16 = 0000 1010 0100 1100 1101 1001 1001 0101
Đảo thứ tự 2 khối và áp dụng bảng hoán vị
R 16 L 16 = 00001010 01001100 11011001 10010101 01000011 01000010 00110010 00110100
IP -1 = 10000101 11101000 00010011 01010100 00001111 00001010 10110100 00000101
Chuyển sang hexa có dạng 85E813540F0AB405
Đây là dạng mã hóa của M = 0123456789ABCDEF, sau khi mã hóa, C = 85E813540F0AB405
Giải mã đơn giản chỉ là quá trình đảo ngược của mã hóa, bằng cách đi theo các bước tương tự như
trên, nhưng đảo ngược thứ tự các khóa con
Code Tham Khảo
/!# usr/bin/python3
# # Author: Joao H de A Franco (jhafranco@acm.org (
# # Description: DES implementation in Python 3
# # Note: only single DES in ECB mode (with PKCS5 padding (
#
is supported
# # License: Attribution-NonCommercial-ShareAlike 3.0 Unported
) #
CC BY-NC-SA 3.0 (
===========================================================#
subKeyList = [[ None ] * 8 16
IPtable = (58, 50, 42, 34, 26, 18, 10, 2
,
60
,
52
,
44
,
36
,
28
,
20
,
12
,
4
62
,
54
,
46
,
38
,
30
,
22
,
14
,
6
64
,
56
,
48
,
40
,
32
,
24
,
16
,
8
57
,
49
,
41
,
33
,
25
,
17
,
9
,
59
,
51
,
43
,
35
,
27
,
19
,
11
,
3
61
,
53
,
45
,
37
,
29
,
21
,
13
,
5
63
,
55
,
47
,
39
,
31
,
23
,
15
,
7
EPtable = (32, 1 2 3 4 5
,
4
5
6
7
8
9
Trang 10
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
PFtable = (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
(
FPtable = (40, 8 48, 16, 56, 24, 64, 32
,
39
,
7 47
,
15
,
55
,
23
,
63
,
31
,
38
,
6 46
,
14
,
54
,
22
,
62
,
30
,
37
,
5 45
,
13
,
53
,
21
,
61
,
29
,
36
,
4 44
,
12
,
52
,
20
,
60
,
28
,
35
,
3 43
,
11
,
51
,
19
,
59
,
27
,
34
,
2 42
,
10
,
50
,
18
,
58
,
26
,
33
,
1 41
,
9 49
,
17
,
57
,
25
(
sBox = [[0 64] * 8
sBox[ ] = (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
(
sBox[ ] = (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
sBox[ ] = (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
(
sBox[ ] = ( 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
(
sBox[ ] = ( 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
sBox[ ] = (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
(
sBox[ ] = ( 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
(
sBox[ ] = (13, 2 8 4 6 15, 11, 1 10, 9 3 14, 5 0 12, 7
,