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

NGHIÊN cứu cải TIẾN THUẬT TOÁN CHUẨN mã hóa TIÊN TIẾN (AES) với MA TRẬN MDS KÍCH THƯỚC lớ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 (1.03 MB, 56 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ GTVT
KHOA CÔNG NGHỆ THÔNG TIN

Nguyễn Thị Nhạn

NGHIÊN CỨU CẢI TIẾN THUẬT TOÁN
CHUẨN MÃ HÓA TIÊN TIẾN (AES) VỚI MA TRẬN
MDS KÍCH THƯỚC LỚN

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Hệ Thống Thông Tin

Hà Nội - 2019


TRƯỜNG ĐẠI HỌC CÔNG NGHỆ GTVT
KHOA CÔNG NGHỆ THÔNG TIN

Nguyễn Thị Nhạn

NGHIÊN CỨU CẢI TIẾN THUẬT TOÁN
CHUẨN MÃ HÓA TIÊN TIẾN (AES) VỚI MA TRẬN
MDS KÍCH THƯỚC LỚN

ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Hệ Thống Thông Tin

Cán bộ hướng dẫn: TS.Hoàng Đức Thọ

Hà Nội - 2019



TÓM TẮT
Ngày nay, thuật toán chuẩn mật mã nâng cao AES đang được sử dụng phổ biến
trong các lĩnh vực khác nhau trên thế giới. Chuẩn mật mã nâng cao không chỉ đơn thuần
là mã hóa và giải mã thông tin mà còn bao gồm nhiều vấn đề khác nhau cần được nghiên
cứu và giải quyết các vấn đề về việc cải tiến tốc độ xử lý thuật toán của mã khối đặc biệt
là khi sử dụng mã khối AES cải tiến với ma trận MDS kích thước lớn nhằm rút ngắn thời
gian thực thi thuật toán mã khối AES. Vì thế việc nghiên cứu giải pháp thực thi hiệu quả
chuẩn mã khối AES cải tiến với ma trận MDS kích thước lớn là rất cần thiết.
Hà Nội, ngày

tháng

năm

Sinh viên thực hiện

Nguyễn Thị Nhạn


LỜI CÁM ƠN
Em xin chân thành cảm ơn thầy Hoàng Đức Thọ, giảng viên học viện Kỹ thuật mật
mã, người đã trực tiếp hướng dẫn, giúp đỡ em trong suốt quá trình thực hiện.
Em xin chân thành cảm ơn ban giám hiệu nhà trường, các thầy cô trong Khoa
Công nghệ Thông tin và các phòng ban nhà trường đã tạo điều kiện tốt nhất cho em cũng
như các bạn khác trong suốt thời gian học tập và làm đồ án tốt nghiệp.
Sự hiểu biết của em về đề tài này còn chưa sâu sắc nên chắc chắn sẽ có nhiều sai
sót, em rất mong nhận được ý kiến đóng góp của thầy,cô và các bạn để em có thêm kinh
nghiệm, tiếp tục hoàn thiện đề tài.
Em xin chân thành cảm ơn!

Hà Nội, ngày

tháng năm

Sinh viên thực hiện

Nguyễn Thị Nhạn


LỜI CAM ĐOAN
Em xin cam đoan đồ án tốt nghiệp là thành quả từ sự nghiên cứu hoàn toàn thực tế
trên cơ sở các số liệu thực tế và được thực hiện theo hướng dẫn của giáo viên hướng dẫn.
Đồ án được thực hiện hoàn toàn mới, là thành quả của riêng em, không sao chép theo bất
cứ đồ án tương tự nào. Mọi sự tham khảo sử dụng trong đồ án đều được trích dẫn các
nguồn tài liệu trong báo cáo và danh mục tài liệu tham khảo. Mọi sao chép không hợp lệ,
vi phạm quy chế của nhà trường, em xin hoàn toàn chịu trách nhiệm.
Hà Nội, ngày

tháng

năm

Sinh viên

Nguyễn Thị Nhạn


MỤC LỤC

DANH MỤC BẢNG BIỂU



DANH MỤC HÌNH ẢNH
Hình 3.1: Giao diện download Visual Studio 2019…………………..………….....32
Hình 3.2: File download hiển thị trong thư mục sau khi tải thành công
Hình 3.3:Tiến hành chạy file
Hình 3.4: Màn hình hiển thị sau khi chạy file thành công
Hình 3.5: Tiến hành cài đặt
Hình 3.6: Giao diện Visual Studio sau khi cài đặt thành công
Hình 3.7: Màn hình hiển thị Visual Studio 2019
Hình 3.8: Màn hình tạo Project mới
Hình 3.9: Màn hình Project sau khi được tạo mới
Hình 3.10: Sơ đồ phân rã chức năng của chương trình
Hình 3.11: Phép nhân thông thường đối với AES gốc
Hình 3.12: Phép nhân thông thường đối với ma trận MDS 8x8
Hình 3.13: Tạo bảng nhân đối với ma trận MDS 8x8


DANH MỤC VIẾT TẮT
Từ
viết
tắt
AES
DES
MD
S
SBOX
SPN

Viết đầy đủ


Nghĩa đầy đủ

Advanced Encryption Standard
Data Encryption Standard
Maximum Distance Separable

Chuẩn mã hóa tiên tiến
Chuẩn mã hóa dữ liệu AES
Mã tách có khoảng cách cực đại

Substitution Box

Hộp thay thế

Substitution Permutation Networs

Mạng thay thế hoán vị


DANH MỤC KHÁI NIỆM VÀ KÝ HIỆU
Các khái niệm và định nghĩa được sử dụng để trình bày về chuẩn mã hoá cao cấp:
AES
Biến đổi Affine
Bit
Block
Byte
Cipher
Cipher Key
Ciphertext

Inverse Cipher
Thủ tục sinh khóa
(Key Expansion)
Round Key
Trạng thái (State)
S-box
Word

Chuẩn mã hoá cao cấp
Phép biến đổi bao gồm một phép nhân với một ma trận
sau đó là một phép cộng của một vectơ
Một số nhị phân nhận giá trị 0 hoặc 1
Một dãy các bit nhị phân tạo thành input, output, trạng
thái (state) và các khóa sử dụng tại các vòng lặp (Round
Key) của hệ mã. Độ dài của dãy (khối) là số lượng các bit
mà nó chứa. Các khối cũng có thể được xem là một dãy
các byte
Một nhóm 8 bit
Thuật toán mã hóa
Khóa của hệ mã, có thể đƣợc biểu diễn dướ dạng một
mảng 2 chiều gồm 4 hàng và Nk cột
Bản mã
Thuật toán giải mã
Thủ tục được sử dụng để sinh ra các khóa sử dụng tại các
vòng lặp của thuật toán mã hóa, giải mã từ khóa chính ban
đầu
Là các giá trị sinh ra từ khóa chính bằng cách sử dụng thủ
tục sinh khóa. Các khóa này được sử dụng tại các vòng
lặp của thuật toán
Các giá trị mã hóa trung gian có thể biểu diễn dưới dạng

một mảng 2 chiều gồm 4 hàng và Nb cột
Một bảng thế phi tuyến được sử dụng trong thủ tục sinh
khóa và trong các biến đổi thay thế các byte để thực hiện
các thay thế 1-1 đối với một giá trị 1 byte
Một nhóm 32 bit có thể được xem như 1 đơn vị tính toán
độc lập hoặc là một mảng 4 byte


CHƯƠNG 1: TỔNG QUAN VỀ MÃ KHỐI AES

1.1. Giới thiệu chung về AES
Chuẩn mã hóa dữ liệu cao cấp AES là một hệ mã khóa bí mật có tên là Rijndael (Do
hai nhà mật mã học người Bỉ là Joan Daemen và Vincent Rijmen đưa ra và trở thành
chuẩn từ năm 2002) 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ã Rijndael được thiết kế để có thể làm việc
với các khóa và các khối dữ liệu có độ dài lớn hơn tuy nhiên khi được chọn là một chuẩn
do Ủy ban tiêu chuẩn của Hoa Kỳ đưa ra vào năm 2001, nó được qui định chỉ làm việc
với các 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.2. Khái niệm
1.2.1. Input và Out put
Input và Output của chuẩn mã hóa cao cấp đề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. Chuẩn mã hóa dữ liệu cao cấp
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ở của nó cho phép điều này).
Đầu vào và đầu ra của AES được xem như là các mảng một chiều của các byte 8 bit.
Đối với phép mã, đầu vào là khối rõ, khóa và đầu ra là bản mã. Đối với phép giải mã, đầu
vào là bản mã, khóa và đầu ra là khối rõ

