Tải bản đầy đủ (.docx) (29 trang)

Nghiên cứu thuật toán mật mã AES và cài đặt mô phỏng AES128

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (640.1 KB, 29 trang )

Cài đặt thuật toán AES 128

Mục lục

Page 1


Cài đặt thuật toán AES 128

DANH MỤC TỪ VIẾT TẮT
DES
AES
NIST

Data Encryption Standard
Advanced Encryption Standard
National Institute of Standards and Technology

Page 2


Cài đặt thuật toán AES 128

DANH MỤC HÌNH ẢNH

Page 3


Cài đặt thuật toán AES 128

LỜI NÓI ĐẤU


Từ trước công nguyên con người đã phải quan tâm tới việc làm như thế nào để có
thể đảm bảo an toàn bí mật cho các dữ liệu, văn bản quan trọng, đặc biệt là trong những
lĩnh vực như: quân sự, ngoại giao. Ngày nay, với việc xuất hiện của máy tính, các tài
liệu văn bản và các thông tin quan trọng đều đã được số hóa và xử lý trên máy tính và
được truyền đi trong môi trường mạng, đây là một môi trường không an toàn khi truyền
dữ liệu. Do đó cần có một yêu cầu về việc có một giải pháp để bảo vệ an toàn cho dữ
liệu, thông tin nhạy cảm, quan trọng là ngày càng cấp thiết. Môn học mật mã sẽ giúp
cho chúng ta nghiên cứu được những thuật toán mã hóa quan trọng, giúp chúng ta có thể
đảm bảo an toàn cho dữ liệu của chúng ta.

Page 4


Cài đặt thuật toán AES 128

CHƯƠNG 1: TỔNG QUAN VỀ THUẬT TOÁN MÃ HÓA AES
1.1 LỊCH SỬ PHÁT TRIỂN
Do tốc độ tính toán của máy tính ngày càng tăng cao thuật toán DES trở nên
không an toàn ( năm 1999 một mạng máy tính gồm 100.000 máy có thể giải mã một
thư tín mã hóa DES chưa đầy 24 giờ). Vì thế Công nghệ Hoa Kỳ chọn thuật toán thay
thế DES.
Năm 1997 NIST (trước đây là NBS) thông báo một cuộc thi tìm kiếm thuật toán
thay thế DES và tổ chức cuộc hội thảo công khai về các tiêu chí cho chuẩn mã hóa nâng
cao. Độ dài khóa là quan trọng nhất. Một hội đồng đặc biệt nhóm họp năm 1996 cho
rằng 90 bit là độ dài khóa tối thiểu để đảm bảo an ninh dữ liệu trong vòng 20 năm. NIST
yêu cầu cao hơn và quyết định độ dài khóa tối thiếu là 128bit. Nhiều thuật toán được gửi
đến, các hội đồng xét tuyển đã được thành lập và làm việc qua nhiều vòng. Cuối cùng,
chọn được 5 thuật toán có mức an toàn cao: RC6, MARS, Rijndael, Twofish, Spent.
Vào ngày 2-10-2000, NIST công bố người chiến thắng cho mục tiêu này là đề
xuất Rijndael, do Joan Daemen và Vincent Rijmen của Bỉ thiết kế. Thiết kế của họ là

đơn giản và hợp lý, không dựa trên kiến trúc của DES (DES sử dụng mạng Feistel,
Rijndael sử dụng mạng thay thế hoán vị). Cuối cùng, Rijndael được chọn vì nó có sự kết
hợp tốt nhất về an toàn, về kịch bản thực hiện, hiệu quả và khả năng thực hiện. Người ta
tin rằng thuật toán này có thể an toàn trên 20 năm. Niềm tin này dựa trên không gian
khóa của Rijndael rất lớn và các “Thuẫn” của nó chống lại được các cuộc tấn công nổi
tiếng đã biết.
Mặc dù 2 tên AES và Rijndael vẫn thường được gọi thay thế cho nhau nhưng
trên thực tế thì 2 thuật toán không hoàn toàn giống nhau. AES chỉ làm việc với các khối
dữ liệu (đầu vào và đầu ra) 128 bit và khóa có độ dài 128,192 hoặc 256 bít trong khi
Rijndael có thể làm việc với dữ liệu và khóa có độ dài bất kỳ là bội số của 32bit nằm
trong khoảng từ 128 đến 256 bít. Khối bổ sung và chiều dài khóa trong Rijndael không
được đánh giá trong tiến trình lựa chọn AES, do đó chúng không được thông qua trong
các tiêu chuẩn FIPS hiện hành.

