Tải bản đầy đủ (.pdf) (21 trang)

Các hệ mã đối xứng tiêu chuẩn

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 (452.74 KB, 21 trang )

Phần thứ 3:
Các hệ mã đối xứng tiêu chuẩn
Quá trình hình thành và phát triển
Sau Đại chiến Thế giới lần thứ II:
Cuộc "cách mạng” máy tính và thông tin điện tử:
Hệ mã dữ liệu tiêu chuẩn - DES (Data Encription Standard)
Phương án thu gọn của DES
Các toán tử sẽ được sử dụng:
Quy trình sinh các chìa khoá con (subkeys) từ chìa khoá ban đầu.
Các ánh xạ và các "phép nâng" tương ứng
12
,TT
Quy trình hoạt động của DES thu gọn
Mô hình đầy đủ của DES
Quy trình sinh khoá con
Cơ chế vận hành của các toán tử
i
T
Quy trình làm việc của DES
Các phương thức sử dụng DES
Độ an toàn của DES
Tiêu chuẩn mã hoá nâng cao và thuật toán Rijndael (AES -
Advanced Encryption Standard)
Quá trình hình thành
Công cụ chuẩn bị
Đa thức trên trường các byte (GF(2
8
)) và các “từ”
Phép nhân với đơn thức x
Thuật toán
Vài nét đặc trưng về thiết kế


Trạng thái, khoá mã và số lượng vòng
Các phép biến đổi trong một vòng
Quy trình sinh (phát triển) khoá
Thuật toán lập mã
Thuật toán giải mã


1

2
Quá trình hình thành và phát triển
Sau Đại chiến Thế giới lần thứ II:
 Chính phủ và quân đội Mỹ (và nhiều Công ty Mỹ) ráo riết tiến hành thiết lập
công cụ mã hoá.
 Với cộng đồng: cục xi gắn trên phong bì là “chuẩn” về bí mật thư tín.
Cuộc "cách mạng” máy tính và thông tin điện tử:
Cánh cửa bước vào lĩnh vực mã hoá đã được mở tung cho cả cộng đồng.
 Cuối thập kỷ 60, IB
M lập một nhóm nghiên cứu về mật mã tại New York (do
Horst Feistel chỉ đạo). Làm ra hệ mã khoá bí mật với tên gọi là ‘Lucifer’, dùng
trong hệ thống máy phát tiền mà IBM đã thiết lập cho tập đoàn bảo hiểm
Lloyd’s of London (năm 1971). Tiếp theo là quá trình hoàn thiện và thương mại
hóa (dưới dạng một chip điện tử), hoà
n thành năm 1974.
 Đồng thời, nhiều công ty khác cũng “vào cuộc” với các công cụ mã hoá khác
nhau, không có một chuẩn nào, và không có ai đứng ra kiểm tra và xác nhận khả
năng bảo mật của chúng.
 Chính quyền (Mỹ) tham gia hỗ trợ → Tình thế được dần dần đổi khác.
