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

Tiểu luận LẬP TRÌNH SYMBOLIC CẤU TRÚC CỦA HỆ THỐNG 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 (425.67 KB, 24 trang )

LỜI CẢM ƠN
MỤC LỤC
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
1
LỜI CẢM ƠN
LỜI CẢM ƠN
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
2
Đầu tiên em xin gởi lời cảm ơn chân thành đến thầy Đỗ Văn Nhơn – Giảng viên cao
học trường đại học Công nghệ thông tin tp. Hồ Chí Minh đã tận tình giảng dạy, hướng
dẫn em trong suốt môn học.
Em xin chân thành cám ơn quý Thầy Cô trong khoa Khoa học máy tính, phòng đào
tạo sau đại học, trường đại học Công nghệ thông tin – đại học Quốc gia Tp. Hồ Chí
Minh đã tận tình giảng dạy, hướng dẫn, giúp đỡ và tạo điều kiện cho em thực hiện tiểu
luận này.
Mặc dù rất cố gắng, song tiểu luận vẫn còn nhiều thiếu sót. Em mong nhận được nhiều
sự thông cảm và góp ý của thầy để em có thể hoàn thiện khả năng của em hơn nữa.
Xin chân thành gửi lời cám ơn sâu sắc đến quý thầy
Xin chân thành cảm ơn!
LỜI CẢM ƠN
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG
DẪN




















Ngày……Tháng……Năm……
Giáo viên hướng dẫn
TS. Đỗ Văn Nhơn
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
3
LỜI CẢM ƠN
PHẦN I - TỔNG QUAN
Lĩnh vực bảo mật nói chung cũng như lĩnh vực mã hóa nói riêng hiện nay là một
lĩnh vực quan trọng trong sự phát triển của công nghệ máy tính. Bởi vì càng nhiều
công nghệ xuất hiện, càng nhiều mối quan hệ đối tác, làm ăn, giao dịch được thiết lập
từ xa, càng nhiều dữ liệu được đưa vào lưu trữ trên máy tính và đưa ra sử dụng trên
các mạng công cộng thì mức độ bảo mật càng được yêu cầu cao hơn.
Bài thu hoạch tập trung vào ứng dụng phần mềm toán học Maple – là phần mềm
tính toán kỹ thuật cho các nhà toán học, kỹ sư và nhà khoa học, đặc biệt phần mềm hỗ
trợ thêm các chức năng lập trình logic rất mạnh, rất phù hợp với một số bài toán đặt ra
hiện nay.
Bài thu hoạch này đề cập đến thuật toán AES, là một thuật toán đã ra đời hơn 10
năm trước nhưng cho đến nay vẫn được công nhận là một thuật toán an toàn, được sử
dụng trong nghành ngân hàng và chính phủ Mỹ, được công nhận bởi cục tiêu chuẩn
Hoa Kỳ NIST về việc bảo vệ tài liệu mật (AES 128 bit) và tài liệu tuyệt mật (AES 192

bit và AES 256 bit).
Trong bài thu hoạch này, em tập trung vào nghiên cứu thuật toán AES và tìm
cách cài đặt thuật toán bằng ngôn ngữ của maple. Có thể cách cài đặt này chưa phải là
tốt nhất do có thể đã có các thư viện hoặc sử dụng bằng ngôn ngữ lập trình thuần túy
sẽ tốt hơn. Tuy nhiên hi vọng qua bài thu hoạch này sẽ giúp em phần nào hiểu rõ được
thêm cách sử dụng của phần mềm.
Do phần mềm maple đã quá thông dụng, việc nói lại những cách sử dụng cơ bản
của phần mềm là không cần thiết và cũng bởi các cấu trúc, cú pháp để lập trình trong
phần mềm rất đa dạng và phức tạp đồng thời cũng đã có sẵn rất nhiều hướng dẫn sử
dụng rất đơn giản. Do đó trong bài thu hoạch em chỉ giới thiệu sơ lược về thuật toán
maple, phần còn lại nói về thuật toán AES và cách cài đặt.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
4
LỜI CẢM ƠN
PHẦN I - PHẦN MỀM MAPLE
1 Phần mềm Maple
Maple là một gói phần mềm toán học thương mại phục vụ cho nhiều mục đích.
Nó phát triển lần đầu tiên vào năm 1980 bởi Nhóm Tính toán Hình thức tại Đại học
Waterloo ở Waterloo, Ontario, Canada.
Từ năm 1988, nó đã được phát triển và thương mại hóa bởi Waterloo Maple Inc.
(còn được biết đến với tên gọi Maplesoft), một công ty Canada cũng có trụ sở tại
Waterloo, Ontario. Phiên bản hiện tại là Maple 13 được phát hành vào tháng 5 năm
2009. Đối thủ cạnh tranh chính của nó là Mathematica.
Người dùng có thể nhập biểu thức toán học theo các ký hiệu toán học truyền
thống. Có thể dễ dàng tạo ra những giao diện người dùng tùy chọn. Maple hỗ trợ cho
cả tính toán số và tính toán hình thức, cũng như hiển thị. Nhiều phép tính số học được
thực hiện dựa trên thư viện số học NAG; trong Maple, các chương trình con NAG đã
được mở rộng để cho phép độ chính xác ngẫu nhiên lớn. Các ví dụ về tính toán hình
thức sẽ được trình bày trong phần sau.
Maple cũng có một ngôn ngữ lập trình cấp cao đầy đủ. Cũng có giao diện cho

