Cài đặt thuật toán AES 128, phục vụ cho bài tập lớn môn Mật Mã học nâng cao tại HV Kỹ thuật Mật Mã. Vào năm 1997, Viện tiêu chuẩn và công nghệ quốc gia Mỹ (NIST) đã phát động một cuộc thi nhằm xây dựng một chuẩn mã dữ liệu mới thay thế cho chuẩn mã dữ liệu cũ DES đã được đưa ra vào năm 1974 (Khi họ cho rằng độ dài khóa của DES là không an toàn và đã có một hệ thống thám mã DES phá được khóa DES trong thời gian 2 ngày). Đến khoảng tháng 8 năm 1998, đã có 15 thuật toán được đưa ra cho NIST lúc bấy giờ. Khoảng 1 năm sau, đã có 5 thuật toán được chọn. Quá trình tuyển chọn cuối cùng kéo dài đến tháng 10 năm 2000, NIST đã công bố chuẩn mã dữ liệu mới được lựa chọn là thuật toán Rijndeal (thuật toán mã khối)
Trang 1CÀI ĐẶT THUẬT TOÁN AES - 128
Giảng viên: TS Nguyễn Tuấn Anh
Thực hiện: Sinh viên lớp AT9B
1 Đỗ Huy Hùng
2 Nguyễn Thành Đạt
3 Nguyễn Thị Thêu
HÀ NỘI, 2016
Trang 21
Cati đ
MỤC LỤC
BẢNG KÝ HIỆU 2
DANH MỤC BẢNG BIỂU 2
DANH MỤC HÌNH VẼ 2
LỜI NÓI ĐẦU 3
CHƯƠNG I GIỚI THIỆU VỀ AES – Advanced Encryption Standard 4
1.1 Lịch sử AES 4
1.2 Sơ lược về thuật toán AES 4
CHƯƠNG II CẤU TẠO, HOẠT ĐỘNG CỦA AES 5
2.1 Thông số thuật toán 5
2.2 Quá trình mã hóa 5
2.2.1 Phép thay thế byte (SubBytes) 6
2.2.2 Phép dịch hàng (ShiftRows) 8
2.2.3 Trộn cột (MixColumns) 8
2.2.4 Cộng khóa vòng (AddRoundKey) 9
2.3 Quá trình mở rộng khóa 10
2.4 Quá trình giải mã 11
2.4.1 Dịch hàng nghịch đảo (InvShiftRows) 12
2.4.2 Thay thế byte nghịch đảo (InvSubBytes) 13
2.4.3 Trộn cột nghịch đảo (InvMixColumns) 13
2.4.4 Cộng khóa vòng (AddRoundKey) trong giải mã 14
2.5 Quá trình giải mã ngược 14
CHƯƠNG III PHÂN TÍCH, THIẾT KẾ CHƯƠNG TRÌNH 16
3.1 Giới thiệu chương trình 16
3.2 Cấu trúc chương trình 16
3.3 Xây dựng các phương thức chính 17
3.3.1 AESUtils.java 17
3.3.2 AES.java 19
CHƯƠNG IV KIỂM TRA TÍNH ĐÚNG ĐẮN CỦA CHƯƠNG TRÌNH 21
4.1 Nguồn dữ liệu 21
4.2 Kiểm tra tính đúng đắn 21
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 24
TÀI LIỆU THAM KHẢO 24
Trang 32
Cati đ
BẢNG KÝ HIỆU
AES Advanced Encryption Standard NIST National Institute of Standard and Technology FIPS Federal Information Processing Standards DES Data Encryption Standard
ECB Electronic Codebook CBC Cipher Block Chaning OFB Output Feedback CFB Cipher Feedback
DANH MỤC BẢNG BIỂU
Bảng 2 1 Bảng thông số của AES 5
Bảng 2 2 Bảng thay thế byte (S-box) 7
Bảng 2 3 Inverse S-box: Bảng thay thế các byte nghịch đảo 13
Bảng 4 1 Bảng “test vector” cho AES - 128 21
DANH MỤC HÌNH VẼ Hình 2 1 Giải thuật mã hóa AES 6
Hình 2 2 Mô tả phép biến đổi SubByte() 7
Hình 2 3 Mô tả quá trình ShiftRows 8
Hình 2 4 Mô tả phép biến đổi MixColumns 9
Hình 2 5 Mô tả phép biến đổi AddRoundKey 10
Hình 2 6 Thuật toán mở rộng khóa 11
Hình 2 7 Thuật toán giải mã AES 12
Hình 2 8 Mô tả phép biến đổi InvShiftRows() 12
Hình 2 9 Thuật toán giải mã ngược 15
Hình 3 1 Giao diện chương trình 16
Hình 4 1 Test vector 1 21
Hình 4 2 Test Vector 2 22
Hình 4 3 Nội dung file encrypt.txt 22
Hình 4 4 Nội dung file decrypt.txt 23
Hình 4 5 Test vector 3 23
Trang 43
Cati đ
LỜI NÓI ĐẦU
Với tốc độ và khả năng xử lý ngày càng được nâng cao của các bộ vi xử lý hiện nay, phương pháp mã hóa chuẩn (DES - Data Encryption Standard) đã trở nên không an toàn trong bảo mật thông tin Do đó, Viện tiêu chuẩn và công nghệ Hoa
kỳ (NIST - National Institute Standards of Technology) đã quyết định chọn một chuẩn mã hóa mới với độ an toàn cao nhằm phục vụ nhu cầu bảo mật thông tin liên lạc của Chính phủ Hoa Kỳ cũng như trong các ứng dụng dân sự Thuật toán Rijndael do Vincent Rijmen và Joan Daeman đã được chính thức chọn trở thành chuẩn mã hóa nâng cao (AES - Advanced Encryption Standard) từ ngày 02 tháng
10 năm 2000
Với sự phát triển ngày càng nhanh chóng của Internet và các ứng dụng giao dịch điện tử trên mạng, nhu cầu bảo vệ thông tin trong các hệ thống và ứng dụng điện tử ngày càng được quan tâm và có ý nghĩa hết sức quan trọng Vì thế việc nghiên cứu về chuẩn mật mã nâng cao và ứng dụng nó trong các lĩnh vực bảo mật thông tin là rất cần thiết
Báo cáo gồm 4 chương :
CHƯƠNG I GIỚI THIỆU VỀ AES : Chương này giới thiệu về lịch sử ra đời
của AES, mô tả sơ lược về thuật toán
CHƯƠNG II CẤU TẠO, HOẠT ĐỘNG CỦA AES: Mô tả các thông số của
AES ứng với độ dài khóa 128, 192, hoặc 256 bits Trình bày chi tiết thuật toán mã hóa, giải mã, và mở rộng khóa bao gồm các phép biến đổi SubBytes, ShiftRow, …
CHƯƠNG III PHÂN TÍCH, THIẾT KẾ CHƯƠNG TRÌNH: Giới thiệu về
chương trình mã hóa, giải mã một khối Code chi tiết các phương thức chính
CHƯƠNG IV KIỂM TRA TÍNH ĐÚNG ĐẮN: Sử dụng “test vector” cho
AES được công bố bởi NIST để kiểm tra tính đúng đắn của chương trình
Trong quá trình tìm hiểu, do hiểu biết còn hạn chế, kiến thức thực tế chưa có nhiều, nên chúng em không tránh khỏi những thiếu sót sai lầm Rất mong được sự
góp ý của thầy cô và các bạn Chúng em xin cám ơn thầy TS Nguyễn Tuấn Anh
đã nhiệt tình hướng dẫn chúng em hoàn thành bài báo cáo này
Chúng em xin chân thành cảm ơn!
Trang 5Đến khoảng tháng 8 năm 1998, đã có 15 thuật toán được đưa ra cho NIST lúc bấy giờ Khoảng 1 năm sau, đã có 5 thuật toán được chọn Quá trình tuyển chọn cuối cùng kéo dài đến tháng 10 năm 2000, NIST đã công bố chuẩn mã dữ liệu mới được lựa chọn là thuật toán Rijndeal (thuật toán mã khối)
Thuật toán được thiết kế bởi hai nhà mật mã học người Bỉ: Joan Deaman và Vincent Rijmen Thuật toán được đặt tên là "Rijndael" khi tham gia cuộc thi thiết kế AES [2]
1.2 Sơ lược về thuật toán AES
Mặc dù 2 tên AES và Rijndael vẫn thường được gọi thay thế cho nhau nhưng
trên thực tế thì 2 thuật toán không hoàn toàn giống nhau AES chỉ làm việc với các khối dữ liệu (đầu vào và đầu ra) 128 bít và khóa có độ dài 128, 192 hoặc 256 bít (vì thế mà các thuật toán AES có tên khác nhau là AES – 128, AES – 192, AES – 256) trong khi Rijndael có thể làm việc với dữ liệu và khóa có độ dài bất kỳ là bội
số của 32 bít nằm trong khoảng từ 128 tới 256 bít
Các khóa con sử dụng trong các chu trình được tạo ra bởi quá trình tạo khóa con Rijndael Mỗi khóa con cũng là một cột gồm 4 byte Hầu hết các phép toán trong thuật toán AES đều thực hiện trong một trường hữu hạn của các byte
Mỗi khối dữ liệu 128 bit đầu vào được chia thành 16 byte (mỗi byte 8 bit),có thể xếp thành 4 cột, mỗi cột 4 phần tử hay là một ma trận 4x4 của các byte,nó được
gọi là ma trận trạng thái, hay vắn tắt là trạng thái (tiếng Anh: state, trang thái trong
Rijndael có thể có thêm cột) Trong quá trình thực hiện thuật toán các toán tử tác động để biến đổi ma trận trạng thái này
Trang 65
Cati đ
CHƯƠNG II CẤU TẠO, HOẠT ĐỘNG CỦA AES 2.1 Thông số thuật toán
Với thuật toán AES, độ dài của khối đầu vào, đầu ra, state là 128 bits
Độ dài của khóa (key cipher) là 128, 192, hoặc 256 bits Độ dài của khóa
được đại diện bởi Nk = 4, 6, hoặc 8, phản ánh số lượng từ 32 bits (số cột) trong
Bảng 2 1 Bảng thông số của AES
Trong quá trình mã hóa và giải mã, mỗi một vòng lặp gồm 4 phép biến đổi mật mã theo byte:
1) Thay thế byte (byte substitution) sử dụng một bảng thay thế (S-box)
2) Dịch các hàng của mảng trạng thái (State array) theo chỉ số dòng
3) Trộn dữ liệu trong một cột của State array
4) Cộng khóa vòng (round key) vào State array
Phần tiếp theo sẽ giới thiệu về quá trình mã hóa, giải mã và cuối cùng là quá trình sinh khóa vòng – mở rộng khóa (Key expansion)
2.2 Quá trình mã hóa
Tại bước khởi động của vòng lặp, khối dữ liệu đầu vào được gán cho State array Sau đó mỗi cột của State array đầu tiên lần lượt được kết hợp với khóa đầu vào theo thứ tự từ đầu dãy khóa Sau đó State array được biến đổi thông qua 10,
12, hoặc 14 vòng lặp (Nr), với vòng cuối cùng khác với Nr - 1 vòng trước Sau đó State array được gán cho dữ liệu đầu ra
Trang 76
Cati đ
Các vòng lặp sử dụng tham số là các khóa con được sinh ra bởi quá trình mở rộng khóa được trình bày ở phần 4 của mục này Tập hợp khóa con là một mảng một chiều, mỗi phần tử là 4 bytes
Các phép biến đổi trong hình 2.2: SubBytes, ShiftRows, MixColumns, và AddRoundKey được mô tả trong phần dưới Mảng w[] chứa khóa được sinh bởi hàm mở rộng khóa được mô tả tại …
Theo hình 2.2, Nr-1 vòng thực hiện giống nhau, vòng cuối không có
MixColumns
Quá trình mã hóa được biểu diễn bằng giải thuật dưới đây hoặc tham khảo
phần 3.3.2.a:
Hình 2 1 Giải thuật mã hóa AES
2.2.1 Phép thay thế byte (SubBytes)
Phép biến đổi AES đầu tiên là một phép thay thế byte phi tuyến gọi là phép biến đổi SubBytes(), nó hoạt động độc lập trên mỗi byte bằng cách sử dụng bảng tra S – box Bảng tra S – box này được xây dựng nên từ 2 phép biến đổi:
- Tính nghịch đảo phép nhân trong 𝐺𝐹(28)
- Sau đó, sử dụng một phép biến đổi Affine trên nghịch đảo này
Quá trình trên được biểu diễn như sau:
Trang 87
Cati đ
Hình 2.2 sẽ biểu diễn sự thay đổi của phép biến đổi SubBytes():
Hình 2 2 Mô tả phép biến đổi SubByte()
Bảng tra S – box sử dụng trong SubBytes() được biểu thị dưới dạng hệ 16 trong bảng 2.2 :
Bảng 2 2 Bảng thay thế byte (S-box)
Ví dụ: muốn thay thế 𝑠1,1 = {53} trong State array chúng ta sẽ lấy chỉ số dòng
là ‘5’ và chỉ số cột là ‘3’ trong bảng trên vì thế 𝑠′
1,1 = {𝑒𝑑}
Trang 9Như vậy hàng đầu tiên sẽ không dịch, tức là 𝑠ℎ𝑖𝑓𝑡(0, 4) = 0
Với các hàng còn lại lượng dịch sẽ tùy theo số hàng:
Hình 2 3 Mô tả quá trình ShiftRows
2.2.3 Trộn cột (MixColumns)
Phép biến đổi MixColumns() được dùng để trộn dữ liệu trong một cột của State array Các cột được xem như các đa thức trong 𝐺𝐹(28) Đầu ra của MixColumns() là 𝑠′(𝑥) được tạo bằng cách nhân cột của 𝑠(𝑥) với đa thức 𝑎(𝑥)
và rút gọn theo modulo (𝑋4+ 1) :
𝑠′(𝑥) = 𝑎(𝑥) ⊗ 𝑠(𝑥) Trong đó: 𝑎(𝑥) = 03𝐻𝑥3 + 01𝐻𝑥 + 02𝐻
Ở dạng ma trận có thể viết như sau:
Trang 109
Cati đ
Kết quả được biểu diễn như sau:
Hình 2 4 mô tả quá trình biến đổi của MixColumns():
Hình 2 4 Mô tả phép biến đổi MixColumns
2.2.4 Cộng khóa vòng (AddRoundKey)
Trong phép biến đổi này, Round Key được kết hợp với từng cột của State array bằng phép XOR (cộng modulo 2) Mỗi một Round Key chứa 4 word, được thêm vào mỗi cột của State array như sau:
[𝑠′0,𝑐 , 𝑠′
1,𝑐 , 𝑠′
2,𝑐 , 𝑠′
3,𝑐] = [𝑠0,𝑐 , 𝑠0,𝑐 , 𝑠0,𝑐 , 𝑠0,𝑐 ] ⊕ [𝑤𝑟𝑜𝑢𝑛𝑑∙𝑁𝑏+𝑐] 𝑣ớ𝑖 0 ≤ 𝑐 ≤ 𝑁𝑏
Trang 11và mỗi vòng trong Nr vòng mã hóa cần 𝑁𝑏 từ 32 bits làm khóa Mỗi kết quả của
bảng phân phối khóa là một từ 4 bytes, kí hiệu là 𝑤𝑖, với 0 ≤ 𝑖 < 𝑁𝑏(𝑁𝑟 + 1)
Quá trình sinh khóa vòng được biểu thị qua giải thuật như hình 2.6 hoặc tham
khảo mục 3.3.2.c
Trong giải thuật ta có hai hàm SubWord() và RotWord():
- SubWord(): là hàm thay thế mỗi byte ở đầu vào bằng một byte trong bảng tra S-box
- RotWord(): thực hiện phép dịch vòng các byte từ một từ 4 bytes Từ từ 4 bytes [𝑎0𝑎1𝑎2𝑎3] sau phép dịch vòng [𝑎1𝑎2𝑎3𝑎0]
- Sau đó từ 4 bytes này được kết hợp với một mảng 4 bytes gọi là Rcon[𝑖] được cho như sau [𝑥𝑖−1, {00}, {00}, {00}] với 𝑥𝑖−1 là bậc của 𝑥(𝑥 là kí hiệu của {02}) trong trường 𝐺𝐹(28) (𝑖 chạy từ 1, không phải từ 0)
Trong thuật toán trên, ta có thể thấy ở 𝑁𝑘 từ mã đầu tiên của khóa vòng được lấp bởi khóa đầu vào Mọi từ mã tiếp theo, 𝑤𝑖, là kết quả của phép XOR của từ
mã trước đó, 𝑤𝑖−1, với từ mã trước nó 𝑁𝑘 vị trí, 𝑤𝑖−𝑁𝑘 Đối với các từ mã ở vị trí
Trang 1211
Cati đ
bằng một số nguyên lần của 𝑁𝑘, từ mã được RotWord(), sau đó được SubWord(),
và cuối cùng XOR với Rcon[𝑖]
Riêng đối với AES – 256 khi 𝑁𝑘 = 8 và 𝑖 − 4 là bội của 𝑁𝑘 thì từ mã sẽ được SubWord()
Hình 2 6 Thuật toán mở rộng khóa
2.4 Quá trình giải mã
Quá trình mã hóa được mô tả ở phần trên có thể thực hiện theo thứ tự đảo nghịch đảo để sinh ra quá trình giải mã của thuật toán AES Những phép biến đổi thực hiện trong quá trình giải mã là: InvShiftRows(), InvSubBytes(), InvMixColumns(), và AddRoundKey()
Giải thuật sau đây mô tả quá trình giải mã:
Trang 1312
Cati đ
Hình 2 7 Thuật toán giải mã AES
2.4.1 Dịch hàng nghịch đảo (InvShiftRows)
InvShiftRows là phép biến đổi nghịch đảo với phép ShiftRows trong quá trình
mã hóa Các bytes ở 3 hàng cuối của State array được dịch vòng với lượng dịch khác nhau
Hàng đầu tiên giữ nguyên, 3 hàng còn lại được dịch vòng theo công thức:
Hình 2 8 miêu tả phép biến đổi InvShiftRows:
Hình 2 8 Mô tả phép biến đổi InvShiftRows()
Trang 1413
Cati đ
2.4.2 Thay thế byte nghịch đảo (InvSubBytes)
Đây là phép biến đổi nghịch đảo với phép SubBytes trong quá trình giải mã Mỗi byte của State array được thay thế độc lập bằng cách tra bảng thế S–box nghịch đảo (inverse S-box) Đây cũng là kết quả của phép biến đổi Affine nghịch đảo sau đó nhân State array với ma trận nghịch đảo trong 𝐺𝐹(28)
Bảng S-Box sử dụng trong InvSubBytes() được cho mô tả như bảng dưới
Bảng 2 3 Inverse S-box: Bảng thay thế các byte nghịch đảo
2.4.3 Trộn cột nghịch đảo (InvMixColumns)
Phép biến đổi InvMixColumns là một phép biến đổi nghịch đảo với phép MixColumns trong quá trình mã hóa Các cột được xem như các đa thức trong 𝐺𝐹(28) và được nhân với modulo (𝑋4+ 1) với một đa thức cố định cho sẵn
𝑎−1(𝑥):
Ở dạng ma trận có thể viết như sau:
Kết quả của phép nhân trên được biểu thị như sau:
Trang 1514
Cati đ
2.4.4 Cộng khóa vòng (AddRoundKey) trong giải mã
Phép biến đổi này trong quá trình giải mã tương tự với quá trình mã hóa
2.5 Quá trình giải mã ngược
Các phép biến đổi trong quá trình giải mã ở trên có thứ tự ngược với các phép biến đổi trong quá trình mã hóa, khi mà khóa mã hóa và khóa giải mã là giống nhau (đặc điểm nổi bật của hệ mật khóa bí mật) Tuy nhiên, một vài tính chất của thuật toán AES cho phép sử dụng quá trình giải mã tương đương có cùng thứ tự các phép biến đổi như quá trình mã hóa
Hai tính chất cho phép sử dụng quá trình giải mã tương đương được giải thích như sau:
1 Phép SubBytes() và ShiftRows() có tính chất giao hoán, có nghĩa là, một phép SubBytes() được thực hiện thì kế đến là một phép ShiftRows() cũng tương đương với một phép ShiftRows() được thực hiện kế đến là một phép SubBytes() Cũng tương đương như vậy với hai phép biến đổi
InvShiftRows() và InvSubBytes()
2 Phép biến đổi trộn cột – MixColumns() và InvMixColumns() là tuyến
tính với các đầu vào cột, có nghĩa là:
InvMixColumns(state XOR Round Key) =
InvMixColumns(state) XOR InvMixColumns(Round Key)
Trang 1615
Cati đ
Hình 2 9 Thuật toán giải mã ngược
Trang 1716
Cati đ
CHƯƠNG III PHÂN TÍCH, THIẾT KẾ CHƯƠNG TRÌNH
3.1 Giới thiệu chương trình
Ngôn ngữ lập trình được sử dụng: Java
IDE được sử dụng: Eclipse
Giao diện chương trình gồm 2 phần:
- Phần 1: bao gồm hộp thoại lựa chọn file dữ liệu, lựa chọn kích thước khóa tương ứng, và nút thực thi chương trình
- Phần 2: khung hiển thị nhật kí: dữ liệu trong file input, quá trình sinh key, mã hóa, giải mã
Hình 3 1 Giao diện chương trình
Cách sử dụng:
Tiến hành chọn file dữ liệu để tiến hành mã hóa, giải mã trong thư mục “test
vector” đi kèm Sau đó, chọn độ dài khóa tương ứng với dữ liệu Nhấn nút
“Execute” để chương trình tiến hành mã hóa, và giải mã dữ liệu nhận được
Sau khi hoàn tất quá trình mã hóa, giải mã, dữ liệu sẽ được ghi xuống file
“encrypt.txt” và “decrypt.txt” tại thư mục chứa chương trình Đồng thời dữ liệu
cũng được hiển thị bên phần log (bao gồm quá trình sinh key, block sau mỗi vòng
mã hóa, giải mã)
3.2 Cấu trúc chương trình
Dựa vào thuật toán AES, các yêu cầu của bài tập lớn, cũng như việc xây dựng giao diện chương trình sao cho thân thiện Tiến hành xây dựng chương trình với 4 class
- AES.java: Chứa 3 phương thức chính: keyExpansion (mở rộng khóa),
encrypt (mã hóa dữ liệu), decrypt (giải mã)
- AESUtils.java: Chứa tất cả các phương thức phục vụ cho quá trình mở
rộng khóa, mã hóa cũng như giải mã của AES VD: SubByte, ShiftRow,
MixColumn, AddRoundKey, …