Năm 1968, Cục tiêu chuẩn quốc gia Hoa Kỳ (National Bure
au of Standards - NBS, bắt

đầu một chuỗi khảo sát về nhu cầu của Nhà nước và dân chúng Mỹ trong vấn đề an toàn
thông tin máy tính.
Ngà
y 15/5/1973, NBS đưa ra các yêu cầu cơ bản đối với một thuật toán mã hoá tiêu
chuẩn (dùng trong việc mã hoá các dữ liệu "nhậy cảm" mà không thuộc phạm vi kiểm soát
của các cơ quan đặc nhiệm quốc gia), trong đó quan trọng nhất là:
 Thuật toán cần đem lại tính bảo mật cao.
 Thuật toán công k
hai, dễ hiểu. Tính bảo mật được chốt
vào chìa khoá chứ không
vào chính thuật toán.
 Thuật toán cần có tính "linh động", để có thể áp dụng cho nhiều loại hình ứng dụng.
 Việc triển khai thuật toán trên các thiết bị điện tử phải không tốn kém.
Yêu cầu t
hứ 2 có vẻ phi lý, vì xưa nay người ta thường gắn chặt 2 khái niệm "bảo mật"
và "bí mật" với nhau, và xem "bí mật" như là tiền đề của "bảo mật". Tuy nhiên, yêu cầu này
mang tính thực tiễn ca
o: thuật toán mã hoá thường không thể chỉ có một người biết, và khi
đã có vài người biết thì điều bí mật sẽ trở thành như "cái kim trong bị", không thể dấu kín
được lâu. Hơn nữa, dân thường không có nghiệp vụ giữ bí mật chung, mà chỉ có thể giữ
được bí mật riêng của chính mình.
Cùng với việc ban bố “tiêu chí” là lời kêu gọi cộng đồng tham gia đề xuất thuật toán.
Sự hưởng ứng sôi nổi của cộng đồng khi đó cho thấy sự quan tâm của toàn xã hội tới
vấn đề chuẩn mực mật mã, nhưng cũng đồng thời cho thấy sự non yếu về kinh nghiệm
trong lĩnh vực nà
y. Một số ý kiến đề xuất mới chỉ là những phác thảo thô sơ về thuật toán.
Không có đề xuất nào đáp ứng được yêu cầu đề ra.
Do đó, lời kêu gọi lần thứ 2 được đưa ra sau hơn một năm
, vào 27/8/1974. Cơ quan An
ninh Quốc gia Hoa Kỳ (National Security Agency - NSA) đưa ra một phiên bản biến thể

của thuật toán Lucifer. Nó đã trở thành chuẩn mã hoá dữ liệu của Hoa Kỳ (the Data
Encryption Standard - DES).
Trong gần 3 thập kỷ qua, DES đư
ợc sử dụng rộng rãi không chỉ ở Mỹ mà còn ở nhiều
nước trên thế giới. Nó dùng ch
ìa khoá có độ dài 56-bits để mã hoá các khối dữ liệu 64-bits.
Lập mã và giải mã cùng bằng một chìa. Sau này, để tăng độ an toàn, nó được cải biên thành
DES bội 3 (Triple DES).
Hệ mã dữ liệu tiêu chuẩn - DES
(Data Encription Standard)
Để giúp bạn đọc nắm được ý tưởng cơ bản của phương pháp, mà không bị "rối" bởi các
chi tiết kỹ thuật, chúng ta hãy xét một mô hình đơn giản của DES.
Phương án thu gọn của DES
Trong mô hình này ta dùng khối có độ dài 8 bits và sử dụng khoá có độ dài 10 bits (để
sinh ra 2 khóa con có độ dài 8 bits dùng cho 2 vòng).
Các toán tử sẽ được sử dụng:
Có 3 toán tử sẽ được sử dụng trong quá trình mã hoá là:
 Phép hoán vị (Permutation), ký hiệu là P. Cho bởi một vectơ 8 thành. Ví dụ P8 =
(2,5,0,4,7,3,1,6) xác định phé
p hoán vị như sau: bit ở vị trí thứ ba (mang số thứ tự là
2) chuyển lên vị trí đầu tiên, bit ở vị trí thứ 6 (mang số thứ tự 5) chuyển lên vị trí thứ
hai, bit ở vị trí đầu tiên (mang số thứ tự 0) được chuyển sang vị trí thứ ba, v.v… và

như vậy nó biến khối 8 bit 10011101 thành ra khối 8 bit 01111100.
 Phép đảo vế, ký hiệu là
Q , có vai trò đảo vị trí của nửa khối đầu (4 bits) cho nửa khối
sau (4 bits); tức là
X XQ= , trong đó trong đó X, X' là các số nhị phân 4
bits ứng với các "nửa" khối dữ liệu (8 bits). Rõ ràng
1-

Q=Q, vì
2
Q là ánh xạ đồng
nhất.
(,XX') ( ', )
 P
hép "nâng theo T", ký hiệu
T
P , xác định bởi , trong
đó T là một ánh xạ của tập số nhị phân 4 bits vào chính nó.
(, ') ( ( '), ')
T
XX X TX XP=+
Theo phép cộng mod2, ta luôn có , và do đó ( ') ( ') 0000TX TX+=

3
)
2
(,') ( ('),') ( (') ('),') (,'
TT
XX XTXX XTX TXX XXP=P+ =++ =,
tức là ánh xạ là tự khả nghịch, với mọi T bất kỳ. Sau này T sẽ đư
ợc chọn là phép biến
đổi phi tuyến khá phức tạp và phụ thuộc vào tham số (là chìa khóa con).
T
P
Quy trình sinh các chìa khoá con (subkeys) từ chìa khoá ban đầu.
Trong phương án DES rút gọn, ta dùng khoá ban đầu có độ dài 10 bits để sinh ra các kho
á
con với độ dài 8 bits.

 Phé
p hoán vị P10 = (2,4,1,6,3,9,0,8,7,5) lên chìa khoá ban đầu (10 bits);
 Phé
p dịch xoay vòng về phía trái đối với từng nửa xâu theo một chế độ dịch chuyển
xác định trước (ví dụ: với tuần tự dịch là (1,2) thì thực hiện dịch đi 1 bits đối với việc
tạo khoá con thứ nhất, dịch đi 2 bits đối với việc tạo khoá con thứ 2).
 Phép chọn 8 thành phần, xác định bởi S8=(5,2,6,3,7,4,9,8), để tạo thành chìa khóa
con (dành cho một vòng).
Những phé
p biến đổi trên là công khai ai cũng biết.

4
}
)
)
)
)
Như vậy, với khoá ba
n đầu là , , ta áp dụng P10 và thu được
012 9
rrr r
{
0, 1
i
r Î

0123456789 2416390875 01234567 89
10()()(P rrrrrrrrrr rrrrrrrrrr ssssssssss==
ta phân kết quả thành 2 nửa là và dịch mỗi nửa sang trái 1 bits (để
làm

ra khoá con thứ 1) và có được
01234 56789
()(sssss sssss
123 4 0 67 895 123 4 06 7 895 0123456789
()()( )(sssss sssss ssssssssss tttttttttt==,
rồi, theo phép chọn S8,
ta nhặt ra 8 phần tử và sắp xếp theo thứ tự đã định ra trong đó, tức là
thu đượcchìa khoá con thứ nhất là .
52637498
()tttttttt
Để tạo ra chìa khoá c
on thứ 2 ta không bắt đầu lại từ 10 bits của khoá ban đầu, mà từ
"sản phẩm" đã được hoán vị trước khi nhặt ra khoá con thứ nhất, tức là từ .
Sau khi tách nó thà
nh 2 nửa và cho dịch từng nửa sang trái 2 vị trí (theo quy định đã đề ra
từ trên), ta có được
0123456789
tttttttttt

23401 78956 2340178956 0 1 2 3 4 5 6 7 8 9
()()( )(ttttt ttttt tttttttttt uuuuuuuuuu==
và sau đó áp dụng "phép chọn" S8 để nhặt ra 8 thành phần là .
52637498
()uuuuuuuu
Các ánh xạ và các "phép nâng" tương ứng
12
,TT
Mỗi vòng biến đổi cần một ánh xạ T. Trong DES thu gọn ta dùng 2 vòng nên sẽ cần 2 ánh
xạ . Vì T chỉ làm việc trên nửa s
au của khối dữ liệu (4 bits), nên biến của nó sẽ là

, với .
12
,TT
4567
nnnn
{}
0, 1
i
n Î
Toá
n tử vận hà
nh khá "tinh vi", trước hết từ 1 số nhị phân 4 bits là nó
sinh ra 8 bits bằng cách cho nó xoay vòng sang phải 1 bit để được 4 bits đầu và cho xoay
vòng ngược về trái 2 bits để được 4 bits sau, và nếu xếp các bits này thành 2 hàng (mỗi
hàng 4 bits) ta có biểu đồ sau
1
T
4567
nnnn
745
567
nnnn
nnnn
6
4
.
Sự tham gia của khóa con được thông qua phép cộng. Sau khi cộng vào đây các thành phần
của khoá c
on thứ 1 (ta đang nói về ), tức là , ta được
1

T
52637498
()tttttttt
7542566
57647948
ntntntnt
ntntntnt
++++
++++
3
.
Sau khi “đặt tên” lại
00 01 02 03
10 11 12 13
pppp
pppp


5
)
Mỗi thành phần c
hỉ là số 0 hoặc 1, nên từng cặp hai thành phần sẽ biểu diễn một số nhị
phân nào đó có giá trị thập phân từ 0 đến 3, và sẽ được xem như chỉ số của hàng hay cột
trong một bảng số chữ nhật cỡ 4x4 nào đó. Quy ước rằng số tạo bởi các bits nằm ngoài
vùng "đóng cọc", như , sẽ là số chỉ hàng, còn số tạo bởi các bits nằm
trong vùng
"đóng cọc", như
( , sẽ là số chỉ cột. Khi ấy, mỗi hàng sẽ cho ta "toạ độ" một phần tử
trên bảng số. Các bảng số này được cho sẵn (còn có tên gọi là các S-boxes), và trong
phương án DES thu gọn thì chúng chứa các phần tử là số nguyên từ 0 đến 3, cụ thể là:

00 03
(pp
02
)
01
pp
[]
0123
0
1032
1
3210
0
2
0213
3
3132
S
é
ù
ê
ú
ê
ú
=
ê
ú
ê
ú
ê

ú
ê
ú
ê
ú
ë
û
[]
0123
0
0123
1
2013
1
2
3010
3
2103
S
é
ù
ê
ú
ê
ú
=
ê
ú
ê
ú

ê
ú
ê
ú
ê
ú
ë
û
, .

Ta lấy ra trong bảng S[0] phần tử có tọa độ sinh bởi hàng trên (tức là có chỉ số hàng
và chỉ số cột ); nó là một số nguyên nào đó trong khoảng 0 đến 3 nên c
ó
thể viết lại dưới dạng nhị phân như một số 2 bits là . Tương tự như vậy ta lấy ra trong
ma trận S[1] phần tử có
tọa độ sinh bởi hàng dưới (tức là có chỉ số hàng , vả chỉ số
cột ) rồi viết nó lại dưới dạng nhị phâ
n là . Ta "dính" 2 kết quả tìm kiếm lại
và được một số nhị phân 4 bits là . Sau cùng, ta sử dụng phép hoán vị P4 =
(1,3,2,0) và biến số nà
y thành ra và đó chính là kết quả tác động của toán tử
lên nửa khối dữ liệu
n . Như vậy ta có:
00 03
(pp
11
(pp
) )
)
)

) )
)
)
01 02
(pp
4567
nnn
01
(qq
23
(qq
10 13
(pp
12
0123
(qqqq
1320
()qqqq
1
T
1 4567 1320
()(T nnnn qqqq=
và ánh xạ có biểu diễn tường m
inh là
1
T
P
1
01234567
()

T
nnnnnnnnP =
0 11 32 23 04567
( , , , ,,,,)nqnqnqnqnnnn++++
(trong đó các "dấu phẩy" được đưa và
o biểu thức vế phải một cách "khiên cưỡng" chỉ với
mục đích là để cho dễ nhìn hơn).
Toá
n tử vận hành hoàn toà
n tương tự, chỉ khác tại bước cộng khoá thì ta dùng khoá
con thứ 2, còn lại các S-boxes và phép hoán vị P4 thì vẫn như cũ. Rõ ràng, chính bước
"cộng khoá" đã làm cho các ánh xạ T trở nên "bị tham số hóa" bởi khoá.
2
T
Ta không cần phải bận tâm khi thấy rằng một nửa của khối dữ liệu không hề bị biến
đổi, vì tiếp sau đó sẽ ta sẽ gọi ra phép đảo 2 nửa khối
Q và toán tử sẽ "tiến ra" vận hành
trên nửa khối còn đang đề nguyên đó.
2
T
Sau đây ta sẽ kí hiệu là
cho gọn việc trình bày.
i
T
P
i
f
Quy trình hoạt động của DES thu gọn
Một chu trình tác động lên một khối dữ liệu (8 bits) của DES thu gọn là tổ hợp của các phép
biến đổi sau:

1
21
IP f f IP
-
Q
với IP là phép hoán vị ban đầu, cho bằng vectơ . 8 (1 , 5, 2, 0, 3, 7, 4, 6)P =
Dễ dàng tính ra .
1
(3,0,2,4,6,1,7,5)IP
-
=

6
1-

Từ c
hu trình lập mã như trên và quy tắc ta rút ra chu trình giải
mã là
11
()hg g h

=
()
1
11
21 12
IP f f IP IP f f IP
-

Q=Q  .

được gọi là một vòng biến đổi trong quá trình mã hoá.
Ánh xạ kép
i
f
Q 
Mỗi vòng m
ã hoá cần tới một hàm
i
f
, phụ thuộc vào chìa khoá con của vòng đó. Khi
tăng số vòng trong quy trình mã hoá thì đòi phải sinh ra nhiều chìa khoá con hơn (từ 1 chìa
khoá đã cho ban đầu), và khi ấy người ta cũng thường đạt được độ an toàn cao hơn.
Lưu ý rằng phé
p đảo vế
Q được sử dụng chỉ nhằm mục đích đưa nửa khối dữ liệu còn
lại ra cho biến đổi
f
trong vòng tiếp theo, cho nên nó sẽ không có tác dụng gì ở vòng cuối
cùng (vì sau đó không còn có biến đổi
f
nữa). Vì vậy, trong vòng cuối người ta thường bỏ
đi công đoạn đảo vế 2 nửa khối (toán tử
Q ). Ta hiểu vì sao trong mô hình DES thu gọn với
2 vòng mà chỉ có một phép đảo vế.
Mô hình đầy đủ của DES
Trong mô hình DES thực tế, người ta dùng
 16 vò
ng (thay cho 2 vòng trong phương án rút gọn),
 khối dữ liệu 64 bits (thay cho khối dữ liệu 8 bit),
 khoá ban đầu có độ dài 56 bits (thay vì 10 bit)

 sinh 16 khoá con với độ dài 48 bits (thay vì 2 chìa với độ dài 8 bit).
Và như vậy, sẽ có những t
hay đổi sau đây:
Quy trình sinh khoá con
Các tha
o tác không có phát sinh đặc biệt, ngoài việc dùng P56 thay cho P10, dùng S48 thay
cho S8, và sử dụng tuần tự dịch chuyển với 16 bước là
(1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1)
thay cho 2 bước, là (1,2) như trong DES thu gọn.
Cơ chế vận hành của các toán tử
i
T
Nửa sau của khối dữ liệu bâ
y giờ 32 bits, tức là một số nhị phân có dạng . Từ
đây ta sẽ tạo ra 48 bits
(cho phù hợp với độ dài khoá con bây giờ là 48 bits) bằng cách nhặt
8 lần, mỗi lần 6 bits. Cụ thể là: lần đầu ta cho nó xoay vòng sang phải 1 bit và nhặt ra 6 bits
đầu (tức là được ), từ lần thứ 2 trở đi ta cho nó quay vòng về phía trái,
mỗi lần 4 bits, và nhặt ra 6 bits đầu (tức là trong lần thứ 2 ta có xâu bi
ts
, và trong lần thứ 3 t
a có xâu , ). Nếu xếp chúng
thành hàng thì sau 8 lần ta được biểu đồ với 8 hàng (mỗi hàng 6 bits) như sau:
32 33 63
( )nn n
63 32 33 34 35 36
nnnnnn
4035 36 37 38 39
nnnnnn
39 40 41 42 43 44

nnnnnn
63 32 33 34 35 36
35 36 37 38 39 40
59 60 61 62 63 32
nn n n nn
nn n n nn
nnnnnn
   

Sau khi cộng các khoá con (48 bits) vào đây theo tương ứng bit với bit, ta được một biểu đồ
mới đóng vai trò định vị "toạ độ" các thành phần trong các S-boxes (tương tự như tr
ong
phương án DES thu gọn). Cần phải lưu ý rằng, tại mỗi hàng trong biểu đồ mới, phần "trong
miền đóng cọc" có tới 4 bits cho nên nó biểu diễn một số nguyên nào đó từ 0 đến 15, còn
"phần ngoài miền đóng cọc" vẫn chỉ biểu diễn một số nguyên trong vùng từ 0 đến 3; như
vậy các S-boxes cần c
ó kích thước là 4 hàng và 16 cột, và do trong biểu đồ có 8 hàng nên ta
cần tới 8 cái S-box như vậy. Một điểm đáng chú ý là trong các S-boxes của DES thực sự thì
mỗi hàng là một vectơ 16 thành phần, nhận giá trị nguyên từ 0 đến 15 và không có 2 thành
phần nào giống nhau.
Quy trình làm việc của DES
Chu trình lập mã đư
ợc mô tả bằng công thức:
1
16 15 1
IP f f f IP
-
QQQ  
trong đó, như đã biết IP là phép hoán vị ba
n đầu, làm việc với các khối dữ liệu 64 bits,

Q

phép đảo 2 nửa khối 32 bits cho nhau, còn cơ chế vận hành của các ánh xạ (và ánh xạ
i
T
i
f

tương ứng) không có gì khác so với trong phương án rút gọn, ngoại trừ cỡ biến được tăng
lên cho phù hợp (như đã thấy ở trên). Như vậy, nếu không kể các bước hoán vị ban đầu và
cuối cùng, DES bao gồm 16 vòng, với vòng cuối cùng bỏ qua phép
Q đảo vế 2 nửa khối.
Hình vẽ sau đây mô tả một số vòng của DES. Chúng ta sẽ bỏ qua phép hoá
n vị khởi tạo
(IP - Initial permutation) và phép hoán vị kết thúc IP
-1
(ngược của phép hoán vị khởi tạo).
Các ký hiệu sau cũng sẽ được sử dụng trong suốt phần này.
P : khối văn bản nguồn (plaintext) 64-bit,
C : khối văn bản m
ã tương ứng (64-bit),
P
H
: nửa trái của khối P (32-bit),
P
L
: nửa phải của khối P (32-bit),
C
H
: nửa trái của khối C (32-bit),

C
L
: nửa phải của khối C (32-bit),
X
i
: giá trị trung gian (32-bit) của vòng thứ
i;
K
i
: khoá con (48-bit subkey) cho vòng thứ
i;
F
i
(X
i
,K
i
) : ánh xạ T tại vòng thứ i;



7
Chu trình giải mã đư
ợc suy ra từ phép lấy ánh xạ ngược (tương tự như đã làm đối với
DES thu gọn. Do tính "tự khả nghịch" của các ánh xạ được dùng, quy trình giải mã lặp lại
nguyên si quy trình lập mã với việc đảo ngược thứ tự sử dụng các ánh xạ .
i
T
P
Các phương thức sử dụng DES

Sau một thời gian sử dụng, người ta dần nhận ra rằng DES sử dụng khoá có độ dài
không thoả đáng. Trong năm 1997, người ta đã sử dụng máy tính loại mạnh (trị giá 1 triệu
đô la) để "duyệt" hết các loại "chìa khoá có thể sinh ra" của DES, trong vòng dưới 2 giờ
đồng hồ, cho nên DES không còn sức mạnh đối với các máy tính cao cấp. Các biến thể của
DES đã được đưa ra làm giải pháp "cứu cánh". Người ta cũng phát hiện ra rằng việc mã hoá
2 lần liên tiếp bằng D
ES (với 2 chìa khác nhau) lại chẳng mạnh hơn bao nhiêu so với DES
đơn. Phương án được dùng rộng rãi là DES bội 3 với 2 chìa, trong đó lần giữa dùng chìa
thứ 2 để thực hiện phép giải mã mà không lập mã. Cụ thể, nếu ký hiệu phép lập mã bằng
khoá k là và phép giải mã bằng khóa k là , thì DES bội 3 đư
ợc mô tả bằng công thức
k
E
k
D

8
))
121
((()
key key key
CTEDEPT= .
Việc triển khai DES trên chip c
ho phép tạo thêm nhiều biến thể cho việc sử dụng DES:
Phương án đơn giản là dùng Electronic C
ode Book (ECB), các khối văn bản được mã
hoá độc lập với nhau. Phương án này đơn giản, nhưng có một nhược điểm là, với một khoá
đã cho, các khối văn bản nguồn giống nhau sẽ ứng với các khối văn bản mã giống nhau.
Phương án an toàn hơn là dùng CipherBloc
k Chaining (CBC) mode. Người ta khởi tạo

ra một vectơ ban đầu (là một xâu số nhị phâ
n 64 bits) và thông báo cho nhau biết (cùng với
khoá). Trong bước đầu, vectơ khởi tạo được trộn với khối PT đầu tiên (bằng phép loại bits
), rồi lấy kết quả thu được cho m
ã hoá (bằng DES), thành ra khối CT đầu tiên. Bước tiếp
theo lấy kết quả mã hoá (CT) của bước trước làm vectơ khởi tạo và thực hiện tương tự như
bước trước (đối với khối văn bản tiếp theo).
Å
Một phương án khác là Cipher Feedback (CFB) mode. Người ta cũng sử dụng vectơ
khởi tạo, nhưng không đem trộn nga
y với PT mà đem mã hoá (bằng DES) rồi mới trộn với
PT (bằng phép loại bits
Å
) thành ra CT, kết quả CT bước trước lại được dùng làm vectơ
khởi tạo cho bước sau và công việc tiếp diễn tương tự như bước trước.
Phương án sau cùng là Output Feedback (OFB) mode, thực ra là biến DES thành một
công cụ mã dòng (Stream Cipher). Người ta dùng DES để sinh ra một dòng khoá (Key
Stream) đem trộn với dòng bits văn bản nguồn (bằng phép loại bits
Å
) để thu được dòng
bits văn bản mã. Quy trình sinh khoá dòng cũng sử dụng vectơ khởi tạo ban đầu. Vectơ này
được mã hoá (bằng DES) và cho ta khối đầu tiên của khoá dòng. Khối đầu tiên lại được mã
hoá (bằng DES) để cho ra khối tiếp theo của khoá dòng là. Công việc cứ thế tiếp diễn cho
tới khi có đủ dòng khoá.
Độ an toàn của DES
Ban đầu, DES xem ra có vẻ như là vững chắc. Tuy nhiên, sau một thời gian dài sử
dụng, những yếu điểm của DES cũng đã dần bộc lộ. Với độ dài của chìa khoá chỉ vẻn vẹn
có 56-bits làm cho số lượng chìa (có thể sinh ra) là không đủ nhiểu so với số lượng chips và
tốc độ xử lý của các siêu máy tính này nay, nhất là các dàn máy song song chuyên dụng
phục vụ cho giải mã. Với các máy tính này, nhiều nơi đã thông báo khả năng có thể bẻ khoá

được DES trong thời gian không quá lâu. Chính vì vậy, trong mấy năm gần đây đã xuất

9
hiện nhiều giải pháp khác ưu việt hơn nó, đáng lưu ý hơn cả là International Data
Encription Algorithm (IDEA) và Advanced Encrypti
on Standard (AES), cùng hỗ trợ cho
khoá dài 128 bits
Tiêu chuẩn mã hoá nâng cao và thuật toán Rijndael
(AES - Advanced Encryption Standard)
Quá trình hình thành
Trong nguy cơ sụp đổ của DES trước các cuộc tấn công của các siêu máy tính đương
thời, ngày 2/1/1997 (gần như tròn 20 năm kể từ khi DES được Chính phủ thông qua), Viện
Tiêu chuẩn và Công nghệ Quốc gia Hoa Kỳ (NIST) chính thức đưa ra đề nghị cộng đồng
tham gia vào việc xây dựng một chuẩn mã hoá nâng cao (Advanced Encryption Standard -
AES). Trong số những yêu cầu đưa ra đối với AES, có những tiêu chí đáng lưu ý sau đây:
A.1) AES đư
ợc xác lập công khai.
A.2) AES là hệ mã k
hối đối xứng.
A.3) AES được thiết kế sao cho độ dài khoá có thể mở rộng theo nhu cầu.
A.4) AES c
ó thể triển khai trên cả phần cứng và phần mềm.
A.5) AES cần phải là sản phẩm a) miễn phí
hoặc là b) được cho dưới các điều kiện phù
hợp với chính sách về bản quyền của Viện tiêu chuẩn quốc gia Hoa kỳ (American
National Standards Institute - ANSI ).
A.6) Các thuật toán thoả mãn các điều kiện trên sẽ được xem
xét trên cơ sở các phương
diện sau đây:
a) Tính bảo mật ;

