You are on page 1of 54

MẬT MÃ ỨNG DỤNG TRONG

AN TOÀN THÔNG TIN


Bài 03. Chuẩn mã khối tiên tiến và chuẩn đệm
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối
Giới thiệu chung về AES
Lịch sử ra đời (1/2)
• DES không còn an toàn
• Năm 1997: NIST phát động cuộc thi tìm
kiếm hệ mật làm chuẩn mới
• Yêu cầu đối với thuật toán ứng viên:
– được mô tả công khai
– là mã khối
– hỗ trợ nhiều kích thước khóa khác nhau
– cài đặt tốt trên phần cứng và phần mềm
– miễn phí cho mọi mục đích sử dụng
4
Giới thiệu chung về AES
Lịch sử ra đời (2/2)
• Tổng cộng có 21 ứng viên
• Sau vòng 1 (1998): có 15 đạt yêu cầu
• Sau vòng 2 (1999): còn 5 thuật toán, gồm
MARC (IBM), RC6 (RSA), Rijndael
(Daemon và Rijmen), Serpent (Anderson)
và Twofish (Schneier)
• SauMARC,
chungRC6,
kếtSerpent,
(2000): Twofish
Rijndaelcóthắng!
thể coi
• Năm 2001: Ban
là tốt hànhngửa
ngang chuẩnvớiAES.
AES!
5
Giới thiệu chung về AES
Đặc điểm của thuật toán
• Rijndael
– Kích thước khối: 128, 160, 192, 224, 256
– Kích thước khóa: 128, 160, 192, 224, 256
– Số vòng lặp: 10, 11, 12, 13, 14
• AES
– Kích thước khối: 128
– Kích thước khóa: 128, 192, 256
– Số vòng lặp: 10, 12, 14
6
Giới thiệu chung về AES
Độ an toàn của AES
• Chưa có tấn công hiệu quả lên thuật
toán AES
• Chỉ có tấn công kênh kề (side channel) lên
cài đặt thuật toán.

7
Giới thiệu chung về AES
Phần mềm sử dụng AES
• 7z, WinRAR, WinZIP
• NTFS (EFS)
• BitLocker, VeraCrypt, DiskCryptor
• IPsec, KeePass
• WPA

8
Giới thiệu chung về AES
Thư viện lập trình mật mã
• C: OpenSSL, CryptoAPI
• C++: Bortan, Crypto++
• C#/.NET: .NET Framework, Bouncy Castle
• Java: JCE, Bouncy Castle
• Python: PyCrypto
• JavaScript: SJCL, AES-JS

9
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối
Cấu trúc của AES

• Tiêu chuẩn FIPS 197: Advanced


Encryption Standard

• Tiêu chuẩn TCVN 7816-2007: Kỹ thuật


mật mã – Các thuật toán mật mã – Thuật
toán mã hóa dữ liệu AES

11
Cấu trúc của AES
• Dữ liệu (input, intermediate state, output,
round keys) trong AES là ma trận kích
thước 4xNb = 4x4
• Nạp dữ liệu x0x1x2...x15 vào ma trận:

x0 x4 x8 x12
x1 x5 x9 x13
x2 x6 x10 x14
x3 x7 x11 x15
12
Cấu trúc của AES

KLen 128 192 256


Nr 10 12 14

13
Cấu trúc của AES
• SubBytes

14
Cấu trúc của AES
−1
y=𝐴𝑥 +𝑏

15
Cấu trúc của AES

SubBytes(0x53) = ?
SubBytes(0xFA) = ?
16
Cấu trúc của AES
• SubBytes

17
Cấu trúc của AES
• ShiftRows

18
Cấu trúc của AES
• MixColumns

19
Cấu trúc của AES

sc  C  sc
 s0 c   02 03 01 01   s0 c 
 s    s 
 
1 c 01 02 03 01   1c 

 s2 c   01 01 02 03   s2 c 
     
s 
 3c   03 01 01 02   s3c 
20
Cấu trúc của AES

21
Cấu trúc của AES
• AddRoundKey