1.2 CẤU TRÚC AES
AES là một mã khối khóa- lặp: Nó bao gồm việc áp dụng lặp một ánh xạ vòng
trên trạng thái. Số các vòng được ký hiệu bởi Nr và phụ thuộc vào độ độ dài khóa.

Page 5


Cài đặt thuật toán AES 128

Hình 1: Cấu trúc AES

Đầu vào, đầu ra: Là các trạng thái được biểu diễn dưới dạng ma trận 4x4, mỗi ô
của ma trận này là 1 kí tự được biểu diễn dưới dạng hexa.
Tầng phi tuyến: Áp dụng song song của các S-Box mà có các tính chất phi tuyến.
Tầng trộn tuyến tính: Đảm báo khuếch tán cao qua nhiều vòng.
Tầng cộng khóa: Là phép XOR từng bit của Round Key và trạng thái trung gian

Nguyên lý hoạt động của AES được biểu diễn ở hình dưới.

Hình 2: Nguyên lý hoạt động của AES 128bit

Page 6


Cài đặt thuật toán AES 128

1.3 CÁC PHÉP TOÁN TRÊN BYTE
1.3.1 Cách biểu diễn của byte
Cho byte b7b6b5b4b3b2b1b0 ta sẽ có 3 các biểu diễn nó và chọn một cách tự do giữa
các biểu diễn này:
• Một byte là xâu bit có độ dài 8 bit; ví dụ: 10111011;
• Một byte có thể được viết như 2 kí tự hexa như BF;
• Một byte có thể được viết như một đa thức modulo 2 bậc <= 7 như: x 7 + x3 +x
+1 ( đây là biểu diễn của xâu bit 10001011).

1.3.2 Phép cộng 2 byte
Ta sử dụng a để kí hiệu 1 byte, độc lập với biểu diễn đa thức. Phép cộng 2 byte
a⊕b đạt được bằng cách cộng các đa thức của chúng theo modulo 2.
Ví dụ:
Byte 01000101 có dạng hex là 45, dạng đa thức là x6 + x2 + 1
Byte 01111000 có dạng hex là 78, dạng đa thức là x6 + x5 + x4 + x3
Phần tử 45⊕75 là:
(x6 + x2 + 1) + (x6 + x5 + x4 + x3) = x5 + x4 + x3 + x2 +1 mod 2, và dạng hexa là
3D (00111101).
Chú ý: phép toán ⊕ làm cho B thành nhóm giao hoán với phần tử không là 00.
Phép toán này tương ứng với phép XOR trên các xâu bit.


1.3.3 Phép nhân 2 byte
Cho 2 byte a và b, ta định nghĩa tích a.b của chúng như tích trên các biểu diễn đa
thức của chúng theo modulo đa thức m(x):

M(x) = x8 + x4 + x3 + x + 1
Ví dụ:
Nếu a,b lần lượt là x6 + x2 + 1 (45), x3 + x (0A) thì tích của chúng là: a.b = là (x 6
+ x2 + 1)( x3 + x) mod m(x) = (x9 + x7 + x5 + x) mod m(x) = x7 + x4 + x2.
Tương ứng ở dạng hexa sẽ là: 45.0A = 94

1.3.4 Phép toán Xtime
Ta có: xtime(x)  a.02

Page 7


Cài đặt thuật toán AES 128

