1. Trang chủ
  2. » Công Nghệ Thông Tin

Cài đặt thuật toán AES 128

25 1,6K 11

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 25
Dung lượng 1,27 MB

Nội dung

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 1

CÀ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 2

1

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 3

2

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 4

3

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 6

5

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 7

6

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 8

7

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 9

Như 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 10

9

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 11

và 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 12

11

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 13

12

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 14

13

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 15

14

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 16

15

Cati đ

Hình 2 9 Thuật toán giải mã ngược

Trang 17

16

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, …

Ngày đăng: 23/03/2016, 11:32

TỪ KHÓA LIÊN QUAN

w