Các bit của input, output và khóa của hệ mã được đánh số từ 0.
1.2.2. Đơn vị Byte
Byte là một dãy 8 bit được biểu diễn dưới dạng các bit nhị phân theo thứ tự {b7, b6,
b5, b4, b3, b2, b1, b0} hoặc biểu diễn trên trường hữu hạn bằng đa thức hoặc bằng 2 ký tự
trong hệ Hexa.
Một byte là phần tử của được xem như là một đa thức có bậc nhỏ hơn hay bằng 8
với các hệ số trong trường hữu hạn của đa thức:
=

10


Các mảng byte được biểu diễn theo dạng sau: a0 a1 a2 … an-1 (với n=16, 24 hay 32
tùy thuộc vào độ dài của dữ liệu đầu vào là 128 bit, 192 bit và 256 bit).
1.2.3. Mảng trạng thái
Mảng trạng thái là một mảng hai chiều gồm 4 hàng, Nb cột, ký hiệu là s đượ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ã hoá hay giải mã là việc sao chép mảng các byte in 0, in1, in2, …,
in15 đầu vào mảng trạng thái s theo công thức sau:
s[r,c]= in[r+4c], v_i 0 ≤ r, c ≤ 4
Vào cuối quá trình mã hoá hay giải mã, mảng trạng thái sẽ được sao chép vào mảng
byte đầu ra theo công thức: out0, out1, out2, …, out15
Bốn byte trên mỗi cột của mảng trạng thái được tạo thành một từ 32 bit là một mảng
gồm 4 byte được đánh chỉ mục theo hàng r. Từ đó ta có thể coi mảng trạng thái là một
mảng một chiều gồm các từ w0, w1, w2, w3, trong đó các giá trị cột c dùng làm chỉ mục
cho bảng.
1.3. Cơ sở toán học
Hai phép cộng và phép nhân trên trường Galoris GF (2 8) là cở sở toán học của thuật
toán AES. Chúng ta sử dụng biểu diễn đa thức của GF(2 8) được định nghĩa sau đây: một
byte (là phần tử của GF(2 8)) được xem là một đa thức có bậc nhỏ hơn hay bằng với các