những ngôn ngữ khác (C, Fortran, Java, MatLab, và Visual Basic). Cũng có một giao
diện dành cho Excel.
Phần lớn chức năng toán học của Maple được viết bằng ngôn ngữ Maple, và
được thông dịch bởi nhân Maple. Nhân Maple được viết bằng C. Maple chạy trên tất
cả các hệ điều hành chính.
Ngôn ngữ lập trình Maple là một ngôn ngữ kiểu động. Cũng giống như các hệ
thống đại số máy tính, các biểu thức hình thức được lưu trữ trong bộ nhớ theo đồ thị
không chu trình có hướng (DAG). Ngôn ngữ cho phép các biến có phạm vi nhất định
(lexical scoping). Ngôn ngữ có hình thức lập trình hàm, nhưng cũng có hỗ trợ đầy đủ
cho lập trình truyền thống, theo kiểu mệnh lệnh.
Tên "Maple" không phải là tên viết tắt hoặc từ cấu tạo bằng chữ đầu, mà chỉ đơn
giản là để chỉ hình tượng Lá phong (tiếng Anh: maple) trên Quốc kỳ Canada.
2 Một số tính năng vượt trội của maple
Thông qua thực tiễn sử dụng, cộng đồng người dùng maple đã chỉ ra những ưu
điểm vượt trội của maple so với những phần mềm tương tự (Mathematica, Geogebra
4…) như sau (ưu điểm tập hợp trên bản maple 15):
- Là một phần mềm toán học cao cấp, có thể giải quyết một số vấn đề của Toán
học.
- Rất nhiều chức năng và được cập nhật liên tục, mỗi phiên bản đều có những cái
mới của nó và nhà sản xuất không ngừng phát triển khả năng tính toán của nó.
- Hoạt động mạnh mẽ trên nền java.
- Tính toán nhanh, chính xác với những số lên tới 20.00.000 chữ số.
- Hiển thị như sách giáo khoa (trực quan, dễ hiểu cho người dùng không chuyên).
- Cài đặt dễ dàng (thông qua setup wizard, rất đơn giản, không phải cấu hình các
biến, tham số…).
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
5
LỜI CẢM ƠN
- Có thể vẽ đồ thị, tính toán ngay cả trên đồ thị.
- Vẽ được đồ thị 3D, xoay hình, kiểm tra dễ dàng.

- Giải phương trình, Hệ phương trình nhanh chóng, gần chính xác.
- Phân tích thành nhân tử, biến đổi biểu thức, rút gọn nhanh chóng, khai triển,
tính thương, dư của đa thức,
- Kiểm tra số nguyên tố.
- Tìm chữ số thứ n.
- Kiểm tra số có bao nhiêu chữ số.
- Phân tích một số nguyên ra thừa số nguyên tố.
- Tính toán với số phức.
- Tính tổng nhanh chóng, thuận tiện, nhất là khi cần tính công thức tổng quát của
một biểu thức
- Các tính năng khác như lập trình, tạo file trình chiếu, mô hình vật lý…
- Hỗ trợ nhiều ngôn ngữ khác nhau. Đến phiên bản Maple 16 có sẵn tiếng Anh và
Nhật Bản, với phần mở rộng gói ngôn ngữ hỗ trợ tiếng Bồ Đào Nha Pháp, Trung
Quốc, Tây Ban Nha, Hàn Quốc, Hy Lạp, Hungary và Brazil.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
6
LỜI CẢM ƠN
PHẦN II - HỆ THỐNG MÃ HÓA AES
1 Mã hóa khối
Thuật toán mã hóa AES là một hệ thống mã hóa chung chia ra làm nhiều
thuật toán mã hóa con khác nhau như AES 128 bit, AES 192 bit… tùy vào độ
lớn của khóa, khi độ lớn của khóa thay đổi thuật toán cũng có một số thay đổi
nhất định nhưng không ảnh hưởng nhiều đến cấu trúc của thuật toán.
Thuật toán mã hóa AES lại là một nhánh của lĩnh vực mã hóa khối – lĩnh
vực mà các khóa và các dữ liệu đầu vào được để dưới dạng khối dữ liệu thường
gọi là block mỗi phần tử của khối thường là một byte hoặc một số tùy theo yêu
cầu của bài toán và tính chất của thuật toán.
Lĩnh vực mã hóa khối lại là một nhánh của thuật toán mã hóa đối xứng-
dạng thuật toán mã hóa sử dụng một khóa bí mật duy nhất dùng cho cả hai bước
mã hóa và giải mã - khác với thuật toán mã hóa bất đối xứng dùng hai khóa có