22
1.4. KeyExpansion
• Thuật toán mở rộng khóa của AES nhận một khóa mã hóa K sau đó
thực hiện sinh một dãy các khóa cho việc mã hóa.

Round Word
Trước vòng lặp w0 w1 w2 w3
1 w4 w5 w6 w7
2 w8 w9 w10 w11
… …
Nr w4Nr w4Nr+1w4Nr+2w4Nr+3
9/5/2013 23
1.4. KeyExpansion

• RotWord() nhận một word đầu vào 4 byte


[a0, a1, a2, a3] thực hiện một hoán vị và trả về [a1,
a2, a3, a0].
• SubWord() là một hàm nhận một đầu vào 4-byte
và áp dụng hộp thế S-box lên input để nhận
được một word đầu ra 4 byte.
• Mảng hằng số Rcon [i] chứa các giá trị được
xác định bởi [xi-1, {00}, {00},{00}]
9/5/2013 24
1.4. KeyExpansion
• Rcon[1] = [x0, {00}, {00},{00}]=[{01}, {00}, {00},{00}]
• Rcon[2] = [x1, {00}, {00},{00}]=[{02}, {00}, {00},{00}]
• Rcon[3] = [x2, {00}, {00},{00}]=[{04}, {00}, {00},{00}]
• Rcon[4] = [x3, {00}, {00},{00}]=[{08}, {00}, {00},{00}]
• Rcon[5] = [x4, {00}, {00},{00}]=[{10}, {00}, {00},{00}]
• Rcon[6] = [x5, {00}, {00},{00}]=[{20}, {00}, {00},{00}]
• Rcon[7] = [x6, {00}, {00},{00}]=[{40}, {00}, {00},{00}]
• Rcon[8] = [x7, {00}, {00},{00}]=[{80}, {00}, {00},{00}]
• Rcon[9] = [x8, {00}, {00},{00}]=[x7●x, {00}, {00},{00}]=1b000000
• Rcon[10] = [x9, {00}, {00},{00}]=[x8●x, {00}, {00},{00}]=36000000
• Rcon[11] = [x10, {00}, {00},{00}]=[x9●x, {00}, {00},{00}]=6c000000

9/5/2013 25
1.4. KeyExpansion()
Ví dụ
• Khóa K = 36 8a c0 f4 ed cf 76 a6 08 a3 b6 78 31 31
27 6e
w0 w1 w2 w3 Rcon[4/4] w[4-4]

01 36
36 ed 08 31
00 8a
8a cf a3 31
00 c0
c0 76 b6 27
00 f4
f4 a6 78 6e

RotWord SubWord

31 c7 01 c6 36 f0
27 S - Box cc 00 cc 8a 46
6e 9f  00 9f  c0 5f
31 00 c7 33
c7 f4
9/5/2013 26
1.4. KeyExpansion
Mỗi khóa vòng ở vòng thứ Chỉ cần thay 1 bit trong khóa
Rcon cũng khác
i phụ thuộc phi tuyến vào cũng dẫn đến thay đổi hoàn
nhau cho mỗi vòng.
khóa vòng ở vòng thứ i-1 toàn cấu trúc khóa vòng.

Cipher key k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 k11 k12 k13 k14 k15

w0 w1 w2 w3

w3 T w4 T w5 T w6 T w7

w7 T w8 T w9 T w10 T w11

w39 T w40 T w41 T w42 T w43

Hình 12. Sơ đồ thực hiện KeyExpandsion cho AES-128


9/5/2013 27
1.4. KeyExpansion
• Ví dụ
Xét hai khóa sau:
Cipher Key 1:12 45 A2 A1 23 31 A4 A3 B2 CC AA 34 C2 BB 77 23
Cipher Key 2:12 45 A2 A1 23 31 A4 A3 B2 CC AB 34 C2 BB 77 23