Giả sử a = a7x7 + a6x6 + …+ a1x + a0 = a(x) ≈ a7a6…a1a0
a.02 = a(x).x mod m(x) = (a7x8 + a6x7 + …+ a1x2 + a0x) mod m(x)
Có 2 trường hợp xảy ra:
1) Nếu a7 = 0 thi a.02 = a6x7 + …+ a1x2 + a0x = a6…a1a00. Nghĩa là a.02 nhận
được từ a nhờ phép dịch trái 1 bit: a.02 = shift(a)
2) Nếu a7 = 1 thì a.02 = (a7x8 + a6x7 + …+ a1x2 + a0x) mod m(x)
= (x8 + a6x7 + …+ a1x2 + a0x) + m(x)
= (a6x7 + …+ a1x2 + a0x) + (x4 + x3 + x + 1)
≈ a6a5…a1a00 ⊕ 00011011 = shift(a) ⊕ 1B. Nghĩa là
phép a.02 lúc này sẽ nhận được nhờ phép dịch trái 1 bit sau đó xor với
{1B}.


1.4 HÀM MỞ RỘNG KHÓA

Hình 3: Sơ đồ thuật toán mở rộng khóa

Đối với thuật toán mã hóa AES 128 độ dài khóa ban đầu là 16 byte và 16 byte
này sẽ được chia ra làm 4 cột, mỗi cột chứa 4 byte. Ví dụ ta có khóa key =

Page 8


Cài đặt thuật toán AES 128

2b7e151628aed2a6abf7158809cf4f3c = w0 w1 w2 w3. Như vậy ta sẽ chi khóa trên thành
4 phần như sau:
W0 = 2b7e1516
W1 = 28aed2a6
W2 = abf71588
W3 = 09cf4f3c
Mỗi giá trị W sẽ tương ứng với mỗi cột trong trạng thái.
Hàm mở rộng khóa thực hiện 40 vòng lặp với i chạy từ 4->43, tương ứng với mỗi
vòng lặp thì sẽ sinh ra 1 giá trị W và tương ứng với 4 giá trị W liên tiếp nhau tạo nên
một khóa vòng (RoundKey), vì vậy sau khi hàm mở rộng khóa thực hiện xong ta sẽ có
thêm 10 khóa vòng.
Qui tắc thực hiện của hàm mở rộng khóa như sau:
1. RoundKey(0) = key = w0 w1 w2 w3
2. Gán I =4
3. Vòng lặp :
a. Kiểm tra giá trị i có chia hết cho 4 không:
b. Đúng (i chia hết cho 4)
i. Gán x = w[i-1]

ii. Gán x = RotWord(x)
iii. Gán x = SubWord(x)
iv. Gán x = x XOR Rcon[i/4]
v. Gán w[i] = x XOR w[i-4]
vi. I = I + 1
vii. I = 44  kết thúc.
c. Sai (i không chia hết cho 4)
i. Gán x = w[i-1]
ii. Gán w[i] = x XOR w[i-4]
iii. I = I +1
iv. I = 44  kết thúc.
Bảng giá trị Rcon
i
0
1
2
3
4
5
6

Rcon[i]
8d000000
01000000
02000000
04000000
08000000
10000000
20000000


Page 9


Cài đặt thuật toán AES 128

7
8
9
10

40000000
80000000
1b000000
36000000

1.4.1 Hàm RotWord
Hàm RotWord là dịch vòng trên cột cuối cùng của trạng thái. Ở cột cuối cùng của
trạng thái thì byte đầu tiền của cột sẽ được dịch vòng xuống thành byte cuối cùng của
cột.
Ví dụ:
2B
7E
15
16

28
AE
D2
A6


AB
F7
15
88

09
CF
4F
3C

2B
7E
15
16



28
AE
D2
A6

AB
F7
15
88

CF
4F
3C

09

