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

TIỂU LUẬN MÔN AN NINH HỆ THỐNG THÔNG TIN HỆ MÃ HÓA AES

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 (614.39 KB, 23 trang )

1
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
BỘ MÔN ANH NINH HỆ THỐNG THÔNG TIN
HỆ MÃ HÓA AES
Giảng viên:
PGS.TS Trịnh Nhật Tiến
Thực hiện:
Nguyễn Thị Dung
Hà Nội, 2013
MỤC LỤC
1. Giới thiệu chung
Vào những năm 1990, nhận thấy nguy cơ của mã hóa DES là kích thước khóa ngắn, nó
có thể bị phá mã trong tương lai gần nên cục tiêu chuẩn quốc gia Hoa Kỳ đã kêu gọi xây
dựng một phương pháp mã hóa mới. Cuối cùng một thuật toán có tên là Rijndael được
chọn và đổi tên thành Andvanced Encryption Standard hay AES.
Chuẩn mã hóa dữ liệu cao cấp AES là một hệ mã hóa khóa bí mật có tên là Rijndael do
hai nhà mật mã học người Bỉ là Joan Deamen và Vincent Rijmen đưa ra và trở thành
chuẩn từ năm 2000. Chuẩn mã hóa AES cho phép xử lý các khối dữ liệu input có kích
thước 128 bit sử dụng các khóa có độ dài 128, 192 hoặc 256 bit. Hệ mã hóa Rijndael
được thiết kế để có thể làm việc với các khóa và khối dữ liệu có độ dài lớn hơn, tuy
nhiên, khi được chọn là chuẩn do ủy ban tiêu chuẩn của Hoa kỳ đưa ra vào năm 2001, nó
được quy định chỉ làm việc với khối dữ liệu 128 bit và các khóa có độ dài 128, 192, hoặc
256 bit (do đó còn đặt cho nó các tên AES-128, AES-192, AES-256 tương ứng với độ dài
khóa sử dụng)
1.1. Ưu điểm của AES
• AES đã được chính phủ Hoa Kỳ tuyên bố là có độ an toàn cao, và được sử dụng trong
thông tin mật.
• AES sử dụng bảng tra và phép thế có tính chất phi tuyến mạnh dẫn đến mức độ phân
tán thông tin phức tạp làm tăng độ an toàn cho thuật toán
• AES có mô tả toán học đơn giản, cấu trúc rõ ràng đơn giản


2
1.2. Nhược điểm của AES
Cấu trúc toán học của AES có mô tả toán học khá đơn giản. Tuy điều này chưa dẫn đến
mối nguy hiểm nào nhưng một số nhà nghiên cứu cho rằng sẽ có người lợi dụng được cấu
trúc này trong tương lai
1.3. Ứng dụng của AES
• Hiện nay, AES được sử dụng phổ biến trên toàn thế giới để bảo vệ dữ liệu ở các tổ
chức ngân hàng, tài chính, chính phủ, thương mị điện tử, chữ ký điện tử.
• Mã hóa AES được ứng dụng nhanh đối với cả phần cứng và phần mềm, chỉ yêu cầu
một không gian lưu trữ nhỏ, lý tưởng để sử dụng cho việc mã hóa những thiết bị cầm
tay nhỏ như ổ USB flash, ổ đĩa CD, …
• Mã hóa AES được sử dụng như một hàm băm
• Xây dựng các hàm băm, ví dụ hàm băm Whilrpool
2. Các thuật ngữ
2.1. Các quy ước
Input và Output : Input và Output của hệ mã hóa đều là các dãy 128 bit, còn gọi là các
khối (block), độ dài của mỗi khối này là số bit dữ liệu mà nó chứa. Khóa của chuẩn mã
hóa cao cấp là một dãy có độ dài 128, 192, hoặc 256 bit. Hệ mã hóa không làm việc với
các giá trị input, output và khóa có độ dài khác (mặc dù thuật toán cơ sở cho phép điều
này). Các input, output của hệ mã hóa được đánh số từ 0.
Đơn vị byte: Đơn vị cơ bản để xử lý trong AES là một byte tức là một dãy 8 bit được xem
như là một đối tượng đơn. Các giá trị input, output và khóa của hệ mã hóa được xem là
một mảng các byte. Các giá trị input, output và khóa của hệ mã được ký hiệu bởi tên
mảng a và biểu diễn dưới dạng a
n
hoặc a[n] trong đó n nhận các giá trị trong khoảng sau:
• Nếu độ dài khóa bằng 128 bit: 0≤n≤16;
• Nếu độ dài khóa bằng 192 bit: 0≤n≤24;
• Nếu độ dài khóa bằng 192 bit: 0≤n≤32;
3