b) Tính hiệu quả về mặt tính toán ;
c) Nhu cầu đòi hỏi về bộ nhớ ;
d) Tính đơn giản;
e) Tính mềm dẻo, linh động ;
f) Các yêu cầu về phương diện bản quyền .
Sau một thời gian xe
m xét và thảo luận thêm, tháng 9/1997, NIST chính thức đưa ra lời
kêu gọi hưởng ứng cuộc thi xây dựng thuật toán cho AES.
Trong vòng 1, từ t
háng 8/98 đến 4/99, sau khi loại bỏ các phương án không thoả mãn
các tiêu chí đề ra, người ta chính thức đưa vào xem
xét 15 phương án (gửi đến từ khắp nơi
trên thế giới: Đức, Bỉ, Áo, Pháp, Nhật, ).
Trong vòng 2, từ 8/99 đến 5/
2000, từ 15 phương án xem xét người ta lọc ra được 5
phương án để đưa vào vòng chung kết, đó là:

n thuật toán
Những người sáng chế
MARS
IBM (đại diện bởi Ne
venko Zunic)
RC6
TM

RSA Laboratories (đại diện bởi Burt Kaliski)
Joan Daemen, Vincent Rijmen
Rijndael
Ross A
nderson, Eli Biham, Lars Knudsen