9/5/2013 28
Cấu trúc của AES
• Mỗi phép biến đổi trong AES đều có phép
biến đổi ngược: InvSubBytes,
InvShiftRows, InvMixColumns,
AddRoundKey
• Pha giải mã giống như pha mã hóa,
nhưng sử dụng các phép biến đổi ngược
và trật tự đảo ngược các khóa vòng
• Có hai cấu trúc giải mã: giải mã xuôi và
giải mã ngược

29
30
Cấu trúc của AES
• Mã hóa
Add → (Nr-1)x{Sub,Shift,Mix,Add} → {Sub,Shift, Add}

• Giải mã xuôi
Add→(Nr-1)x{IShift,ISub,Add,IMix}→{IShift,ISub,Add}

• Giải mã ngược
Add→(Nr-1)x{ISub,IShift,IMix,Add}→{ISub,IShift,Add}
RoundKey’ = Inv (RoundKey)

31
Bài tập
• Key in English: Thats my Kung Fu (16
ASCII characters, 1 byte each)
Translation into Hex:

• Key in Hex (128 bits): 54 68 61 74 73 20


6D 79 20 4B 75 6E 67 20 46 75

32
• Plaintext in English: Two One Nine Two
(16 ASCII characters, 1 byte each)
Translation into Hex:

• Plaintext in Hex (128 bits): 54 77 6F 20 4F


6E 65 20 4E 69 6E 65 20 54 77 6F
• Key in Hex (128 bits): 54 68 61 74 73 20
6D 79 20 4B 75 6E 67 20 46 75
33
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối
Cài đặt AES
Test vector
• Khi cài đặt một thuật toán mật mã,
chương trình mã hóa được, giải mã được
chưa hẳn đã là cài đặt đúng!
• Cần kiểm tra tính đúng đắn bằng việc sử
dụng các test vector.
• Ví dụ với AES-128
K = 2b7e151628aed2a6abf7158809cf4f3c
p = 6bc1bee22e409f96e93d7e117393172a
c = 3ad77bb40d7a3660a89ecaf32466ef97
35
Cài đặt AES
Cài đặt theo mô tả trong chuẩn
• Đa phần các phép tính thực hiện trên số 8
bít, không khai thác được tính năng của vi
xử lý 32 bít
• Tốn ít bộ nhớ
• Phù hợp cho vi xử lý 8 bít, như trong các
hệ thống nhúng (embeded systems)
• Đối với hệ thống 32 bít thì cần có cài cách
cài đặt hiệu quả hơn
36
Cài đặt AES
Cài đặt cho hệ thống 32 bít
• Xét một vòng của AES, ký hiệu
a – giá trị đầu vào của vòng (round) đó
b – trạng thái sau SubBytes
c – trạng thái sau ShiftRows
d – trạng thái sau MixColumns
e – trạng thái sau AddRoundKey, tức là đầu ra
k – khóa vòng
• Ký hiệu sj là cột thứ j của ma trận s.
37
Cài đặt AES
• Xét ej là kết quả mã hóa cột thứ j

e j   e0, j , e1, j , e2, j , e3, j 


T

 e0, j  02 03 01 01  c0, j   k0, j 


e    c  k 
 
1, j 01 02 03 01  1, j   1, j 

e2, j   01 01 02 03 c2, j   k2, j 
      
 e3, j   03 01 01 02   c3, j   k3, j 

38
Cài đặt AES

 c0, j   b0, j   S [a0, j ] 


c   b   S [a ] 
 1, j    1, j 1mod Nb    1, j 1 
; j  k mod Nb  j  k
c2, j  b2, j  2mod Nb   S [a2, j  2 ]
     
 c3, j   b3, j 3mod Nb   S [a3, j 3 ]

 e0, j  02 03 01 01  S [a0, j ]   k0, j 


e     S[a ]   k 
 1, j    01 02 03 01  1, j 1   1, j 

e2, j   01 01 02 03  S [a2, j  2 ]  k 2, j 
      
 e3, j   03 01 01 02   S[a3, j 3 ]   k3, j 