Tất cả các giá trị byte sử dụng trong thuật toán AES đều được biểu diễn dưới dạng một
dãy các bit 0 và 1 theo định dạng {b
7
, b
6
, b
5
, b
4,
b
3
, b
2,
b
1
, b
0
}. Các byte này sau được hiểu
là phần tử trên trường hữu hạn bằng cách sử dụng biểu diễn thành dạng đa thức:
b
7
x
7
+ b
6
x
6
+ b
5
x

5
+ b
4
x
4
+ b
3
x
3
+ b
2
x
2
+ b
1
x
1
+ b
0
x
0
=
Mảng trạng thái (state): Các thao tác bên trong của AES được thực hiện trên một mảng
hai chiều các byte được gọi là mảng trạng thái. Mảng trạng thái gồm có 4 hàng, Nb cột
(Nb là kích thước của khối chia cho 32), ký hiệu là s trong đó mỗi byte của mảng có 2 chỉ
số hàng r và cột c (0≤c,r≤4) , được dùng để lưu trữ giá trị trung gian trong mỗi bước của
quá trình xử lý. Bắt đầu của phép mã hóa hay giải mã là việc sao chép mảng các byte in
0
,
in

1
, , in
15
đầu vào vào mảng trạng thái s theo công thức sau:
s[r,c]=in[r+4c], với 0≤c,r≤4
Vào cuối quá trình mã hóa hay giải mã, mảng trạng thái sẽ được sao chéo vào mảng byte
đầu ra theo công thức out
0
, out
1
, …,out
15
out[r+4c]=s[r,c], với 0≤c,r≤4
2.2. Cơ sở toán học của AES
AES sử dụng trường hữu hạn Galois GF(2
8
) để thực hiện các phép toán: phép cộng, phép
trừ, phép nhân, và phép chia. Các phần tử của trường GF(2
8
) được xem như là các đa
thức
2.2.1. Phép cộng
Phép cộng ở đây được hiểu là phép XOR trên hai bit tương ứng trong byte và có ký hiệu
là ⊕
2.2.2. Phép nhân
Phép nhân trên trường GF(2
8
) tương ứng với phép nhân thông thường của hai đa thức
đem chia lấy dư (modulo) cho một đa thức tối giản bậc 8. Trong thuật toán AES, đa thức
tối giản được chọn là:

m(x) = x
8
+x
4
+x
3
+x
2
+x+1
4
hay {01} {1b} nếu biểu diễn dưới dạng hexa
Kết quả nhận được của phép rút gọn là một đa thức có bậc nhỏ hơn 8 nên có thể biểu diễn
được dưới dạng một byte
2.2.3. Phép nhân với x
Phép nhân với đa thức x (hay phần tử {00000010} GF(2
8
)) có thể được thực hiện ở
mức độ byte bằng một phép dịch trái và sau đó thực hiện tiếp phép XOR với giá trị {1b}
nếu b
7
=1. Thao tác được ký hiêu là xtime(). Phép nhân với các lũy thừa của x có thể được
thực hiện bằng cách áp dụng nhiều lần thao tác xtime(). Kết quả của phép nhân với một
giá trị bất kỳ được xác định bằng phép cộng ((⊕) các kết quả trung gian này lại với nhau.
2.2.4. Đa thức với các hệ số trên trường GF(2
8
)
Phép nhân của hai đa thức bậc 4 với các hệ số trên GF(2
8
) a(x) ⊗ b(x) được xác định
bằng 4 hạng tử d(x):

d(x) = d
3
X
3
+d
2
X
2
+d
1
X+d0, trong đó:
d
0
= (a
0
●b
0
) ⊕ (a
3
●b
1
) ⊕ (a
2
●b
2
) ⊕ (a
1
●b
3
)

d
1
= (a
1
●b
0
) ⊕ (a
0
●b
1
) ⊕ (a
3
●b
2
) ⊕ (a
2
●b
3
)
d
2
= (a
2
●b
0
) ⊕ (a
1
●b
1
) ⊕ (a

0
●b
2
) ⊕ (a
3
●b
3
)
d
3
= (a
3
●b
0
) ⊕ (a
2
●b
1
) ⊕ (a
1
●b
2
) ⊕ (a
0
●b
3
)
5
3. Thuật toán mã hóa
Thuật toán AES được thực hiện bởi tuần tự gồm nhiều bước biến đổi, kết quả đầu ra của

phép biến đổi trước là đầu vào của phép biến đổi tiếp theo. Kết quả trung gian của phép
biến đổi chính là mảng trạng thái (state)
Độ dài của khối dữ liệu đầu vào của AES là cố định với Nb=4, tùy vào độ dài khoá
(Nk=4,6,8) ban đầu ta có số lần lặp Nr cho mỗi quá trình được xác định theo công thức
Nr=max{Nb,Nk}+6
Quy trình mã hóa và giải mã AES sử dụng hàm lặp là hàm kết hợp của bốn hàm biến đổi
(với đơn vị xử lý là byte) sau:
- Biến đổi thay thế byte bằng cách sử dụng một bảng thế S-box
- Dịch các hàng của mảng trạng thái với số lần dịch của mỗi hàng là khác nhau
- Kết hợp dữ liệu của mỗi cột trong mảng trạng thái
- Cộng một khóa RoundKey vào trạng thái.
Giải mã AES bằng cách thực hiện biến đổi ngược của các biến đổi ở phép mã hóa AES
hoặc bằng cách biến đổi tương đương. Các biến đổi này được minh họa như trong hình
vẽ:
6
(a) Mã hóa (b) Giả mã
Tên hàm Giải thích
AddRoundKey() Hàm biến đổi được sử dụng trong thuật toán mã hóa và giải mã
trong đó thực hiện phép XOR bit giữa trạng thái trung gian (state)
và một khóa vòng lặp (Round Key). Kích thước của một Round
Key bằng kích thước của trạng thái, ví dụ với Nb=4 độ dài của một
Round Key sẽ là 128 bit hay 16 byte
MixColumns() Hàm biến đổi trong thuật toán mã hóa nhận tất cả các cột của một
trạng thái (state) và trộn với dữ liệu của nó (không phụ thuộc lẫn
nhau) để nhận được cột mới
ShiftRows() Hàm sử dụng trong quá trình mã hóa, xử lý các trạng thái bằng cách
dịch vòng ba hang cuối của trạng thái với số lần dịch khác nhau
SubBytes() Hàm biến đổi sử dụng trong quá trình mã hóa, xử lý một trạng thái
7
bằng cách sử dụng một bảng thế phi tuyến các byte (S-box) thao

tác trên mỗi byte một cách độc lập
InvMixColumns() Hàm biến đổi được sử dụng trong thuật toán giải mã, là hàm ngược
của hàm MixColumns()
InvShiftRows() Hàm biến đổi được sử dụng trong thuật toán giải mã, là hàm ngược
của hàm ShiftRows()
Inv SubBytes() Hàm biến đổi được sử dụng trong thuật toán giải mã, là hàm ngược
của hàm SubBytes()
3.1. Quá trình mã hóa
Bắt đầu thuật toán, bản rõ được sao chép vào mảng trạng thái sử dụng các quy ước được
mô tả ở phần trên. Sau khi cộng với khóa RoundKey, mảng trạng thái khởi tạo được biến
đổi bằng cách thực hiện một hàm vòng Nr lần (10, 12 hoặc 14 phụ thuộc vào độ dài của
khóa) trong đó lần cuối cùng thực hiện khác với các lần trước đó. Trạng thái sau lần lặp
cuối cùng sẽ được chuyển thành output của thuật toán
Hàm vòng được tham số hóa bằng cách sử dụng một dãy các khóa được biểu diễn như là
mảng một chiều của các word 4 byte được sinh ra từ thử tục sinh khóa (Key Expansion)
Tất cả các vong đều thực hiện công việc giống nhau dựa trên 4 hàm theo thứ tự
SubBytes(), ShiftRows(), MixColumns(), và AddRoundKey() trừ vòng cuối cùng bỏ qua
việc thực hiện hàm MixColumns()
Thuật toán được mô tả chi tiết qua đoạn mã giả sau:
Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
byte state[4,Nb]
state=in
AddRoundKey(state, w[0,Nb-1])
for round=1 step 1 to Nr-1
SubBytes(state)
ShiftRows(state)
MixColumns(state)
AddRoundKey(state, w[round*Nb,(round+1)*Nb-1])
8

end for
SubBytes(state)
ShiftRows(state)
AddRoundKey(state,w[Nr*Nb, (Nr+1)*Nb-1])
out=state
end
3.1.1. Hàm SubBytes()
Hàm SubBytes() thực hiện phép thay thế các byte của mảng trạng thái bằng cách sử dụng
một bảng thế S-box, bảng thế này là khả nghịch và được xây dựng bằng cách kết hợp hai
biến đổi sau:
1. Nhân nghịch đảo trên trường hữu hạn GF(2
8
), phần tử {00} được ánh xạ thành
chính nó
2. Áp dụng biến đổi Affine sau (trên GF(2)):
b
i
’= b
i
⊕ b
(i+4)mod8
⊕ b
(i+5)mod8
⊕ b
(i+6)mod8
⊕ b
(i+7)mod8
⊕ c
i
, trong đó 0 i 8 là bit thứ i

của byte b tương ứng và c
i
là bit thứ I của byte c với giá trị {63} hay {01100011}
Hình dưới đây minh họa kết quả của việc áp dụng hàm biến đổi SubBytes() đối với mảng
trạng thái
3.1.2. Hàm ShiftRows()
Trong hàm này các byte trong ba hàng cuối của mảng trạng thái sẽ được dịch vòng với số
lần dịch (hay số byte bị dịch) khác nhau. Hàng đầu tiên r=0 không bị dịch. Cụ thể hàm
này sẽ tiến hành bước đổi sau:
9
S’
rc
= S
r,(c+shift(r,Nb))modNb
(Nb=4) trong đó giá trị dịch shift(r,Nb) phụ thuộc vào số
hàng r như sau:
shift(1,4)=1, shift(2,4)=2, shift(3,4)=3
Thao tác này sẽ chuyển các byte tới các vị trí thấp hơn trong các hàng, trong khi các byte
thấp nhất sẽ được chuyển lên đầu hàng. Tất cả các mô tả trên có thể minh họa qua hình vẽ
sau:
3.1.3. Hàm MixColumns()
Hàm này làm việc trên các cột của mảng trạng thái, nó coi mỗi cột của mảng trạng thái
như là một đa thức gồm 4 hạng tử. Các cột sẽ được xem như là các đa thức trên GF(2
8
) và
được nhân trên modulo x
4
+1 với một đa thức cố định a(x):
a(x) = {03}x
3

+ {02}x
2
+ {01}x + {02}
Có thể biểu diễn bằng phép nhân ma trận:
s’(x) = a(x) ⊗ s(x)
10
=
Với mọi 0≤c<Nb = 4
Kết quả là bốn byte trong mỗi cột sẽ được thay thế theo công thức sau:
s’
0,c
= ({02}●s
0,c
) ⊕ ({03}●s
1,c
) ⊕ s
2,c
⊕ s
3,c
s’
1,c
= s
0,c
⊕ ({02}●s
1,c
) ⊕ ({03}●s
2,c
) ⊕ s
3,c
s’

2,c
= s
0,c
⊕ s
1,c
⊕ ({02}●s
2,c
) ⊕ ({03}●s
3,c
)
s’
3,c
= ({03}●s
0,c
) ⊕ s
1,c
⊕ s
2,c
⊕ ({02}●s
3,c
)
Có thể minh họa việc thực hiện hàm này bằng hình vẽ sau:
3.1.4. Hàm AddRoundKey()
Trong hàm này, một khóa vòng (Round Key) sẽ được cộng vào mảng trạng thái bằng một
thao tác XOR bit. Mỗi khóa vòng gồm Nb word được sinh ra bởi thủ tục sinh khóa. Các
word này sẽ được cộng vào mỗi cột của mảng trạng thái như sau:
11
[s’
0,c
, s’

1,c
, s’
2,c
, s’
3,c
] = [s
0,c
, s
1,c
, s
2,c
, s
3,c
] ⊕ [w
round*Nb+c
] 0≤c≤Nb = 4
Trong đó [w
i
] là các word của khóa và round là lần lặp tương ứng với quy ước
0≤round≤Nb. Trong thuật toán mã hóa phép cộng khóa vòng khởi tạo xảy ra với round=0
trước khi các vòng lặp của thuật toán được thực hiện. Hàm AddRoundKey() được thực
hiện trong thuật toán mã hóa khi 1≤round≤Nb.
Việc thực hiện hàm này có thể được minh họa như trong hình vẽ, trong đó l=round*Nb.
3.1.5. Thuật toán sinh khóa (Key Expansion)
Thuật toán sinh khóa AES nhận một khóa mã hóa K sau đó thực hiện một thủ tục sinh
khóa để sinh một dãy các khóa cho việc mã hóa. Thủ tục này sẽ sinh tổng số Nb*(Nr+1)
word, thủ tục sử dụng một tập khởi tạo Nb word và mỗi lần lặp trong số Nr sẽ cần tới Nb
word của dữ liệu khóa. Dãy các kết quả là một mảng tuyến tính các word 4 byte được ký
hiệu là [w
i

] trong đó 0≤i<Nb(Nr+1).
Sự mở rộng khóa thành dãy khóa được mô tả qua đoạn mã giả sau:
KeyExpansion(byte key[4*Nb], word w[Nb*(Nr+1), Nk])
begin
word temp
i=0
while(i<Nk)
w[i] = word(key[4*i], key[4*i] +1, key[4*i] +2, key[4*i]+3)
12
i = i +1
end while
i = Nk
while (i< Nb*(Nr+1))
temp = w[i-1]
if(i mod Nk = 0)
temp = SubWord(RotWord(temp)) xor Rcon[i/Nk]
else if (Nk>6 and I mod Nk = 4)
temp = SubWord(temp)
end if
w[i] = w[i-Nk] xor temp
i = i+1
end while
end
SubWord() là hàm nhận một input 4 byte và áp dụng bảng thế S-box lên input để nhận
được một word output. Hàm RotWord() nhận một word input [a
0
, a
1
, a
2

, a
3
] thực hiện một
hoán vị vòng và trả về [a
1
, a
2
, a
3
, a
0
]. Các phần tử của mảng hằng số Rcon[i] chứa các giá
trị nhận được bởi [x
i-1
, {00}, {00}, {00}] trong đó x
i-1
là mũ hóa của x (x được biểu diễn
dưới dạng {02} trên GF(2
8
) và i bắt đầu từ 1)
Chúng ta có thể nhận thấy rằng Nk word của khóa kết quả sẽ được điền bởi khóa mã hóa.
Các word sau đó w[i] sẽ bằng XOR với word đứng trước nó w[i-1] và w[i-Nk]. Với các
word ở vị trí chia hết cho Nk một biến đổi sẽ được thực hiện với w[i-1] trước khi thực
hiện phép XOR bit, sau đó là phép XOR với một hằng số Rcon[i]. Biến đổi này gồm một
phép dịch vòng các byte của một word (RotWord(), sau đó là áp dụng một bảng tra lên tất
cả 4 byte của word (SubWord()). Thủ tục mở rộng khóa đối với các khóa có độ dài 256
bit hơi khác so với thủ tục cho các khóa có độ dài 128 hoặc 192 bit. Nếu Nk=8 và i-4 là
bội số của Nk thì SubWord() sẽ được áp dụng cho w[i-1] trước khi thực hiện phép XOR
bit
13

3.2. Quá trình giải mã
Quá trình giải mã khá giống với quá trình mã hóa về mặt cấu trúc nhưng 4 hàm cơ bản sử
dụng là các hàm ngược của các hàm trong thuật toán giải mã. Dưới đây là đoạn mã giả
cho thuật toán giải mã sau:
InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
byte state[4,Nb]
state = in
AddRoundKey(state, w[Nr*Nb,(Nr+1)*Nb-1)])
for round = Nr -1 step-1 downto 1
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state,w[round*Nb,(round+1)*Nb-1])
InvMixColumns(state)
end for
InvShiftRows(state)
InvSubBytes(state)
AddRoundKey(state, w[0,Nb-1])
out = state
end
3.2.1. Hàm InvShiftRow()
Hàm này là hàm ngược của hàm ShiftRows(). Các byte của ba hàng cuối của mảng trạng
thái sẽ được dịch vòng với vị trí dịch khác nhau. Hàng đầu tiên không bị dịch, ba hàng
cuối bị dịch đi Nb-shift(r,Nb) byte trong đó giá trị shift(r,Nb) phụ thuộc vào số hàng
Cụ thể hàm này tiến hành xử lý như sau:
s’
r,(c+shift(r,Nb))modNb
= s
r,c
0<r<4, 0≤c<Nb (Nb=4)