hệ số trong trường hữu hạn GF(2):
Tập tất cả các giá trị byte có thể tương ứng với tập tất cả các đa thức bậc nhỏ hơn 8.
Chú ý rằng các giá trị byte ở đây được ghi dưới dạng hexa, cho nên 57 tương ứng với
01010111 và đa thức tương ứng là:
1.3.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à
Ví dụ: Tổng các đa thức được ký hiệu bởi 57 và 83 là một đa thức được kí hiệu bằng
D4, đó là do:

11


= + + (1⊕1) x + (1⊕1)
=+
Trong biểu diễn nhị phân ta có:01010111 # 10000011 = 11010100. Rõ ràng, phép
cộng có thể được cài đặt bằng lệnh bitwise XOR.
1.3.2. Phép nhân
Phép nhân trên trường GF(28), ký hiệu là ⊗ 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 + x4 + x3 + x + 1 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 1 byte.
Ví dụ, tích của hai phần tử được ký hiệu bởi 57 và 83 là phần tử C1:

= (+ + ) ⊕ () ⊕ ()

=+ +
= ++ 1 (mod + )

1.3.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 b7=1. Thao tác được ký hiệu là xtime(). Phép nhân với các luỹ 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ả 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.
1.3.4. Phép nhân nghịch đảo
Phần tử ngược cho phép nhân có thể tìm được bằng thuật toán Euclidean mở rộng.
Giả sử a(x) là đa thức mà chúng ta muốn tìm nghịch đảo của nó. Thuật toán Euclidean mở
rộng có thể được sử dụng để tìm hai đa thức b(x) và c(x) sao cho:
a(x) b(x) + m(x) c(x) = gcd(a(x), m(x))
gcd(a(x), m(x) luôn bằng 1 khi và chỉ khi m(x) là bất khả qui. Do đó:
12


a(x) b(x) = 1(mod m(x)),
điều này có nghĩa rằng b(x) là phần tử ngược của a(x) theo định nghĩa của phép nhân.
1.3.5. Đa thức với các hệ số trên trường GF(28)
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) = d3x3 + d2x2 + d1x + d0
trong đó:
d0 = (a0 • b0 ) ⊕ (a3 • b1) ⊕ (a2 • b2) ⊕ (a1 • b3)
d1 = (a1 • b0 ) ⊕ (a0 • b1) ⊕ (a3 • b2) ⊕ (a2 • b3)
d2 = (a2 • b0 ) ⊕ (a1 • b1) ⊕ (a0 • b2) ⊕ (a3 • b3)
d3 = (a3 • b0 ) ⊕ (a2 • b1) ⊕ (a1 • b2) ⊕ (01 • b3)
1.4. Cấu trúc AES
AES là một mã khối, nhưng khác với các mã khối khác được biết đến trước đây
(DES, IDEA,…), dữ liệu trong AES không được biểu diễn dưới dạng một mảng các byte
hay các bit mà được biểu diễn dưới dạng một ma trận 4xNb và được gọi là mảng trạng thái