Serpent
Bruce Schneier, John Kelsey,
Doug Whiting, David
Wagner, Chris Hall, Niels Ferguson
Tw
ofish
Trong vòng chung kết, diễn ra trong 90 ngà
y từ đầu tháng 3 đến cuối tháng 5/2001, với
sự xem xét tỷ mỷ cả 5 thuật toán từ mọi phương diện, người ta đã chọn Rijndael làm thuật
toán cho AES. NIST tổng hợp các thông tin về Rijndael và tiếp tục đưa ra cho bàn dân thiên
hạ xem xét và bình luận lần cuối, trước khi đi đến kết luận c
uối cùng vào cuối mùa hè năm
2001.
Thuật toán Rijndael mang đậm màu
sắc Toán học. Trong thuật toán này, ngoài các tính
toán đồng dư và các phép tính bits (thường gặp trong các thuật toán khác), người ta đã thiết
lập những phép toán khá đặc biệt trong trường hữu hạn và trong vành đa thức trên trường
hữu hạn.
Công cụ chuẩn bị
Chúng ta xây dựng 2 loại phép toán mới: loại phép toán trên tập các byte (8 bits) và loại
phép toán trên các là từ (word), tức là vectơ gồm 4-byte.
Các phép toán ở mức byte trong thuật toán Rijndael được định nghĩa thông qua phép
biểu diễn mỗi byte như một phần tử của trường hữu hạn hay còn gọi là , và ở
đây sẽ được gọi là trường các byte.
8
2
F
8
(2 )GF
Các phép toán trên các từ (gồm 4

byte) sẽ được thiết lập trên cơ sở các phép toán trên
các byte theo ý tưởng như sau. Mỗi từ thường được xem như một vectơ 4 chiều trên trường
các byte và mỗi vectơ 4 chiều lại có thể được xem như tập các hệ số của một đa thức bậc 3.
Như vậy, các phép toán trên các từ có thể được định nghĩa thông qua các phép toán trên các
đa t
hức bậc 3 (với các hệ số là byte).
Trường các byte đã được đề cập trong phần cơ sở toán học. Bây giờ ta xem
xét vành
các đa thức trên trường các byte.
Đa thức trên trường các byte (GF(2
8
)) và các “từ”
Sau nà
y ta sẽ chỉ xem xét các từ (word) gồm 4 byte cho nên ta sẽ chỉ đề cập tới các
vectơ 4-byte, và các đa thức có bậc không vượt quá 3. Thông thường, vectơ 4-byte
đư
ợc tương ứng với đa thức
3210
(, ,, )bbbb