liên hệ chặt chẽ với nhau để mã hóa và giải mã, khóa để mã hóa không cần giữ
bí mật.
Đơn giản hơn ta có thể xem xét sơ đồ sau:
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
7
LỜI CẢM ƠN
Nói rõ hơn, mã hóa khối là những thuật toán mã hóa đối xứng hoạt động
trên những khối thông tin có độ dài xác định (block) với những chuyển đổi xác
định. Chẳng hạn một thuật toán mã hóa khối có thể xử lý khối 128 bít đầu vào
và biến nó thành khối 128 bít ở đầu ra. Quá trình chuyển đổi còn sử dụng thêm
một tham số nữa: khóa bí mật để cá biệt hóa quá trình. Việc giải mã cũng diễn ra
tương tự: xử lý khối mã hóa 128 bít cùng với khóa để trả về khối 128 bít bản rõ
ban đầu.
Để mã hóa những văn bản có độ dài vượt quá độ dài của khối, người ta sử
dụng thuật toán theo một chế độ mã hóa khối nào đó.
Phân biệt với mã hóa khối là mã hóa dòng. Mã hóa dòng làm việc trên từng
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
8
LỜI CẢM ƠN
bít của dòng dữ liệu và quá trình biến đổi thay đổi theo quá trình mã hóa. Tuy
nhiên, sự phân biệt giữa 2 phương pháp nhiều khi không rõ ràng vì mã hóa khối
khi hoạt động theo một chế độ nào đó thì có tác dụng như một phương pháp mã
hóa dòng.
Thuật toán mã hóa khối ra đời sớm và có nhiều ảnh hưởng là thuật
toán DES (Data Encryption Standard - Tiêu chuẩn mã hóa dữ liệu) do công ty
IBM phát triển và được ban hành làm tiêu chuẩn năm 1977. Tiêu chuẩn thay thế
DES có tên là AES (Advanced Encryption Standard - Tiêu chuẩn mã hóa nâng
cao) được ban hành năm 2001.
2 Thuật toán mã hóa AES
AES (viết tắt của từ tiếng Anh: Advanced Encryption Standard, hay Tiêu chuẩn

mã hóa tiên tiến) là mộtthuật toán mã hóa khối được chính phủ Hoa kỳ áp dụng làm tiêu chuẩn
mã hóa. Giống như tiêu chuẩn tiền nhiệm DES, AES được kỳ vọng áp dụng trên phạm
vi thế giới và đã được nghiên cứu rất kỹ lưỡng. AES được chấp thuận làm tiêu chuẩn
liên bang bởiViện tiêu chuẩn và công nghệ quốc gia Hoa kỳ (NIST) sau một quá trình tiêu chuẩn
hóa kéo dài 5 năm.
Thuật toán được thiết kế bởi hai nhà mật mã học người Bỉ: Joan Daemen và Vincent
Rijmen. Thuật toán được đặt tên là "Rijndael" khi tham gia cuộc thi thiết kế AES.
Rijndael được phát âm là "Rhine dahl" theo phiên âm quốc tế.
Thuật toán được dựa trên bản thiết kế Square có trước đó của Daemen và Rijmen;
còn Square lại được thiết kế dựa trên Shark.
Khác với với DES sử dụng mạng Feistel, Rijndael sử dụng mạng thay thế-hoán vị. AES có
thể dễ dàng thực hiện với tốc độ cao bằng phần mềm hoặc phần cứng và không đòi hỏi
nhiều bộ nhớ. Do AES là một tiêu chuẩn mã hóa mới, nó đang được triển khai sử dụng
đại trà.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
9
LỜI CẢM ƠN
PHẦN III - CẤU TRÚC CỦA HỆ THỐNG MÃ HÓA AES
Một hệ thống mã hóa AES sẽ bao gồm các 4 thành phần chính ứng với bốn bước
biến đổi khác nhau. Bước mã hóa và giải mã cũng đều có các thành phần như nhau, và
có thứ tự biến đổi trái ngược với nhau. Trong phần này ta đề cập đến chủ yếu là quá
trình mã hóa, các lưu ý về quá trình giải mã sẽ được đề cập đến trong trong mục tương
ứng nếu có những lưu ý đặc biệt.
Hệ thống mã hóa AES hiện nay được chia ra thàng 3 cách hiện thực chính dựa
trên số bit của khóa:
- AES-128: sử dụng khóa có độ dài 128 bit
- AES-192: sử dụng khóa có độ dài 192 bit
- AES-256: sử dụng khóa có độ dài 256 bit
1 Hàm subbytes
1.1 S-Box