Dưới đây là hình ảnh minh họa
14
3.2.2. Hàm InvSubBytes()
Hàm này là hàm ngược của hàm SubBytes(), hàm sử dụng nghịch đảo của biến đổi Affine
bằng cách thực hiện nhân nghịch đảo trên GF(2
8
)
3.2.3. Hàm InvMixColumns()
Hàm này là hàm ngược của hàm MixColumns(). Hàm này làm việc trên các cột của mảng
trạng thái, coi mỗi cột như một đa thức 4 hạng tử. Các cột được xem như là các đa thức
trên GF(2
8
) và được nhân theo modulo x
4
+1 với một đa thức cố định là a
-1
(x)
a
-1
(x) = {0b}x
3
+ {0d}x
2
+ {09}x + {0e}
Có thể được mô tả bằng phép nhân ma trận sau:
s’(x) = a
-1
(x) ⊗ s(x)
=
15

trong đó 0≤c<Nb
Kết quả là bốn byte trong mỗi cột sẽ được thay thế theo công thức sau:
s’
0,c
= ({0e}●s
0,c
) ⊕ ({0b}●s
1,c
) ⊕ ({0d}●s
2,c
) ⊕ ({09}●s
3,c
)
s’
1,c
= ({09}●s
0,c
) ⊕ ({0e}●s
1,c
) ⊕ ({0b}●s
2,c
) ⊕ ({0d}●s
3,c
)
s’
2,c
= ({0d}●s
0,c
) ⊕ ({09}●s
1,c

) ⊕ ({0e}●s
2,c
) ⊕ ({0b}●s
3,c
)
s’
3,c
= ({0b}●s
0,c
) ⊕ ({0d}●s
1,c
) ⊕ ({09}●s
2,c
) ⊕ ({0e}●s
3,c
)
3.2.4. Hàm nghịch đảo của hàm AddRoundKey()
Hàm nghịch của hàm AddRoundKey() cũng chính là nó vì hàm này chỉ có phép toán
XOR bit
16
4. Kết luận
4.1. Độ an toàn của thuật toán
Việc sử dụng các hằng số khác nhau ứng với mỗi chu kỳ giúp hạn chế khả năng tính đối
xứng trong thuật toán. Sự khác nhau trong cấu trúc của việc mã hóa và giải mã đã hạn
chế được các khóa “yếu” như trong phương pháp DES. Ngoài ra, thông thường những
điểm yếu liên quan đến mã khóa đều xuất phát từ sự phụ thuộc vào giá trị cụ thể của mã
khóa của các thao tác phi tuyến. Trong phiên bản mở rộng, các khóa được sử dụng thông
qua thao tác XOR và tất cả những thao tác phi tuyến đều được cố định sẵn trong S-box
mà không phụ thuộc vào giá trị cụ thể của khóa mã hóa. Tính chất phi tuyến cùng khả
năng khuếch tán thông tin trong việc tạo bản mã khóa mở rộng làm cho việc phân tích