(state). Trong đó, đối với AES, Nb luôn có giá trị bằng 4. Trong khi thuật toán Rijndael hỗ
trợ ba giá trị của Nb là 4, 6, 8 tương ứng với kích thước khối 128, 192 và 256 bit. Dữ liệu
đầu vào được đọc vào ma trận state theo từng cột, theo thứ tự từ trên xuống dưới, từ trái
qua phải. Dữ liệu đầu ra được đọc từ ma trận cũng theo quy tắc trên.

13


Hình 1.1: Cấu trúc cơ sở của thuật toán AES
Trong đó:
Tầng phi tuyến: thể hiện tính xáo trộn, các byte được thế thông qua bản tra S-box.
Tầng trộn tuyến tính: đảm bảo khếch tán cao qua nhiều vòng. Tầng trộn tuyến tính
trong AES bào gồm 2 hàm con: ShiftRows và MixColumns.
Tầng cộng khóa: là phép XOR từng bit của RoundKey và trạng thái trung gian.
1.5. Phép biến đổi vòng, số các vòng
Khóa vòng trong AES cũng được biểu diễn hoàn toàn tương tự như cách biểu diễn
dữ liệu. Tuy nhiên, tùy vào kích thước khóa mà số cột của ma trận khóa vòng Nk sẽ khác
nhau. Cụ thể, Nk nhận các giá trị 4, 6, 8 tương ứng với các kích thước khóa là 128, 192 và
256 bit. Đây chính là điểm mạnh của thuật toán AES trong vấn đề mở rộng khóa.

14


Hình 1.2:Biểu diễn khóa vòng
Số vòng lặp ký hiệu là Nr, phụ thuộc vào hai đại lượng Nb và Nk. Vì Nb trong AES
có giá trị cố định nên Nr chỉ phụ thuộc vào Nk. Giá trị của Nr tương ứng với ba giá trị của
Nk là Nr = 10, 12, 14. Cụ thể, giá trị Nr được xác định bởi
Bảng 1.1: Xác định số vòng

1.6. Quy trình mã hóa AES

Bắt đầu thuật toán bản rõ (input) được copy vào mảng trạng thái sử dụng các qui
ước được mô tả trong phần 1.4. Sau khi cộng với khóa Round Key khởi tạo mảng trạng
thái được biến đổi bằng các thực hiện một hàm vòng (round function) Nr lần (10, 12, hoặc
14 phụ thuộc vào độ dài khóa) trong đó lần cuối cùng thực hiện khác 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 sử dụng một (key schedule) dãy các khóa được biểu
diễn như là một mảng 1 chiều của các word 4-byte được sinh ra từ thủ tục sinh khóa (Key
Expansion).
Thuật toán AES khá phức tạp, được mô tả khái quát gồm 3 bước như sau:
+) 1 Vòng khởi tạo chỉ gồm phép AddRoundKey
+) Nr -1 Vòng lặp gồm 4 phép biển đổi lần lượt: SubBytes, ShiftRows,
MixColumns, AddRoundKey.
+) 1 Vòng cuối gồm các phép biến đổi giống vòng lặp và không có phép
MixColumns.