10
0
32
321
()bx bx bx bx b=+++
.
Phép cộng cũng như việc cộng các byte trong trường , được thực hiện một cách
đơn giản thông qua phép loại bits EXOR.
8
(2 )GF

Phé
p nhân các từ dùng 2 phép toán bổ trợ:
a) Các hệ số của đa thức tính theo quy tắc nhân () và cộng () c
ác byte, trong trường
;
8
(2 )GF
b) Đa thức tích phải được rút gọn theo modulo một đa t
hức bậc 4 nào đó (để cho ra một
đa thức bậc không quá 3).
Trong Rijndael thì đa thức này đư
ợc chọn là . Khi ấy, việc rút gọn
theo m
odulo được thực hiện dễ dàng nhờ “công thức hạ bậc” sau đây
4
() 1Mx x=+
()Mx
mod 4
mod ( )
j
j
xMxx=
. (*)

Ví dụ. Với
32
321
()ax ax ax ax a=+++
0
0

0
2
3 3
3
3
3
0
1
ù
ú
ú
ú
ú
ú
ú
ú
û
,
32
321
()bx bx bx bx b=+++,
thì tích "thông thường" sẽ là đa thức
()()axbx
65432
654321
()cx cx cx cx cx cx cx c=++++++
với các hệ số xác định như sau:
00011001220110
,,cabcababcababab=· =·Å· =·Å·Å·


33021120
cabababab=·Å·Å·Å·,
431221
cababab=·Å·Å·
5322363
,cababcab=·Å· =· .
Sau khi rút
gọn theo modulo , nhờ côn
g thức (*), ta thu được “tích thực sự" của
và , ký hiệu là , với các hệ số xác định như sau
()Mx
()x bÄ
()ax
()bx () ()dx a x=
3 3 30 21 12 03
d c ab ab ab ab==·Å·Å·Å·
;
22
dcc=Å
620 11 02 33
ab ab ab ab·Å·Å ·Å·
= ;
115
dcc=Å=
10 01 32 2
ab ab ab ab·Å·Å·Å·;
00
dcc=Å
400 31 22 1
ab ab ab ab·Å·Å·Å·= .

Theo quy tắc trên, phép nhân với một đa t
hức cố định có
thể được biểu diễn dưới dạng một phé
p nhân ma trận, trong đó các hệ số của đa thức tích
được tính theo các hệ số của đa thức đem nhân qua một phép biến đổi tuyến tính với ma
trận có các hàng xoay vòng, cụ thể là:
32
321
()ax ax ax ax a=+++
. (**)
00
0321
11032
2103
22
3210
33
.
db
aaaa
d aaaa b
aaaa
db
aaaa
db
éù é
éù
êú ê
êú
êú ê

êú
êú ê
êú
=
êú ê
êú
êú ê
êú
êú ê
êú
êú ê
ëû
ëû ë
Nếu theo ngôn ngữ vectơ (tương ứng với đa thức) thì ta có một quy
tắc nhân vectơ, mà
theo nó phép nhân với một vectơ cố định được xem như là một phép biến đổi aphin với ma
trận có các hàng xoay vòng (như đã thấy ở trên).
Chú ý: Đa thức cho ta một phép tính đồng dư khá đơn giản dựa trên công
4
() 1Mx x=+
thức (*), nhưng nó lại không phải là đa thức bất khả quy trên trường cho nên phép
nhân với một đa thức cố định (nào đó) không nhất thiết là phải khả nghịch. Sự khả nghịch
chỉ xảy ra khi đa thức cố định được chọn phải là nguyên tố cùng nhau với đa thức
8
(2 )GF

11

12
0

3
4
() 1Mx x=+
()xbx
. Chính vì thế, các phép biến đổi dựa trên phép nhân với một đa thức cố
định mà ta sử dụng sau này thì đa thức được chọn sẽ luôn phải thoả mãn điều kiện này.
Trên thực tế, phé
p nhân với một đa thức bất kỳ (bậc nhỏ hơn 4) luôn có thể thực hiện
được thông qua việc lấy tổng của vài phép nhân với đơn thức, và điều này lại có thể thực
hiện đư
ợc thông qua không quá 3 lần nhân liên tiếp với x, và điều này lại khá đơn giản như
thấy dưới đây.
Phép nhân với đơn thức x
Giả sử rằng ta có đa thức . Khi ấy:

32
321
()bx bx bx bx b=+++
432
3210
( )mod ()bx bx bx bx MxÄ= +++ .
32
210
bx bx bx b=+++
Như vậy,
bằng việc cho vectơ tương ứng của đa thức là xoay vòng sang
trái 1 byte, ta sẽ thu được vectơ tương ứng của đa thức tích , là . Điều
này cũng hoàn toàn phù hợp với
công thức nhân ma trận nêu trên, trong đó ma trận của
phép nhân với x sẽ có hầu hết các thành phần là 0, chỉ trừ

a
.
()bx
1
3210
(, ,, )bbbb
()xbxÄ
'01'
2103
(,, , )bbbb
=
Tóm lại, phép nhân một từ với x là tương ứng với việc cho các byte trong từ xoay vòng
sang trái một vị trí.
Thuật toán
Vài nét đặc trưng về thiết kế
Ba tiêu chí đư
ợc quán triệt trong quá trình thiết kế là:
 Có khả năng chống đư
ợc các phương pháp thám mã đã biết;
 Chương trình gọn, tốc độ nhanh;
 Thiết kế sáng sủa;
Trong Rijndael, tại mỗi vòng,
sự biến đổi dữ liệu được cấu thành từ 3 phép biến đổi
khả nghịch, gọi là các tầng (layer), tuy độc lập với nhau nhưng tương tự như nha
u. Mỗi
tầng có hàm của riêng mình. Trong đó:
 Tầng trộn t
uyến tính (linear mixing) mang lại sự khuếch tán cao sau nhiều vòng;
 Tầng phi tuyến sử dụng các S-boxes song song với các tính chất phi tuyến tối ưu;
 Tầng cộng với khoá (thực hiện giữa dữ liệu trung gian với khoá của vòng).

Một điều đáng lưu ý là độ dài khoá và độ dài khối trong Rijndael có thể th
ay đổi (hoàn
toàn độc lập với nhau) trong tập các giá trị 128, 192 hoặc 256 bits.
Trạng thái, khoá mã và số lượng vòng
Trạng thái (State) là kết quả mã hoá trung gian (chưa p
hải là văn bản mã). Nó được biểu
diễn dưới dạng một mảng chữ nhật (với phần tử là các byte):
 Có 4 dòng (Mỗi cột là 1 từ);
 Số lượng cột bằng số lượng từ trong một khối (= độ dài khối chia cho 32).