1.4.2 Hàm SubWord
Hàm SubWord là một hàm thế byte sao cho mỗi byte của trạng thái được biến đối
tất định và độc lập với các byte khác trong trạng thái. Nó tương tự như hàm SubByte sẽ
được trình bày ở mục Mã hóa. Điểm khác biệt là hàm SubWord sẽ chỉ thay thế các byte
ở cột cuối của trạng thái cũ để sử dụng làm cột đầu tiên của trạng thái mới

1.4.3 Ví dụ chi tiết về hàm tạo khóa:
Ban đầu ta có Key:
2B
7E
15
16

28
AE
D2
A6

AB
F7
15
88

09
CF
4F
3C


Tiếp sau đó ta sử dụng cột cuối của trạng thái key để thực hiện RotWord
09
CF
4F
3C



CF
4F
3C
09

Page 10


Cài đặt thuật toán AES 128

Tiếp sau đó sử dụng kết quả của cột cuối này thực hiện phép SubWord bằng các
tra bảng Sbox ta sẽ thu được:
CF
8A
4F
84

3C
EB
09
01
Bởi vì đây là vòng lặp tạo RoundKey(1) nên chúng ta sẽ đem kết quả của bước

trên xor với giá trị Rcon[1] đã có ở trên thu được kết quả:
8A
01
8b
84
00
84


EB
00
EB
01
00
01
Tiếp tục đem kết quả của bước trên và xor với cột đầu tiền của trạng thái cũ
RoundKey(i-1). Trong ví dụ này ta đang tạo RoundKey(1) tức là ta sẽ đem xor với cột
đầu tiên của key được:
8b
2b
A0
84
7e
FA


EB
15
FE
01

16
17
Vậy là kết quả trên là cột thứ nhất của RoundKey(1). Ta thực hiện tính tiếp các
cột thứ 2,3,4 của RoundKey(1).
Cột thứ 2 của RoundKey(1) sẽ thu được bằng cách đem cột thứ nhất của
RoundKey(1) xor với cột thứ 2 của RoundKey(0) (trong trường hợp này RoundKey(0)
là key ban đầu). Cột thứ 3 của RoundKey(1) sẽ thu được bằng cách đem cột thứ 2 của
RoundKey(1) xor với cột thứ 3 của RoundKey(0). Cột thứ 4 của RoundKey(1) sẽ thu
được bằng cách đem cột thứ 3 của RoundKey(1) xor với cột thứ 4 của RoundKey(0).
Như vậy sau khi thực hiện xong bước tính giá trị cho các cột thứ 2,3,4 ta sẽ thu về được
RoundKey(1) hoàn chỉnh như sau:
A0
FA
FE
17

88
54
2C
B
L

23
A3
39
39

2A
6C
76

05

Như vậy ta đã tính được RoundKey(1). Với cách tính tương tự ta sẽ tính được
các RoundKey tiếp theo. Trong bài báo cáo này chúng ta đi nghiên cứ về AES 128bit

Page 11


Cài đặt thuật toán AES 128

tức là sử dụng khóa có độ dài 128 bit vì vậy tổng cộng ta sẽ có 10 vòng lặp như phía
trên để tao ra 10 RoundKey.

1.5 MÃ HÓA
Mã hóa AES sử dụng dữ liệu đầu vào và key ở dạng Hex, vì thế bản rõ và key
phải được chuyển đổi từ hệ ACSII sang hệ hex sau đó được chuyển về dạng state (trạng
thái). Đối với thuật toán mã hóa AES 128bits, dữ liệu đầu vào và dữ liệu đầu ra được
biểu diễn bởi các state, mỗi state là các mảng byte 2 chiều với 4 dòng và N b cột ( với
AES Nb = 4). Khóa cũng tương tự được biểu diễn bởi mảng byte 2 chiều với 4 dòng và
Nk cột (với AES 128 Nk = 4).

Hình 4: Sơ đồ thuật toán mã hóa AES 128bit

Quá trình mã hóa gồm các bước như sau:
1. Khởi động vòng lặp
a. AddRoundKey – mỗi cột của state đầu tiên lần lượt được kết hợp với
khóa con theo tứ tự từ đầu dãy. Phép toán kết hợp được sử dụng là
phép xor.
2. Vòng lặp: Đối với AES 128 sẽ bao gồm 9 vòng lặp
a. SubBytes – là một phép thế phi tuyến trong đó mỗi byte trong state sẽ