Trong ngành mã hóa, S-Box là một thành phần thuộc nhánh mã hóa đối
xứng. S-Box được dùng để thay thế, biến đổi dữ liệu cần mã hóa cho khác đi với
bản gốc. Trong mã hóa khối, S-Box được ứng dụng để làm giảm các mối quan
hệ giữa khóa (key) và dữ liệu cần mã hóa.
Thông thường, S-Box nhận vào một lượng n bit input và trả về một lượng
m bit output với m có thể không bằng n. Phương pháp biến đổi dựa vào một
bảng tra cứu gồm nhiều hàng, cột. Bảng tra cứu thông thường được sử dụng
bảng cố định, không thay đổi. Tuy nhiên có một vài thuật toán sẽ tự động tạo ra
S-Box dựa trên khóa để thay đổi với mỗi khóa khác nhau.
Hiện nay vẫn còn nhiều nhóm đang nghiên cứu làm cách nào để tạo ra một
S-Box tốt để có thể che dấu dữ liệu trước khi mã hóa.
1.2 Bước SubBytes
Các byte được thế thông qua bảng tra S-box. S-box này đa số được thiết kế cố
định cho thuật toán chỉ để trộn lẫn dữ liệu đầu vào với nhau đồng thời giúp ngăn ngừa
những dữ liệu vô tình không bị thay đổi khi mã hóa. Để cho dễ hiểu, ta có thể xem một
bảng S-box đơn giản theo ví dụ dưới đây:
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
10
LỜI CẢM ƠN
Do dữ liệu ví dụ của ta dùng block 256 bit (16 * 16) nên bảng giá trị này ta sẽ đổi
sang số thập lục phân (hex) cho dễ theo dõi.
Nếu ta quy định mỗi mảnh dữ liệu trong khối là 1 byte thì ta có thể áp dụng cách
tra bảng theo cách dùng 4 bit đầu của byte làm số hàng, 4 bit sau làm số cột để thay
thế. Trong lập trình ta chỉ đơn giản dùng vài phép dịch bit hoặc phép đồng dư module
để tính toán rất nhanh. Tuy nhiên trong ví dụ nếu ta dùng cách tính toán như trên máy
tính sẽ hơi khó suy luận. để cho đơn giản, ta sẽ chuyển hết các bit về số thập lục phân
cho tiện theo dõi bởi vì trùng hợp là nếu ta chuyển các giá trị byte về số thập lục phân
thì 4 bit đầu sẽ được thể hiện qua số hàng đơn vị, 4 bit sau sẽ được thể hiện qua số
hàng chục, riêng lẻ nhau rất thuận tiện cho việc tra cứu.
Theo như bảng ví dụ, nếu dữ liệu đầu vào của ta là 1 byte khi đổi sang hệ thập