Người ta ký hiệu số lượng cột là Nb, và như vậy 32xNb chính là độ dài khối.
Khoá mã (C
ipher Key) cũng là một mảng chữ nhật có 4 dòng với số lượng cột bằng độ dài
khoá chia cho 32, ký hiệu là Nk. (Vậy: khoá có độ dài là 32xNk).
Do độ dài khối là độc lập với độ dài khoá cho nên Nb và Nk nói chung là khác nhau.
Dưới đây là minh hoạ một mảng trạng thái (với Nb=6) và một mảng khoá mã (với Nk=4).
a
0,0
a
0,1
a
0,2
a
0,3
a
0,4
a
0,5

k
0,0

k
0,1
k
0,2
k
0,3

a
1,0
a
1,1
a
1,2
a
1,3
a
1,4
a
1,5

k
1,0
k
1,1
k
1,2
k
1,3

a

2,0
a
2,1
a
2,2
a
2,3
a
2,4
a
2,5

k
2,0
k
2,1
k
2,2
k
2,3

a
3,0
a
3,1
a
3,2
a
3,3
a

3,4
a
3,5

k
3,0
k
3,1
k
3,2
k
3,3

Hình 1. Thí dụ về các mảng trạng thái (với Nb=6) và mảng khoá mã (với Nk=4)
Khi biểu diễn dưới dạng mảng 1 chiều thì các phần tử được viết theo thứ tự theo từng
cột (từ trên xuống dưới) và từ trái qua phải, nghĩa là được ánh xạ lần lượt vào các vị trí:
a
0,0
,

a
1,0
, a
2,0
, a
3,0
, a
0,1
, a
1,1

, a
2,1
, a
3,1
,
hoặc là
k
0,0
,

k
1,0
, k
2,0
, k
3,0
, k
0,1
, k
1,1
, k
2,1
, k
3,1
,
(tuỳ thuộc dữ liệu là văn bản hay là khoá).
Như vậy, nếu một byt
e có chỉ số trong mảng một chiều là n và chỉ số trong mảng chữ
nhật (2 chiều) là (i,j) thì các chỉ số này sẽ thoả mãn quan hệ sau đây:
ë

û
4. ; mod 4 ; / 4ni j in j n=+ = = .
Rõ ràng, chỉ số i cũng chính là chỉ số của byte trong từ (vectơ 4-byt
e), và j cũng chính
là chỉ số của từ trong lòng một khối.
Số lượng
vòng trong thuật toán Rijndael, ký hiệu là Nr, được xác định trong mối tương
quan với độ dài khối và độ dài khoá, cho sẵn bảng tương quan sau đây:
Nr
Nb = 4 Nb = 6 Nb = 8
Nk = 4

13
10 12 14
Nk = 6
12 12 14
Nk = 8
14 14 14
Hình 2. Bảng tương quan giữa số lượng vòng với độ dài khối và độ dài khoá.
Ta có t
hể "gói gọn" bảng trên trong một công thức Nr = 6+max{Nk,Nb}, và như vậy
số lượng vòng là một hàm theo độ dài khối và độ dài khoá.
Các phép biến đổi trong một vòng
Trước hết ta đưa ra 4 phé
p biến đổi cơ bản và sau đó, trên cơ sở các phép biến đổi này,
ta trình bày thuật toán biến đổi của mỗi vòng.
1. Phép thế byte (ByteSub Transformation)
Đây là phé
p biến đổi phi tuyến được thực hiện một cách độc lập trên từng byte của
trạng thái. Bảng thay thế (hay còn được gọi là S-box) là "khả nghịch" và được thiết lập trên

cơ sở tích của 2 phép toán sau:
 Phé
p lấy byte ngược thay thế mỗi byte bằng nghịch đảo của nó (theo phép nhân
trong trường các byte
8
(2 )GF ) ;
 Phép biến đổi affine (trong trường
8
(2 )GF
), theo đó byte
, kết quả có
được sau phép lấy byte ngược đã nêu ở trên,
được chuyển thành byte xác định theo công thức sau:
01234567
'' " "xxxxxxxxx=
''y
01234567
" "yyyyyyyy=
00
11
22
33
44
55
66
77
10001111
1100 0111
11100011
111100 01

.
11111000
01111111
00111111
00011111
yx
yx
yx
yx
yx
yx
yx
yx
éù
êú
éù éù
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú êú

=
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú êú
êú
êú ê
êú
êú ê
êú
êú ê
êú ê
êú
ëû ëû
êú
ëû
1
1
0
0
0
1
1
0
éù
êú

êú
êú
êú
êú
êú
êú
êú
+
êú
êú
êú
êú
êú
ú
êú
ú
êú
ú
ú
êú
êú
ëû
.
Như vậy, phép thế byt
e biến từng byte a
i,j
(trong mảng trạng thái chữ nhật) thành từng
byte b
i,j
(trong mảng trạng thái mới, cũng hình chữ nhật) một cách độc lập với nhau. Xét về

mặt bản chất, nó hoạt động giống như một "hộp thay thế" (S-box) thường gặp trong một số
hệ mã đối xứng quen biết. Sơ đồ thực hiện của nó là như sau:

a
0,1
a
0,2
a
0,3
a
0,4
a
0,5


b
0,0
b
0,1
b
0,2
b
0,3
a
0,4
a
0,5

14
a

0,0

a
1,0
a
1,1
a
1,2
a
1,3
a
1,4
a
1,5


b
1,0
b
1,1
b
1,2
b
1,3
a
1,4
a
1,5
a
2,0

a
2,1
a
2,2
a
2,3
a
2,4
a
2,5


b
2,0
b
2,1
b
2,2
b
2,3
a
2,4
a
2,5
a
3,0
a
3,1
a
3,2

a
3,3
a
3,4
a
3,5


b
3,0
b
3,1
b
3,2
b
3,3
a
3,4
a
3,5
Do phép biến đổi affine với ma trận như trên là khả nghịch, cho nên phép thay thế byte
cũng là khả nghịch (phép toán ngược của nó cũng là tích của một phép biến đổi affine với
một phép lấy byte ngược theo phép nhân trong trường các byte ).
8
(2 )GF
Phé
p thay thế byte có thể được viết thành một lệnh (hàm) với tên sau đây:
ByteSub(State)
2. Phép dịch hàng (ShiftRow Transformation)
Trong phé

p biến đổi này, các hàng trong mảng trạng thái được dịch xoay vòng sang
phía trái, nhưng số lượng vị trí dịch chuyển của các hàng là không giống nhau. Hàng 0 (trên
S-box
cùng tr
ong mảng) là đứng yên không dịch chuyển. Các hàng thứ 1, thứ 2 và thứ 3 được dịch
sang phía trái các số lượng byte, tương ứng, là C1, C2, C3 xác định trong mối tương quan
với độ dài khối theo bảng sau đây:
Nb
C1 C2 C3
4 1 2 3
6 1 2 3
8 1 3 4
(Để cho dễ nhớ thì lưu ý rằng, không kể trường hợp ngoại lệ độ dài khối là 256 (còn ít
được xét đến), trong các trường hợp thường dùng thì mỗi hàng được dịch xoay vòng sang
trái một số lượng vị trí byte đúng bằng chỉ số của hàng).
Phé
p dịch hàng được thực hiện bằng hàm
ShiftRow(State)
Rõ ràng nó là một hàm khả nghịch và nghịch đảo của nó cũng là một phép biến đổi (tác
động lên các mảng trạng thái) có bản chất giống như nó, chỉ ngược nhau ở hướng dịch
chuyển.
3. Phép trộn cột (MixColumn Transformation)
Ta có thể xem
mỗi cột của mảng trạng thái như là một từ, hay cũng là một phần tử
trong vành đa thức (với các hệ số trên trường byte) mà ta đã xét ở phần trên. Như vậy ta có
thể đưa ra một phép biến đổi các cột bằng cách nhân đa thức biểu diễn nó với một đa thức
cố định sau đây:
32
( ) '03' '01' '01' '02'cx x x x=+++.
Lưu ý rằng, phép nhân với một đa thức cố định (trong vành đã xét) cũng chí