được thay thế bằng một byte khác theo bảng tra S-box
b. ShiftRows – dịch vòng , các hàng trong state

Page 12


Cài đặt thuật toán AES 128

c. MixColumns – quá trình trộn, làm việc theo các cột của state theo một
phép biến đổi tuyến tính
d. AddRoundKey – Mỗi cột của state lần lượt được kết hợp với khóa
vòng của mỗi vòng lặp
3. Vòng lặp cuối
a. SubBytes
b. ShiftRows
c. AddRoundKey

1.5.1 Hàm SubBytes
Thực hiện phép thế byte sao cho mỗi byte của trạng thái được biến đối tất định
và độc lập với các byte khác trong trạng thái. Điều này cho phép tính toán song song, và
sự độc lập này cũng phi cấu trúc trong thực hiện giải mã với cùng thiết kế. Đặc biệt, mỗi
byte của trạng thái được biến đổi tại chỗ qua 2 phép toán
1. Byte ai,j được biến đỏi thành nghịc đảo của nó với phép nhân trên trường
GF(28), byte {00} giữ nguyên không thay đổi.
2. Byte kết quả được biến đổi bởi ánh xạ affine

Hình 5: Ma trận biến đổi SubByte

SubBytes có thể được thực hiện thông qua một bảng tra S-box. Tương ứng với
mỗi byte trong state ta sẽ thay thế bằng một byte khác dựa vào bảng S-box. Để hiểu rõ

hơn ta sẽ đi ra ví dụ sau.

Page 13


Cài đặt thuật toán AES 128

Hình 6: Bảng tra S-box

Ban đầu ta sẽ có một state sau:
19
3d
e3
be

a0
f4
e2
2b

9a
c6
8d
2a

e9
f8
48
08


Với giá trị đầu tiên của state là 19: ta tìm đến hàng 1 và cột 9 sẽ nhận được giá trị ‘d4”
Với giá trị thứ hai 3d: ta tìm đến hàng 3 và cột d sẽ nhận được giá trị “27”
Cứ tiếp tục thực hiện như vậy đến cuối state ta sẽ thu được một state mới nhu sau:
D
4
27
11
A
E

E0 B
8
B B
F 4
98 5
D
F1 E5

1
E
41
52
30

Page 14


Cài đặt thuật toán AES 128

1.5.2 Hàm ShiftRows

Thực hiện việc biến đổi trên các dòng của trạng thái. Dòng đầu tiên không thay
đổi, tất cả các dòng khác bị dịch trái vòng theo byte. Dòng thứ 2 hai bị dịch vòng trái 1
byte, dòng thứ 3 bị dịch vòng trái 2 byte và dòng cuối cùng bị dịch vòng trái 3 byte.

Hình 7: Hoạt động của hàm ShiftRow

Ví dụ: ban đầu ta có trạng thái sau
D
4
27
11

E0 B
8
B B
F 4
98 5
D
F1 E5

1
E
41
52

A
30
E
Hàng thứ nhất ta không thực hiện chuyển
Hàng thứ 2 thực hiện dịch vòng trái 1 byte ta được kết quả sau

B B 41 27
F 4
Hàng thứ 3 ta thực hiện dịch vòng trái 2 byte thu được kết quả sau
5 5 1 9
D 2 1 8
Hàng thứ 4 ta thực hiện dịch vòng trái 3 byte thu được kết quả sau
3 A F E
0 E 1 5
Như vậy là sau khi thực hiện phép ShiftRows thì từ trạng thái ban đâu ta thu
được trạng thái mới sau:

Page 15


Cài đặt thuật toán AES 128

D
4
B
F
5
D
30

E0 B 1
8 E
B4 41 27
52

11 98


A
E

F1 E
5