mật mã dựa vào khóa tương đương hay các khóa có liên quan trở nên không khả thi.
Đối với phương pháp vi phân rút gọn, việc phân tích chủ yếu khai thác đặc tính tập trung
thành vùng của các vết vi phân trong một số phương pháp mã hóa. Trong thuật toán AES,
số lượng chu kỳ lớn hơn 6, không tồn tại phương pháp công phá mật mã nào hiệu quả
hơn phương pháp thử sai. Tính chất phức tạp của biểu thức S-box cùng với hiệu ứng
khuếch tán giúp cho thuật toán không thể bị phân tích bằng phương pháp nội suy.
Đối với phương pháp thử sai với chiều dài khóa 256-bit tương ứng 2
256
hay 1.2 x 10
77
khả
năng có thể xảy ra. Thậm chí nếu sử dụng một trong những siêu máy tính mạnh nhất
hiện nay là Roadrunner 54 của IBM để xử lý thì cũng cần 3.5 x 10
54
năm để kiểm tra tất
cả khả năng (Roadrunner có khả năng thực hiện 1.042 triệu tỉ phép tính / giây).
4.2. Đánh giá thuật toán
• Thuật toán AES thích hợp cho việc triển khai trên nhiều hệ thống khác nhau, không
chỉ trên các máy tính cá nhân, mà cả trên các hệ thống thẻ thông minh.
• Tất cả các bước xử lý của việc mã hóa và giải mã đều được thiết kế thích hợp với cơ
chế xử lý song song nên AES càng chứng tỏ thế mạnh của mình trên các hệ thống
thiết bị mới.
• Do đặc tính của việc xử lý thao tác trên từng byte dữ liệu nên không có sự khác biệt
nào được đặt ra khi triển khai trên hệ thống big-endian hay little-endian.
17
• Độ lớn của khóa mã có thể thay đổi linh hoạt từ 128 đến 256 bit. Số lượng chu kỳ có
thể được thay đổi tùy thuộc vào yêu cầu riêng được đặt ra cho từng ứng dụng và hệ
thống cụ thể.
Phụ lục A: Ví dụ về mở rộng khóa 128 bit
Giả sử ta có khóa mã hóa sau:

Cipher Key = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
cho Nk=4 với
w
0
= 2b7e1516 w
1
= 28aed2a6 w
2
= abf71588 w
3
= 09cf4f3c
18
19
Phụ lục B: Ví dụ về mã hóa
Hình dưới đây biểu diễn các giá trị của mảng trạng thái state trong quá trình mã hóa cho
một độ dài block và độ dài của khóa mã là 16 bytes (Nb=4, Nk=4)
Input = 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
Cipher Key = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c
Các giá trị của khóa vòng RoundKey được lấy từ hàm mở rộng khóa trong phụ lục A
20
21

×