nh là phép
biến đổi vectơ cột (các hệ số của đa thức bị nhân) bằng phép nhân với một ma trận cố định,
mà theo công thức (**) thì ma trận ứng với phép nhân đa thức , là như sau:
()cx
02 03 01 01
01 02 03 01
01 01 02 03
03 01 01 02
C
é
ù
ê
ú
ê
ú
ê
ú
=
ê
ú
ê
ú
ê
ú
ê
ú
ë
û
.
Phé

p trộn cột và sẽ được thực hiện bằng lệnh có tên là
MixColumn(State)
Tác động của nó trên từng cột của mảng trạng thái được
minh hoạ trong hình vẽ sau:





15
b
0,0
b
0,1
b
0,2
b
0,3
a
0,4
a
0,5

16
a
0,0
a
0,1
a
0,2

a
0,3
a
0,4
a
0,5


a
1,0
a
1,1
a
1,2
a
1,3
a
1,4
a
1,5


b
1,0
b
1,1
b
1,2
b
1,3

a
1,4
a
1,5
a
2,0
a
2,1
a
2,2
a
2,3
a
2,4
a
2,5


b
2,0
b
2,1
b
2,2
b
2,3
a
2,4
a
2,5

a
3,0
a
3,1
a
3,2
a
3,3
a
3,4
a
3,5


b
3,0
b
3,1
b
3,2
b
3,3
a
3,4
a
3,5
Äc(x)
Ta biết rằng phép nhân trong vành đa thức với hệ số byte cũng chính là phép nhân đa
thức theo modulo . Do đa thức là “nguyê
n tố cùng nhau” với đa thức ,

4 4
1x + ()cx 1x +
cho nên phép trộn cột là một toán tử khả nghịch.
Nghịch đảo của phép trộn cột cũng là một phép biến đổi tương tự như nó, tức là cũng là
một phé
p nhân với một đa thức cố định
dx . Đa thức này chính là phần tử nghịch đảo của
đa thức
cx theo phép nhân trong vành đang xét. Phần tử nghịch đảo này tồn tại do điều
kiện đa thức
cx là “nguyên tố cùng nhau” với đa thức x . Có thể tính ra được
()
()
()
4
1+
32
( ) '0B' '0D' '09' '0E'dx x x x=+++.
4. Cộng với khoá của vòng (Round Key addition)
Trong phép biến đổi này mảng trạng t
hái được cộng với khoá của vòng bằng phép loại
bits EXOR quen biết. Khoá của vòng được sinh ra từ khoá mã (Cipher Key) theo một quy
trình riêng (sẽ trình bày sau). Mặc dù khoá mã có thể có độ dài khác với độ dài khối, nhưng
quy trình sinh khoá vòng luôn đảm bảo cho độ dài của các khoá vòng được phù hợp với độ
dài khối, và do đó phép loại bits EXOR luôn thực hiện được.
Phé
p cộng với khoá vòng là một hàm
2 biến (trạng thái và khoá vòng), sẽ được thực
hiện bởi lệnh có tên là
AddRoundKey(State,RoundKey) .

Rõ ràng nó là một hàm tự khả nghịch, do tính tự khả nghịch của phép toán EXOR.
5. Thuật toán biến đổi trong mỗi vòng
Các biến đổi trong một vòng thông thường đư
ợc mô tả trong ngôn ngữ "tựa C" bằng
một đoạn mã sau đây:
Round(State,RoundKey)
{
ByteSub(State);
ShiftRow(State);
MixColumn(State);
AddRoundKey(State,RoundKey);
}
Riêng tr
ong vòng kết thúc (Final Round) ta không sử dụng phép trộn cột, và mô tả nó
bằng đoạn mã sau đây:
FinalRound(State,RoundKey)
{
ByteSub(State);
ShiftRow(State);

17
AddRoundKey(State,RoundKey);
}
Quy trình sinh (phát triển) khoá
Đây là quy trình "c
hế biến" chìa khóa mã ban đầu (Cipher Key) thành ra các chìa
khoá con dành cho từng vòng biến đổi. Nó gồm 2 công đoạn: Mở rộng khoá và trích chọn
khoá cho vòng.
Mở rộng khoá
Mở rộng khóa là quá trình kiến tạo một mảng t

uyến tính của các từ (4 byte), xuất phát
từ Nk từ của chìa khoá mã (Cipher Key), với các từ tiếp theo được xác định truy hồi theo
các từ ở phía trước. Quy tắc truy hồi thay đổi theo độ dài của khoá mã, chính xác hơn nó
phụ thuộc vào việc giá trị Nk lớn hơn hay là bé hơn 6. Trước khi đi vào trình bày quy trình
mở rộng khoá cụ thể, ta đưa ra một số hàm
bổ trợ sau đây.
SubByte(W) là hàm thế byte, nó biến một từ (4 byte) thành một từ mới, bằng cách áp
dụng Rijndael S-box lên từng byte của từ.
RotByte(W) là hàm xoay byte, nó biến một từ thành một từ mới, bằng cách cho các
byte trong từ xoay vòng sang trái 1 vị trí, tức là biến (a,b,c,d) thành ra (b,c,d,a).
Theo ngôn ngữ trong vành đa thức với hệ số byte thì hà
m này cũng chính là phép nhân với
đơn thức x.
Rcon[i] là các hằng cho vòng (Round Constants) dưới dạng các từ, được xác định
(không phụ thuộc vào Nk) theo công thức sau:
Rcon[i] = (RC[i],'00','00','00')
trong đó RC[i] là một phần tử trong trường các byte, được xác định theo quy tắc truy hồi
như sau:
RC[1] = '01' , RC[i] = '02'RC[i-1] , với i từ 2 trở lên.
Lưu ý rằng '02' chính là phần tử ứng với đa thức x , cho nên trên thực tế ta có
RC[i] = x
i-1
.
Quy trình mở rộng k
hoá cho trường hợp Nk  6
Trong trường hợp này, Nk từ đầu tiên của khoá mở rộng được lấy đúng bằng khoá mã
(Cipher Key). Các từ tiếp theo W[i] được xác định như sau:
Khi i không phải là bội của Nk thì
W[i] = W[i-Nk]W[i-1], trong đó  là ký hiệu của phép XOR;
Khi i là bội của Nk thì

W[i] = W[i-Nk]SubByte(RotByte(W[i-1]))Rcon[i/Nk] .
Quy trình mở rộng k
hoá cho trường hợp Nk > 6
So với quy trình trên, chỉ có một thay đổi nhỏ là xét thêm trường hợp khi (i-4) là bội
của Nk. Trường hợp đó thì lấy
W[i] = W[i-Nk]SubByte(W[i-1])

18
Nhận xét chung
: cả 2 quy trình trên đều cho phép sinh ra một dải khoá mở rộng (Extended
Key) gồm các từ W[i],i=1,2,3, về nguyên tắc thì có thể kéo dài mãi ra vô cùng.
Quy trình mở rộng khoá được thực hiện thông qua hàm:
KeyExpansion(CipherKey,ExpandedKey)
Trích chọn
khoá cho vòng (Round Key Selection)
Khoá cho mỗi vòng được chọn sao cho độ dài của nó phải phù hợp với độ dài của mảng
trạng thái (tức là bằng độ dài khối). Nếu tính theo số lượng từ (4 byte) thì độ dài này là Nb.
Cho nên, cách lấy khoá tự nhiên, cho vòng thứ i, là chọn các từ trên dải từ W[Nb*i] đến
W[Nb*(i+1)].
Thuật toán lập mã
Thuật toán m
ã hoá Rijndael bao gồm 3 việc sau đây:
 Khởi tạo bằng việc cộng với khoá vòng;
 Thực hiện (Nr-1) vòng biến đổi thông thường (như đã mô tả trong phần thuật
toán biến đổi trong vòng) ;
 Thực hiện 1 vòng kết thúc (cũng đã được mô tả trong phần đã nói);
trong đó số Nr được xác định trong mối tương quan với độ dài khối và độ dài khoá, như
trong bảng tại Hình 2).
Với các hàm KeyExpansion(),AddRoundKey(),Round(), FinalRound()
đã được đưa ra ở các phần trên, ta có thể mô tả thuật toá