1.5.3 Hàm MixColumns
Phép biến đổi mỗi cột của trạng thái độc lập với các cột khác. Giả sử c(x) là một
đa thức cố định có bậc 3: c(x)

= c0 + c1x + c2x2 + c3x3

Giả sử a(x) và b(x) là hai đa thức biến với các hệ số c i và di một cách tương ứng
(với 1<=i<=4). Chúng ta rút ra biểu diễn ma trận của biến đổi mà nhận đầu vào là các hệ
số của đa thức sinh a và sinh các hệ số của đa thức b = c x a như là đầu ra. Ta có:
Do:

Vì thế:
Quay trở lại với phép MixColumns, ta có c(x)

= 02+ 01x + 01x2 + 03x3

Hình dưới đây sẽ môt tả phép MixColumns

Page 16


Cài đặt thuật toán AES 128


Hình 8: Sơ đồ hoạt động của hàm MixColumns

Để hiểu rõ hơn về phép Mixcolumns ta sẽ đi vào ví dụ sau:
Ban đầu ta có trạng thái
D
4
B
F
5
D
30

E0 B 1
8 E
B4 41 27
52

11 98

A F1 E
E
5
Lấy từng cột của trạng thái đem nhân với ma trận mặc định. Giả sử ta lấy cột đầu
tiên và thực hiện phép nhân.
Việc thực hiện phép nhân ta thực hiện thông qua phép toán Xtime. Ta sẽ thử tính
với hàng ô tiên với X1 = d4.02 xor bf.03 xor 5d.01 xor 30.01
Tính d4.02:
Chuyển d4 về dạng nhị phân: d4 = 11010100. D4.02 = Xtime(d4) = 10101000
xor 00011011 = 10110011
Tính bf.03: bf.03 = bf.02 + bf.01 = Xtime(bf) + bf .

Chuyển df về nhị phân: bf = 10111111 Xtime(df) = 01111110 xor 00011011 =
01100101  Bf.03 = 01100101 xor 10111111 = 11011010
Từ đó ta có: X1 =
1011.0011

Page 17


Cài đặt thuật toán AES 128

Xor
Xor
Xor
=
 X1 = 04

1101.1010
0101.1101
0011.0000
0000.0100 = 04

Kết quả của phép nhân thu về được cột đầu tiên của trạng thái mới. Và cứ tiếp
tục thực hiện hết 4 cột của trạng thái ban đầu ta sẽ thu về được trạng thái mới sau:
04 E0 48
66 C F8
B
81 19 D
3
E 9A 7
5

A

28
06
26
4
C

1.5.4 Hàm AddRoundKey
Trong phép biến đổi này, trạng thái được thay đổi bằng cách kết hợp nó với khóa
vòng bằng phép toán XOR. Từ kết quả của phép Mixcolumn ta thực hiện XOR trạng
thái đó với RoundKey tương ứng. Sau khi kết thúc AddRoundKey thì kết quả của vòng
AddRoundKey trước sẽ làm input của vòng lặp tiếp sau đó.
Ví dụ:
04
66
81
E5

E0
CB
19
9A

48
F8
D3
7A

28

06
26
4C

(+)

A0
FA
FE
17

88
54
2C
B1

23
A3
39
39

2A
6C
76
05

Page 18

=


A4
9C
7F
F2

68
9F
35
2B

6B
5B
EA
43

02
6A
50
49


Cài đặt thuật toán AES 128

1.6 GIẢI MÃ

Hình 9: Sơ đồ thuật toán giải mã AES 128bit

Quá trình mã hóa được thực hiện như sau:
1. Khởi động vòng lặp:
a. AddRoundKey – trạng thái của bản mã sẽ được xor với khóa vòng thứ