39
Cài đặt AES
 e0, j   S [a0, j ]  02   S [a0, j 1 ]  03
 e   S [a ]   S [a ]  2 
 1, j    0, j  0, j 1 
 e2, j   S [a0, j ]   S [a0, j 1 ] 
     
 e3, j   S [a0, j ]  03  S [a0, j 1 ] 
 S [a0, j  2 ]   S [a0, j 3 ]   k0, j 
 S[a     
 0, j  2 ]  03   S [a0, j 3 ]   k1, j 
  
 S [a0, j  2 ]  02   S [a0, j 3 ]  03  k2, j 
     
 S [a0, j  2 ]   S [a0, j 3 ]  02   k3, j 

Xây dựng 4 bảng tra T0, T1, T2, T3


40
Cài đặt AES
 S [ x]  02   S[ x]  03
 S[ x]   S[ x]  2 
T0 [ x]    ; T1[ x]   ;
 S[ x]   S[ x] 
   
 S[ x]  03  S[ x] 
 S[ x]   S[ x] 
 S [ x]  03  S[ x] 
T2 [ x]    ; T3[ x]    ; x  0x00..0xFF
 S[ x]  02   S [ x]  03
   
 S[ x]   S[ x]  02 

Mỗi bảng Ti có 256 phần tử 32 bít ứng


với 256 giá trị 8 bít của x 41
Cài đặt AES

e j  T0 [a0, j ]  T1[a1, j 1 ]  T2 [a2, j  2 ]  T3 [a3, j 3 ]  k j

Toàn bộ phép mã hóa đã chuyển thành


phép tra bảng và XOR trên số 32 bít!

42
Cài đặt AES
• Tốc độ cài đặt mềm

43
Cài đặt AES
Tập lệnh AES-NI
• Các vi xử lý đời mới của Intel (Core i5 trở
lên) và AMD hỗ trợ tập lệnh đặc biệt để
cài đặt AES, gọi là AES-NI
• AES-NI gồm 6 lệnh
AESENC và AESENCLAST: mã hóa 1 vòng
AESDEC và AESDECLAST: giải mã 1 vòng
AESKEYGENASSIST: tạo khóa vòng
AESIMC: tạo khóa vòng giải mã

44
Cài đặt AES
• Tốc độ cài đặt khi có AES-NI

45
Cài đặt AES

Kết luận
Việc cài đặt một thuật toán mật
mã đòi hỏi phải nghiên cứu kỹ
lưỡng để đảm bảo an toàn và
đạt được hiệu năng thực thi cao!
46
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối
Chuẩn đệm cho mã khối

Đệm (padding) là gì?


Tại sao cần đệm?

48
Chuẩn đệm cho mã khối

None

PKCS7 Zeros

Đệm

ANSIX923 ISO10126

49
Chuẩn đệm cho mã khối

None padding
and
Zero padding
Why are they possible?

50
Chuẩn đệm cho mã khối

ANSIX923 Padding
- byte cuối: tổng số byte đệm
- các byte còn lại: 0
11 22 33 44 55 66 77 88 99 AA

11 22 33 44 55 66 77 88 99 AA 00 00 00 00 00 06

11 22 33 44 55 66 77 88

11 22 33 44 55 66 77 88 00 00 00 00 00 00 00 08

51
Chuẩn đệm cho mã khối
ISO10126 Padding
- byte cuối: tổng số byte đệm
- các byte còn lại: ngẫu nhiên
11 22 33 44 55 66 77 88 99 AA

11 22 33 44 55 66 77 88 99 AA 4B 1F A2 11 2E 06

11 22 33 44 55 66 77 88

11 22 33 44 55 66 77 88 69 32 0A B9 F1 16 EA 08

52
Chuẩn đệm cho mã khối
PKCS7 Padding
Mỗi byte đệm: tổng số byte đệm
11 22 33 44 55 66 77 88 99 AA

11 22 33 44 55 66 77 88 99 AA 06 06 06 06 06 06

11 22 33 44 55 66 77 88

11 22 33 44 55 66 77 88 08 08 08 08 08 08 08 08

53
1 Giới thiệu AES
2 Cấu trúc của AES
3 Cài đặt AES
4 Đệm cho mã khối

You might also like