15


Quy trình được mô tả qua đoạn giả mã sau:
void Cipher(unsigned char state[4][4] {
int i,j,round=0;
AddRoundKey(state, 0);
for(round=1;roundSubBytes(state);
ShiftRows(state);
MixColumns(state);
AddRoundKey(state, round);
}
SubBytes(state);
ShiftRows(state);

AddRoundKey(state,Nr);
}
1.6.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:
+) Nhân nghịch đảo trên trường hữu hạn GF (2 8), phần tử {00} được ánh xa ̣thành
chính nó
+) Áp dụng biến đổi Affine sau (trên GF(2)):
b’I = bi ⊕ b(i+4) mod 8 ⊕ b(i+5) mod 8 ⊕ b(i+6) mod 8 ⊕ b(i+7) mod 8 ⊕ ci trong đó 0 <= I < 8 là bit thứ i
của byte b tương ứng và ci là bit thứ i của byte c với giá trị {63} hay {01100011}.
Các phần tử biến đổi affine của S-box có thể được biểu diễn dưới dạng ma trận như
sau:

16


Trong đó phép cộng thực hiện như phép XOR.
Hình sau 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:

Hình 1.3:Hình minh họa biến đổi SubBytes với mảng trạng thái
Bảng thế S -box được sử dụng trong hàm SubBytes () có thể được biểu diễn dưới
dạng hexa như sau:

17


Bảng 1.2: Bảng thể S-BOX của AES


Trong đó chẳng hạn nếu S1,1 = {53} có nghĩa là giá trị thay thế sẽ được xác định
bằng giao của hàng có chỉ số 5 với cột có chỉ số 3 trong bảng trên điều này tương đương
với việc S’ 1,1 = {ed}.
1.6.2. Hàm ShiftRows()
Phép biến đổi ShiffRows: các hàng được dịch vòng một số bước nhất định. Đối với
mã khối AES:
+) Dòng thứ nhất được giữ nguyên.
+) Dòng thứ 2 dịch vòng trái 1 vị trí(1 byte).
+) Dòng thứ 3 dịch vòng trái 2 vị trí.
+) Dòng thứ 4 dịch vòng trái 3 vị trí.

18