10.
2. Vòng lặp: bao gồm 9 vòng lặp và khác với việc mã hóa thì việc giải mã thứ tự
thực hiện các hàm sẽ khác đi
a. InvShiftRows – là quá trình ngược so với hàm ShiftRows
b. InvSubBytes – Mỗi byte trong trạng thái sẽ được thay thế bằng một
byte mới, byte mới này được tra theo bảng tra S-box nghịch đảo
c. AddroundKey – tương tự phép AddRoundKey khi mã hóa, mỗi trạng
thái của mỗi vòng sẽ được XOR với khóa vòng tương ứng
d. InvMixColumns – là hàm ngược của MixColumns thực hiện biến đổi
cột của trạng thái
3. Vòng lặp cuối:
a. InvShiftRows

Page 19


Cài đặt thuật toán AES 128

b. InvSubBytes
c. AddRoundKey

1.6.1 Hàm InvShiftRows
Thực hiện việc biến đổi trên các dòng của trạng thái. Dòng đầu tiên không thay
đổi, tất cả các dòng khác bị dịch phải vòng theo byte. Dòng thứ 2 hai bị dịch vòng phải
1 byte, dòng thứ 3 bị dịch vòng phải 2 byte và dòng cuối cùng bị dịch vòng phải 3 byte.

Hình 10: Hoạt động của hàm InvShiftRow

Ví dụ:
E9


CB 3D AF

31 32
7D 2C

2E
89

09
07

B5

5F

94

72



E9 C
B
09 31
89 07
72

5F


3
D
32
7
D
94

A
F
2E
2C
B5

1.6.2 Hàm InvSubBytes
Phép toán ngược của SubBytes được gọi là InvSubBytes. Đó là một phép thế bao
gồm lấy ngược của S-box được áp dụng vào các byte của trạng thái.

Page 20


Cài đặt thuật toán AES 128

Hình 11: Bảng S-box ngược

Ví dụ:
E9

CB 3D AF

09

89
72

31
07
5F

32 2E
7D 2C
94 B5



E
B
40
F2
1E

59

8B 1B

2E
38
84

A1 C3
13 42
E7 D2


1.6.3 Hàm InvMixColumns
Phép toán ngược của MixColumns gọi là InvMixColumns – nó tương tự như
MixColumns. Mỗi cột được biến đổi bằng cách nhân nó với một đa thức cố định d(x):

d(x) = 0E+ 09x + 0Dx2 + 0Bx3
Ta có ma trận biểu diễn phép nhân của hàm InvMixColumns như sau:

Page 21


Cài đặt thuật toán AES 128

CHƯƠNG 2: PHÂN TÍCH - CÀI ĐẶT THUẬT TOÁN AES 128
2.1 PHÂN TÍCH - THIẾT KẾ CHƯƠNG TRÌNH
2.1.1 Yêu cầu bài toán
• Chương trình nhận đầu vào từ file “input.txt”, xuất kết quả ra 2 file “encrypt.txt”
và “decrypt.txt”. Tất cả các file này nằm trong cùng thư mục với file chương
trình. Dữ liệu trong các file được biểu diễn dưới dạng chuỗi hex
• File Input gồm:
o Dòng 1: khóa
o Dòng 2: khối dữ liệu
• File encrypt gồm:
o Dòng 1: khóa
o Dòng 2..11: lần lượt là 10 khóa vòng
o Dòng 12: khối dữ liệu (bản rõ)
o Dòng 13..22: kết quả mã hóa sau từng vòng
• File decrypt gồm:
o Dòng 1: khóa
o Dòng 2..11: lần lượt là 10 khóa vòng

o Dòng 12: Bản mã thu được ở bước trước
o Dòng 13..22: kết quả giải mã từng vòng