n Rijndael trong ngôn ngữ "tựa C"
bằng đoạn mã sau đây:
Rijndael(State,CipherKey)
{
KeyExpansion(CipherKey,ExpandedKey);
AddRoundKey(State,ExpandedKey);
For( i=1; i<Nr ; i++) Round(State,ExpandedKey+Nb*i);
FinalRound(State,ExpandedKey + Nb*Nr);
}
Nếu như quá trình mở rộng khoá đã được thực hiện trước và được định rõ thông qua
biến ExpandedKey, thì thuật toán Rijndael có thể được mô tả gọn hơn bởi đoạn m
ã sau đây:
Rijndael(State,ExpandedKey)
{
AddRoundKey(State,ExpandedKey);
For( i=1; i<Nr ; i++) Round(State,ExpandedKey+Nb*i);
FinalRound(State,ExpandedKey + Nb*Nr);
}
Thuật toán giải mã
Ta biết rằng tất cả các phé
p biến đổi sử dụng trong quá trình lập lã đều là khả nghịch,
cho nên vấn đề giải mã không gặp khó khăn gì về nguyên tắc. Thêm nữa, các phép biến đổi
nghịch đảo cũng có bản chất tương tự các phép biến đổi gốc (chỉ khác nhau về tham số),
cho nên tốc độ lập mã và giải mã là tương đương nhau.

19
Thông thường, nghịch đảo của phép biến đổi vòng sẽ là một dãy các phép biến đổi
ngược của các phép biến đổi trong vòng, theo thứ tự ngược với thú tự đã thực hiện trong
phép lập mã. Theo đó, trong quá nghịch đảo, phép biến đổi phi tuyến ByteSub sẽ phải thực
hiện sau cùng, và phép dịch hàng phải thực hiện sau phép trộn cột. Như vậy, nếu triển khai

thuật toán theo hình thức "bảng tra" (table-lookup) thì phép giải mã không c
ó được mô hình
bảng tra giống như phép lập mã. Đây là điều mà những người thiết kế không mong muốn.
Những người sáng lập ra Rijndael đã tạo ra cấu trúc khéo léo để, trong quá trình giải
mã, thứ tự thực hiện các phép biến đổi sẽ diễn ra giống như trong quá trình lập mã, còn bản
thân mỗi phép biến đổi thì được thay bằng nghịch
đảo của nó (với một sự thay đổi phù hợp
về quy trình sinh khoá). Đây là điều sẽ được làm sáng tỏ trong phần này.
Nghịch đảo của phương án Rijn
dael với 2 vòng
Đây là phương án rút gọn của thuật toán chỉ gồm có 2 vòng: một vòng thông thường và
một vòng kết thúc.
Nếu ký hiệu InvA là nghịch đảo của phép biến đổi A thì nghịch đảo của vòng thông
thường (trong ngôn ngữ "tựa C") là:
InvRound(State,RoundKey)
{
AddRoundKey(State,RoundKey);
InvMixColumn(State);
InvShiftRow(State);
InvByteSub(State);
}
và nghịch đảo của vòng kết thúc là:
InvFinalRound(State,RoundKey)
{
AddRoundKey(State,RoundKey);
InvShiftRow(State);
InvByteSub(State);
}
Nếu hợp lại (và không quên phé
p khởi tạo bằng việc cộng khoá) ta sẽ có nghịch đảo

của phương án Rijndael 2 vòng là:
AddRoundKey(State,ExpandedKey+2*Nb);
InvShiftRow(State);
InvByteSub(State);
AddRoundKey(State,ExpandedKey+Nb);
InvMixColumn(State);
InvShiftRow(State);
InvByteSub(State);
AddRoundKey(State,ExpandedKey);
Chú ý rằng phép thế byte (ByteSub)thực hiện biến đổi trên từng byte một cách độc
lập (không phụ thuộc vào vị trí của byte), còn phép dịch hàng (ShiftRow) không hề làm
thay đổi giá trị của byte. Cho nên 2 phép biến đổi này có thể hoán vị cho nhau mà không
làm ảnh hưởng đến quá trình biến đổi chung.


20
Ngoài ra, nếu đặt InvRoundKey = InvMixColumn(RoundKey) thì từ tính chất
tuyến tính của các phép biến đổi cộng khoá và trộn cột ta suy ra rằng có thể thay thế
AddRoundKey(State,RoundKey);
InvMixColumn(State);
bằng
InvMixColumn(State);
AddRoundKey(State,InvRoundKey);
Suy ra nghịch đảo của phương án Rijndael 2 vòng là tương đương với dãy các phép
biến đổi sau:
AddRoundKey(State,ExpandedKey+2*Nb);
InvByteSub(State);
InvShiftRow(State);
InvMixColumn(State);
AddRoundKey(State,I_ExpandedKey+Nb);

InvByteSub(State);
InvShiftRow(State);
AddRoundKey(State,ExpandedKey);
trong đó I_ExpandedKey là khoá của vòng giải mã, được tính bằng cách lấy
InveMixColumn của khoá vòng (Round Key) trong qui trình lập mã.
Như vậy, về mặt cấu trúc, phép nghịch đảo hoàn toàn tương tự như quá trình lập mã (có
phé
p khởi tạo bằng việc cộng khoá và 2 vòng: một vòng thông thường và một vòng kết
thúc). Khác biệt chỉ là ở chỗ từng phép toán được thay bằng nghịch đảo của nó (lưu ý rằng
phép cộng là tự khả nghịch).
Nghịch đảo của phương án Rijn
dael đầy đủ
Trước hết ta đưa ra qui trình mở rộng khoá trong phép giải mã (sẽ được mang tên là
I_KeyExpansion) bao gồm 2 việc sau đây:
1. Áp dụng thủ tục Key Expansion (đã nói ở phần trên).
2. Áp dụng phép toán InveMixColumn cho các Round Keys (trừ cái đầu tiên và
cái cuối cùng).
Trong ngôn ngữ "tựa C" thì qui trình này được mô tả bởi đoạn mã:
I_KeyExpansion(CipherKey,I_ExpandedKey
{
KeyExpansion(CipherKey,I_ExpandedeKey);
for( i=1, i<Nr, i++ )
InvMixColumn(I_ExpandedKey+Nb*i);
}
Nhận xét rằng mọi lập luận đưa ra cho phương phá
n Rijndael 2 vòng vẫn còn nguyên
hiệu lực cho phương án Rijndael tổng quát, cho nên nếu ta định nghĩa vòng và vòng kết thúc
cho quá trình giải mã là như sau (trong ngôn ngữ "giả C"):
I_Round(State,I_Round)
{


21
InvByteSub(State);
InvShiftRow(State);
InvMixColumn(State);
AddRoundKey(State,I_RoundKey);
}

I_FinalRound(State,I_RoundKey)
{
InvByteSub(State);
InvShiftRow(State);
AddRoundKey(State,RoundKey0);
}
thì thuật toán giải mã đối với Rijndael tổng quát có thể mô tả như sau (trong ngôn ngữ "giả
C"):
I_Rijndael(State,CipherKey)
{
I_KeyExpansion(CipherKey,I_ExpandedKey);
AddRoundKey(State,I_ExpandedKey+ Nb*Nr);
For(i=Nr-1;i>0;i ) I_Round(State,I_ExpandedKey+Nb*i);
I_FinalRound(State,I_ExpandedKey);
}
Như vậy, thuật toán giải mã cũng có cấu trúc tương tự như thuật toán lập mã (nhưng khác
nhau ở từng phép biến đổi cụ thể).
Nhận x
ét: Mặc dù các tính toán trong quá trình lập mã không thể "tự động" áp dụng được
cho quá trình giải mã, nhưng các nhận xét nêu trên có thể giúp ta khai thác được khá nhiều
kết quả tính toán lập mã vào việc giải mã.



×