lục phân thành 9b, ta sẽ tra vào hàng số 9, cột b trong bảng để lấy giá trị thay thế cho
byte này là 14. Tương tự nếu byte đầu vào có giá trị 255, chuyển sang hệ thập lục phân
là ff thì ta sẽ thay thế byte đó bằng 16.
Trong bước giải mã, ta có thể dùng cách tra ngược lại bảng giá trị để giải mã.
Tuy nhiên cách này phải duyệt lại toàn bộ S-box, rất tốn thời gian và bộ nhớ. Do đó để
cải thiện thuật toán, chúng ta sẽ xây dựng một S-box để tra ngược tạm gọi là inverse S-
box. Inverse S-box cho S-box trên sẽ như sau:
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
11
LỜI CẢM ƠN
Tương tự như khi mã hóa, khi giải mã ta cũng sẽ dùng 4 bit đầu làm giá trị hàng,
4 bit sau làm giá trị cột để thay thế.
Trong ví dụ ta cũng chuyển đổi giá trị cần giải mã về số thập lục phân rồi tra
trong bảng. Ví dụ nếu ta có byte có giá trị là 16 thì ta sẽ chuyển đổi giá trị của byte này
thành ff.
Trong bài thu hoạch, ta dung SBox và InvSBox được khai báo trong maple như
sau, để tiện việc tra cứu ta dung một SBox gồm một giá trị đầu vào và một giá trị đầu
ra để việc tra cứu tìm kết quả được nhanh chóng:
SBox:=table([
"01000010" = "00101100", "10101000" = "11000010",
"10110110" = "01001110", "00011010" = "10100010", "00111000"
= "00000111", "11011000" = "01100001", "00000101" =
"01101011", "00101111" = "00010101", "00110101" =
"10010110", "00111111" = "01110101", "10000010" =
"00010011", "00000110" = "01101111", "00100011" =
"00100110", "10010010" = "01001111", "11000000" =
"10111010", "11010000" = "01110000", "10111010" =
"11110100", "10010111" = "10001000", "10101011" =
"01100010", "11100110" = "10001110", "11101100" = "11001110",
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES

12
LỜI CẢM ƠN
"00011101" = "10100100", "00000000" = "01100011",
"10100010" = "00111010", "11000001" = "01111000", "00011001"
= "11010100", "01101110" = "10011111", "11101011" =
"11101001", "11101111" = "11011111", "00100111" = "11001100",
"11110100" = "10111111", "00000001" = "01111100", "00011011"
= "10101111", "01110111" = "11110101", "11010101" =
"00000011", "00010111" = "11110000", "00111100" = "11101011",
"10111011" = "11101010", "01000000" = "00001001", "11111011"
= "00001111", "01111001" = "10110110", "10110000" =
"11100111", "10100100" = "01001001", "11000010" =
"00100101", "11110111" = "01101000", "00110100" =
"00011000", "01011100" = "01001010", "00001101" =
"11010111", "00111110" = "10110010", "01010010" =
"00000000", "01001111" = "10000100", "11000101" =
"10100110", "11110110" = "01000010", "01110110" =
"00111000", "00100010" = "10010011", "00101011" =
"11110001", "11001000" = "11101000", "01010110" =
"10110001", "10101111" = "01111001", "11011010" = "01010111",
"11111010" = "00101101", "00101110" = "00110001", "11011001"
= "00110101", "11100000" = "11100001", "01101111" =
"10101000", "11100100" = "01101001", "01000101" =
"01101110", "00001000" = "00110000", "00000010" =
"01110111", "00011000" = "10101101", "00010100" =
"11111010", "01000001" = "10000011", "10101110" =
"11100100", "10100110" = "00100100", "01110000" =
"01010001", "01010100" = "00100000", "11100001" =
"11111000", "10111000" = "01101100", "00100110" = "11110111",
"10110011" = "01101101", "11000100" = "00011100", "11100111"

= "10010100", "11101010" = "10000111", "00001100" =
"11111110", "00110110" = "00000101", "01010000" =
"01010011", "11101000" = "10011011", "10001110" =
"00011001", "11001001" = "11011101", "11001011" = "00011111",
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
13
LỜI CẢM ƠN
"10111100" = "01100101", "00100100" = "00110110", "01011110"
= "01011000", "01001000" = "01010010", "10000011" =
"11101100", "11100101" = "11011001", "11011101" = "11000001",
"00010000" = "11001010", "01001101" = "11100011", "01111010"
= "11011010", "11010100" = "01001000", "00101100" =
"01110001", "01011011" = "00111001", "01011101" =
"01001100", "10011100" = "11011110", "01001110" = "00101111",
"11001110" = "10001011", "00011111" = "11000000", "00101010"
= "11100101", "11110000" = "10001100", "00110111" =
"10011010", "11101101" = "01010101", "11100011" =
"00010001", "10011011" = "00010100", "01010001" =
"11010001", "10100101" = "00000110", "01011111" =
"11001111", "01100001" = "11101111", "10001010" = "01111110",
"00101001" = "10100101", "00110000" = "00000100",
"01100111" = "10000101", "10101100" = "10010001",
"11010010" = "10110101", "00100000" = "10110111",
"10000101" = "10010111", "01101001" = "11111001", "00000100"
= "11110010", "10110100" = "10001101", "01100010" =
"10101010", "01101010" = "00000010", "01000111" =
"10100000", "00111001" = "00010010", "11010001" =
"00111110", "10010011" = "11011100", "10011101" = "01011110",
"01110101" = "10011101", "11001111" = "10001010", "00001011"
= "00101011", "01111111" = "11010010", "11010011" =

"01100110", "00011100" = "10011100", "11111110" = "10111011",
"00011110" = "01110010", "10000001" = "00001100", "10001011"
= "00111101", "00010110" = "01000111", "10010100" =
"00100010", "10110101" = "11010101", "01110011" =
"10001111", "11011111" = "10011110", "11111001" = "10011001",
"10101010" = "10101100", "10111101" = "01111010", "11000111"
= "11000110", "11110010" = "10001001", "01101000" =
"01000101", "10010000" = "01100000", "00110001" =
"11000111", "01011000" = "01101010", "10000000" =
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
14
LỜI CẢM ƠN
"11001101", "10000100" = "01011111", "10001111" = "01110011",
"10110111" = "10101001", "10011000" = "01000110", "01111101"
= "11111111", "10000111" = "00010111", "11110101" =
"11100110", "11000110" = "10110100", "10110010" =
"00110111", "01101011" = "01111111", "01111100" = "00010000",
"10110001" = "11001000", "00111011" = "11100010", "01000100"
= "00011011", "11111111" = "00010110", "01100110" =
"00110011", "01111110" = "11110011", "10100001" = "00110010",
"00101101" = "11011000", "01011010" = "10111110", "00111101"
= "00100111", "10101101" = "10010101", "10000110" =
"01000100", "00010010" = "11001001", "11110001" =
"10100001", "01101101" = "00111100", "10011010" =
"10111000", "01000110" = "01011010", "01001001" =
"00111011", "10100000" = "11100000", "11101110" =
"00101000", "11111101" = "01010100", "00001111" = "01110110",
"00111010" = "10000000", "11100010" = "10011000", "01110001"
= "10100011", "11111000" = "01000001", "11000011" =
"00101110", "00010101" = "01011001", "01010011" =

"11101101", "01110010" = "01000000", "10111110" = "10101110",
"00001110" = "10101011", "00010001" = "10000010",
"10001100" = "01100100", "01001010" = "11010110",
"10101001" = "11010011", "11001100" = "01001011",
"10001101" = "01011101", "11001010" = "01110100",
"10001001" = "10100111", "10010001" = "10000001",
"11011011" = "10111001", "00010011" = "01111101", "00100101"
= "00111111", "01100000" = "11010000", "01001100" =
"00101001", "10011111" = "11011011", "11101001" = "00011110",
"00001001" = "00000001", "00000111" = "11000101",
"01011001" = "11001011", "01111011" = "00100001", "10001000"
= "11000100", "10111111" = "00001000", "00101000" =
"00110100", "10100111" = "01011100", "10111001" =
"01010110", "00000011" = "01111011", "00110010" =
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
15
LỜI CẢM ƠN
"00100011", "01001011" = "10110011", "11110011" =
"00001101", "01010111" = "01011011", "11011100" =
"10000110", "10010101" = "00101010", "10010110" =
"10010000", "01100011" = "11111011", "01100101" =
"01001101", "11010111" = "00001110", "01110100" =
"10010010", "11001101" = "10111101", "01010101" =
"11111100", "01101100" = "01010000", "10100011" =
"00001010", "11111100" = "10110000", "10011110" =
"00001011", "11011110" = "00011101", "01111000" = "10111100",
"10011001" = "11101110", "01000011" = "00011010", "11010110"
= "11110110", "00001010" = "01100111", "00110011" =
"11000011", "01100100" = "01000011", "00100001" =
"11111101"]):