2.1.2 Phân tích - cài đặt thuật toán
Với yêu cầu đề ra của bài toán là nhận đầu vào từ 1 file “input.txt” với nội dung
của file “input.txt” đó là: dòng 1 ghi khóa, dòng 2 ghi khối dữ liệu và cả 2 dòng này sẽ
được biểu diễn dưới dạng chuỗi Hex. Vì thế bước đầu tiền chúng ta cần thiết kế một
chương trình con tách độ dài của khối dữ liệu thành từng khối 128bit vì thuật toán mã
hóa AES chỉ nhận khối dữ liệu đầu vào có độ dài 128bit. Sau đó, viết đoạn mã để
chuyển từ một chuỗi Hex về một state (trạng thái) là một ma trận 4x4 và ta sẽ biểu diễn
ma trận này dưới dạng mảng 2 chiều.
Sau khi đã xử lí được chuỗi hex của khóa và dữ liệu chuyển về state chúng ta sẽ
sử dụng khối dữ liệu này để làm việc. Công việc mã hóa của AES phụ thuộc vào các
hàm như: SubByte, ShiftRow, Mixcolumn và AddRoundkey vì thế ta cần thiết kế những
hàm này theo như yêu cầu ở bước mã hóa của Chương 1. Kèm theo thiết kễ module mã

Page 22


Cài đặt thuật toán AES 128

hóa thì ta cũng cần thiết kế hàm tạo Key để sinh ra các khóa vòng để phục vụ cho quá
trình AddRoundKey, việc thiết kế hàm tạo Key này đã được phân tích rõ ở chương 1.
Quá trình giải mã chúng ta thiết kế tương tự quá trình mã hóa với các hàm ngược
như InvSubyte, InvShiftRox, InvMixcolumn.
Cuối cùng sau khi đã thiết kế đầy đủ các module cũng như các hàm để phục vụ
cho quá trình mã hóa cũng như giải mã thì ta sẽ dựa vào sơ đồ mã hóa và sơ đồ giải mã
(hình 2) để thực hiện cũng như lắp ghép các đoạn mã lại thành một chương trình hoàn
chỉnh


2.1.3 Một số đoạn mã của chương trình
Dưới đây là một số đoạn mã của chương trình mã hóa AES 128bit.

Hình 12: Đoạn mã của hàm AddRoundKey

Hình 13: Đoạn mã hàm Xtime

Page 23


Cài đặt thuật toán AES 128

Hình 14: Đoạn mã mã hóa AES 128bit

Hình 15: Đoạn mã ShiftRow

Hình 16: Đoạn mã tạo RoundKey

Page 24


Cài đặt thuật toán AES 128

2.1.4 Thực thi chương trình
Chương trình được viết bằng ngôn ngữ lập trình python nên tên file chương trình
sẽ có dạng “tenfile.py”. Chúng ta sẽ cần phải cài đặt python lên để chương trình có thể
hoạt động.
Sau khi đã cài đặt python, chúng ta sẽ mở file chương trình bằng IDLE của
python. Chương trình nhận dữ liệu đầu vào từ file “input.txt” nên ta sẽ cần tạo file đó và
để cùng thư mục với mã nguồn. Sau đó sẽ thêm khóa vào dòng đầu tiên của file và thêm

khối dữ liệu vào dòng thứ 2, cả 2 đều được biểu diễn dưới dạng kí tự hex.
Công việc chuẩn bị xong ta sẽ chạy chương trình bằng cách nhấn F5. Chương
trình chạy dưới dạng console và đưa ra thông báo như hình dưới

Hình 17: Khởi động chương trình

Do chương trình được thiết kế thêm chế độ mã hóa ECB nên chúng ta sẽ chọn số
1 để mã hóa dưới chế độ ECB và số 2 để mã hóa dưới chế độ CBC. Các chế độ hoạt
động của mã khối sẽ không được trình bày trong báo cáo này và chúng ta hoàn toàn có
thể tìm được trên mạng một cách dễ dàng. Nếu ta nhập số 1 thì chương trình sẽ mã hóa
theo ECB và đưa ra thông báo như hình bên dưới. Còn nếu chúng ta nhập số 2 thì vì chế
độ mã hóa CBC sẽ cần 1 Init vector nên chương trình sẽ đưa ra dòng thông báo yêu cầu
nhập init vector và ta sẽ nhập dưới dạng kí tự hex. Sau khi nhập xong chương trình sẽ
thực hiện mã hóa và đưa ra dòng thông báo thành công.

Page 25


×