Hình 1.4:Phép biến đổi ShifftRows()
1.6.3. Hàm MixColumns()
Hàm này làm việc trên các cột của bả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
(28) và được nhân theo modulo x4 + 1 với một đa thức cố định a(x):
a(x) = {03}x3 + {01}x2 + {01}x + {02}
Biểu diễn dưới ma trận ta sẽ có:
S’(x) = a(x) ⊗ S(x)

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}● S0,c ) ⊕ ( {03} ● S1,c ⊕ S2,c ⊕ S3,c
19


S’1,c = S0,c ⊕ ( {02}● S1,c ) ⊕ ( {03} ● S2,c ) ⊕ S3,c

S’2,c = S0,c ⊕ S1,c ⊕ ( {02}● S2,c ) ⊕ ( {03} ● S3,c )
S’3,c = ( {03}● S0,c ) ⊕ S1,c ⊕ S2,c ⊕ ( {02} ● S3,c )
Có thể minh họa việc thực hiện của hàm này bằng hình vẽ sau:

Hình 1.5: Hàm MixColumns của AES
1.6.4. Hàm AddRoundKey()
Hàm này được áp dụng từ vòng lặp thứ 1 tới vòng lặp
Trong biến đổi Addroundkey(), một khóa vòng được cộng với trạng thái bằng một
phép XOR theo từng bit đơn giản.
Mỗi khóa vòng gồm có 4 từ (128 bit) được ký hiệu ExpendedKey. 4 từ đó được cộng
vào mỗi cột của trạng thái. Phép biến đổi AddRoundKey được minh họa như sau:

20


S0,0
S1.0
S2,0
S3,0

S0,1
S1,1
S2,1
S3,1

S0,2
S1,2
S2,2
S3,2


S0,3
S1,3
S2,3
S3,3

k0,0
k1.0
k2,0
k3,0

k0,1
k1,1
k2,1
k3,1

k0,2
k1,2
k2,2
k3,2

k0,3
k1,3
k2,3
k3,3

S’0,0
S’1.0
S’2,0
S’3,0


S’0,1
S’1,1
S’2,1
S’3,1

S’0,2
S’1,2
S’2,2
S’3,2

S’0,3
S’1,3
S’2,3
S’3,3



=

1.6.5. Thuật toán sinh khoá (Key Expansion)
Thuật toán sinh khóa củ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 một lần lặp trong số
Nr lần sẽ cần tới Nb word của dữ liệu khóa . Dãy khóa kết quả là một mảng tuyến tính các
word 4-byte được ký hiệu là [wi] trong đó 0 ≤i < Nb(Nr+1).
Sự mở rộng khóa thành dãy khóa được mô tả qua đoạn giả mã sau:
KeyExpansion(byte key[4*Nk], 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])
i = i+1
end while
i = Nk
while (i < Nb * (Nr+1))
temp = w[i-1]
If (i mod Nk = 0)
21


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à một 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, a1, a2, a3] thực
hiện một hoán vị vòng và trả về [a 1, a2, a3, a0]. 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(28) và i bắt đầu từ 1).
Theo đoạn giả mã trên 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ới 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()).
Chú ý là thủ tục mở rộng khóa đối với các khóa có độ dài 256 hơi khác so với thủ
tục cho các khóa có độ dài 128 hoặc 192. Nếu Nk = 8 và i – 4 là một 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.
1.7. Quy trình giải mã
Thuật toán giải mã khá giống với thuật toán 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 trong thuật toán giải mã. Đoạn giả mã cho thuật toán
giải mã như sau:
void InvCipher(unsigned char state[4][4])
{
int i,j,round=0;
AddRoundKey(state,Nr);
for(round=Nr-1;round>0;round--) {

22


InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(state,round);
InvMixColumns(state);
}
InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(state,0);
}

1.7.1. Hàm InvSubytes()
Phép biến đổi ngược InvSubBytes: là phép thay thế biến đổi ngược với SubBytes.
Là một phép thay thế byte, các byte thay thế được thực hiện bằng cách tra bảng thay thế

ngược InvS-box. Việc xây dựng hộp InvS-box cũng giống như xây dựng S-box tại bước 1
và bước 2. Tại bước 3, InvS-box thực hiện phép thay thế sau:

Với là bit thứ i của số {05}.

Bảng sau trình bày bảng thay thế ngược InvS-box sau khi tính toán:
Bảng 1.3: Bảng thế dùng trong hàm InvSubytes()

23


1.7.2. Hàm InvShiftRows()
Hàm này là hàm ngược của hàm ShiftRows, thực hiện ngược lại với hàm ShiftRows:
+) Dòng thứ nhất giữ nguyên
+) Dòng thứ 2 dịch vòng phải 1 vị trí.
+) Dòng thứ 3 dịch vòng phải 2 vị trí.
+) Dòng thứ 4 dịch vòng phải 3 vị trí.

24


Hình 1.6:Quá trình thực hiện InvShiftRows của AES
1.7.3. Hàm InvMixColumns()
Hàm này là hàm ngược của hàm MixColumns (). Hàm làm việc trên các cột của
mảng trạng thái , coi mỗi cột như là một đa thức 4 hạng tử. Các cột được xem là các đa
thức trên GF (28) và được nhân theo modulo x4 +1 với một đa thức cố đinh là a-1(x):
a-1(x) = {0b}x3 + {0d}x2 + {09}x + {0e}
Trạng thái ngược s’(x) được viết dưới dạng tích hai đa thức:
S’(x) = a-1(x) ⊗ S(x):


Trong đó 0≤ c < Nb.

25


×