Tương tự ta cũng phải khai báo một SBox nghịch đảo để phục vụ cho việc tra
cứu khi giải mã:
SBox_Nghich_Dao := table([
"00000010" = "01101010", "01101001" = "11100100",
"01100000" = "10010000", "00001111" = "11111011",
"00010100" = "10011011", "00100000" = "01010100",
"01100111" = "00001010", "10010101" = "10101101",
.
.
.
"01001101" = "01100101", "01111111" = "01101011",
"00110111" = "10110010", "01001000" = "11010100",
"01101110" = "01000101", "01011011" = "01010111"]):
2 Bước ShiftRows
Trong bước này, các hàng được dịch vòng sang phải một số bước nhất định bằng
với số thứ tự của hàng.
Ví dụ:
- Hàng đầu tiên có số thứ tự là 0 sẽ không dịch chuyển.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
16
LỜI CẢM ƠN
- Hàng thứ 2 có số thứ tự là 1 sẽ bị dịch sang phải 1 byte. Byte cuối hàng sẽ được
đưa vào vị trí đầu hàng.
- Tương tự cho các hàng còn lại
Do vậy, mỗi cột khối đầu ra của bước này sẽ bao gồm các byte ở đủ cột và hàng
như khối đầu vào. Đối với các cách cài đặt với độ lớn khối khác nhau thì số vị trí dịch
chuyển cũng khác nhau.
Ta sẽ khai báo bước này trong phần mềm như sau:
ShiftRows := proc(byteMatrix)
local byteList, rotList:

byteList := convert(byteMatrix,listlist):
rotList :=zip(ListTools[Rotate],byteList,[0,1,2,3]):
convert(rotList, matrix);
end proc:
Tương tự ta cũng phải có hàm nghịch đảo của hàm shiftRow
ShiftRows_Nghich_Dao := proc(byteMatrix)
local byteList, rotList:
byteList := convert(byteMatrix,listlist):
rotList :=zip(ListTools[Rotate],byteList,[0,3,2,1]):
convert(rotList, matrix);
end proc:
3 Bước MixColumns
Bước này ta sẽ thay đổi giá trị của khối bằng cách trộn lẫn cách byte lại với nhau
bằng các phép tính trên trường hữu hạn.
Nếu ứng dụng vào khối 16 byte (4 * 4): bốn byte trong từng cột được kết hợp lại
theo một phép biến đổi tuyến tính khả nghịch. Mỗi khối 4 byte đầu vào sẽ cho một
khối 4 byte ở đầu ra với tính chất là mỗi byte ở đầu vào đều ảnh hưởng tới cả 4 byte
đầu ra.
Cách thường được áp dụng là nhân cột cần biến đổi với một ma trận khác để có
thể tạo ra một cột mới phụ thuộc hoàn toàn vào cột ban đầu.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
17
LỜI CẢM ƠN
Hai bước ShiftRows và MixColumns đã tạo ra tính chất khuyếch tán cho thuật
toán. Các giá trị của khối được trộn lẫn vào nhau và cho ra khối mã hóa, đảm báo tính
toàn vẹn và liên kết chặt chẽ trong dữ liệu, giảm thiểu khả năng bị tấn công theo
hướng phán đoán theo ngữ nghĩa.
Hàm MixColumns cơ bản sẽ được khai báo như sau:
MixColumns := proc(byteMatrix)
local product1, polyMatrix:

polyMatrix := map(bitToPoly, byteMatrix):
product1 := linalg[multiply](MixMat,polyMatrix):
map(x->polyToBits(sort(Rem(expand(x),genPoly,alpha) mod 2)),
product1);
end proc:
Tương tự ta cũng phải có hàm đảo của hàm MixColumns dùng cho việc giải mã:
MixColumns_Nghich_Dao := proc(byteMatrix)
local product1, polyMatrix:
polyMatrix := map(bitToPoly, byteMatrix):
product1 := linalg[multiply](InvMixMat,polyMatrix):
map(x->polyToBits(sort(Rem(expand(x),genPoly,alpha) mod 2)),
product1);
end proc:
4 Bước AddRoundKey
Tại bước này, khối dữ liệu được kết hợp với khóa con thông qua phép XOR.
Khóa con trong mỗi vòng lặp mã hóa luôn khác được tạo ra từ khóa chính bằng thuật
toán sinh khóa (Key Expansion). Mỗi khóa con có độ lớn giống như các khối. Quá
trình kết hợp được thực hiện bằng cách XOR từng bit của khóa con với khối dữ liệu.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
18
LỜI CẢM ƠN
Hàm addRoundKey được khai báo cơ bản như sau:
AddRoundKey := proc(byteMatrix, expandedKey, roundNum)
local roundKey:
roundKey := linalg[transpose]
(matrix([linalg[col](expandedKey, (roundNum *4+1) roundNum * 4 +
4)])):
zip(xor8,byteMatrix,roundKey);
end:
Hàm này là một hàm khá đặc biệt do khi cần giải mã ta chỉ cần chạy lại hàm này

một lần nữa là được. Không cần phải có hàm giải mã riêng cho nó. Do đó bước này
không cần thêm hàm InvAddRoundKey.
4.1 Thuật toán sinh khóa
Thuật toán sinh khóa nhận vào một khóa K và thực hiện sinh khóa để sinh
ra một dãy các khóa phục vụ cho việc mã hóa. Thủ tục này đảm bảo sẽ sinh ra số
lượng khóa con khác nhau hoàn toàn vừa đủ để thực hiện số vòng mã hóa theo
yêu cầu đủ để thực hiện quá trình mã hóa.
Mã cơ bản của thuật toán sinh khóa trong phần mềm:
keyExpand := proc(keyList)
local keyExpanded, i, j, k, fudgeWord:
keyExpanded := matrix(4,44):
for j from 1 to 4 do
for i from 1 to 4 do
keyExpanded[i,j] := keyList[(j-1)*4+i];
end do:
end do:
for i from 1 to 10 do
fudgeWord := roundFudgeWord(i);
keyExpanded[1,4*i+1] :=
xor8(keyExpanded[1,4*i-3],SBoxTable[keyExpanded[2,4*i]]);
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
19
LỜI CẢM ƠN
keyExpanded[2,4*i+1] :=
xor8(keyExpanded[2,4*i-3],SBoxTable[keyExpanded[3,4*i]]);
keyExpanded[3,4*i+1] :=
xor8(keyExpanded[3,4*i-3],SBoxTable[keyExpanded[4,4*i]]);
keyExpanded[4,4*i+1] :=
xor8(keyExpanded[4,4*i-3],SBoxTable[keyExpanded[1,4*i]]);
keyExpanded[1,4*i+1] := xor8(keyExpanded[1,4*i+1],fudgeWord);

for j from 2 to 4 do
for k from 1 to 4 do
keyExpanded[k,4*i+j]
:=xor8(keyExpanded[k,4*i+j-4],keyExpanded[k,4*i+j-1]):
end do:
end do:
end do:
keyExpanded;
end:
5 Thuật toán mã hóa
Sau khi có đủ các thành phần của thuật toán mã hóa. Ta kết nối các thành
phần lại với nhau để cho ra 1 thuật toán mã hóa hoàn chỉnh. Các thuật toán mã
hóa AES-128, AES-192, AES-256 có cách cài đặt khác nhau đôi chút. Điểm có
thể thấy rõ nhất là số vòng lặp mã hóa của mỗi thuật toán khác nhau cụ thể như
sau:
AES-128: dùng 10 vòng lặp
AES-192: dùng 12 vòng lặp
AES-256: dùng 14 vòng lặp
Số vòng lặp được tính toán sẵn đủ để mã hóa toàn bộ khối dữ liệu đồng
thời tận dụng được hết độ lớn của khóa làm cho dữ liệu sau khi mã hóa rối rắm
hết mức có thể.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
20
LỜI CẢM ƠN
Thuật toán mã hóa được thực hiện như sau:
Khởi động
AddRoundKey
While (lặp số lần theo qui định)
{
SubBytes

ShiftRows
MixColumns
AddRoundKey
}
SubBytes
ShiftRows
AddRoundKey
Kết thúc
Thuật toán giải mã tương tự như sau:
Khởi động
AddRoundKey (hàm này nghịch đảo cũng chính là nó do dùng
phép XOR)
While (lặp số lần theo qui định)
{
SubBytes_Nghich_Dao
ShiftRows_Nghich_Dao
MixColumns_Nghich_Dao
AddRoundKey
}
SubBytes_Nghich_Dao
ShiftRows_Nghich_Dao
AddRoundKey
Kết thúc
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
21
LỜI CẢM ƠN
6 Các thuật toán bổ sung để phần mềm có thể hoạt động
Ngoài các thuật toán chính nêu trên, phần mềm này còn phải viết thêm một
số thuật toán cơ bản như thuật toán Xor bit, thuật toán biến đổi số từ ma trận
sang các dạng khác, biến đổi kiểu dữ liệu… Do các thuật toán này khá đơn giản

nhưng lại rất dài dòng nên em sẽ không đưa vào bài thu hoạch để tránh rườm rà.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
22
LỜI CẢM ƠN
PHẦN IV - KẾT LUẬN
Thuật toán mã hóa AES thật ra cũng không phải là mới. Nó đã ra đời cách đây
hơn 10 năm. Tuy nhiên sau hàng loạt những cách tấn công và cải tiến của cách tấn
công được công bố, thuật toán này vẫn đảm bảo những yêu cầu nhất định về bảo mật
dữ liệu và vẫn đang được sử dụng rộng rãi trong các cơ quan hàng đầu như ngân hàng,
NASA, các công ty lưu trữ trực tuyến hàng đầu như VGuard, yourfile…
Phần mềm maple cũng là phần mềm đã được sử dụng trong nghiên cứu, ứng
dụng từ rất lâu. Cách xây dựng các phần mềm mã hóa trên nền tảng của Maple có lẽ đã
được rất rất nhiều người làm trước đây và có thể còn có nhiều cách tốt hơn để xây
dựng một phần mềm tương tự (dùng ngôn ngữ khác, các gói thư viện, chạy trên nền
khác chứ không phải Maple). Tuy nhiên, bài thu hoạch của em vẫn chọn cách cài đặt
thuật toán trên nền Maple chủ yếu để có thể hiểu hơn về cách sử dụng phần mềm
Maple vào nghiên cứu, học tập.
Bài thu hoạch của em được phát triển lên từ bài thu hoạch cũ của chính mình. Do
hạn chế thời gian và trình độ còn nhiều yếu kém, nên bài thu hoạch của em sẽ có rất
nhiều hạn chế và sai sót, nếu có gì sai sót, em rất mong nhận được lời góp ý của thầy
để có thể hoàn thiện bài thu hoạch cho các nhu cầu về sau.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
23
LỜI CẢM ƠN
PHẦN V - DANH MỤC TÀI LIỆU THAM KHẢO
[1] www.wikipedia.org.
[2] Maple Getting Started Guide - Waterloo Maple Inc.
[3] Maple User Manual - Waterloo Maple Inc.
[4] Maple Introductory Programming Guide - M. B. Monagan, K. O.
Geddes K. M. Heal, G. Labahn, S. M. Vorkoetter, J. McCarron, P.

DeMarco.
[5] Maple Advance Programing Guide - M. B. Monagan, K. O. Geddes K.
M. Heal, G. Labahn, S. M. Vorkoetter, J. McCarron, P. DeMarco.
Nghiên cứu phần mềm Maple và cài đặt thử nghiệm thuật toán mã hóa AES
24

×