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

25 1.6K 11
Cài đặt thuật toán AES  128

Đ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

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)

HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA AN TOÀN THÔNG TIN  BÁO CÁO BÀI TẬP LỚN MÔN HỌC MẬT MÃ HỌC NÂNG CAO Chủ đề số 14 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 Đỗ Huy Hùng Nguyễn Thành Đạt Nguyễn Thị Thêu HÀ NỘI, 2016 MỤC LỤC BẢNG KÝ HIỆU DANH MỤC BẢNG BIỂU DANH MỤC HÌNH VẼ LỜI NÓI ĐẦU CHƯƠNG I GIỚI THIỆU VỀ AES – Advanced Encryption Standard 1.1 Lịch sử AES 1.2 Sơ lược thuật toán AES CHƯƠNG II CẤU TẠO, HOẠT ĐỘNG CỦA AES 2.1 Thông số thuật toán 2.2 Quá trình mã hóa 2.2.1 Phép thay byte (SubBytes) 2.2.2 Phép dịch hàng (ShiftRows) 2.2.3 Trộn cột (MixColumns) 2.2.4 Cộng khóa vòng (AddRoundKey) 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 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) 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 phương thức 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 liệu 21 4.2 Kiểm tra tính đắn 21 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 24 TÀI LIỆU THAM KHẢO 24 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 Bảng thông số AES Bảng 2 Bảng thay byte (S-box) Bảng Inverse S-box: Bảng thay byte nghịch đảo 13 Bảng Bảng “test vector” cho AES - 128 21 DANH MỤC HÌNH VẼ Hình Giải thuật mã hóa AES Hình 2 Mô tả phép biến đổi SubByte() Hình Mô tả trình ShiftRows Hình Mô tả phép biến đổi MixColumns Hình Mô tả phép biến đổi AddRoundKey 10 Hình Thuật toán mở rộng khóa 11 Hình Thuật toán giải mã AES 12 Hình Mô tả phép biến đổi InvShiftRows() 12 Hình Thuật toán giải mã ngược 15 Hình Giao diện chương trình 16 Hình Test vector 21 Hình Test Vector 22 Hình Nội dung file encrypt.txt 22 Hình 4 Nội dung file decrypt.txt 23 Hình Test vector 23 Cati đ LỜI NÓI ĐẦU Với tốc độ khả xử lý ngày nâng cao vi xử lý nay, phương pháp mã hóa chuẩn (DES - Data Encryption Standard) trở nên không an toàn bảo mật thông tin Do đó, Viện tiêu chuẩn công nghệ Hoa kỳ (NIST - National Institute Standards of Technology) định chọn chuẩn mã hóa 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 Chính phủ Hoa Kỳ ứng dụng dân Thuật toán Rijndael Vincent Rijmen Joan Daeman 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 phát triển ngày nhanh chóng Internet ứng dụng giao dịch điện tử mạng, nhu cầu bảo vệ thông tin hệ thống ứng dụng điện tử ngày quan tâm có ý nghĩa quan trọng Vì việc nghiên cứu chuẩn mật mã nâng cao ứng dụng lĩnh vực bảo mật thông tin cần thiết Báo cáo gồm chương : CHƯƠNG I GIỚI THIỆU VỀ AES : Chương giới thiệu lịch sử đời AES, mô tả sơ lược thuật toán CHƯƠNG II CẤU TẠO, HOẠT ĐỘNG CỦA AES: Mô tả thông số AES ứng với độ dài khóa 128, 192, 256 bits Trình bày chi tiết thuật toán mã hóa, giải mã, mở rộng khóa bao gồm 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 chương trình mã hóa, giải mã khối Code chi tiết phương thức CHƯƠNG IV KIỂM TRA TÍNH ĐÚNG ĐẮN: Sử dụng “test vector” cho AES công bố NIST để kiểm tra tính đắn chương trình Trong trình tìm hiểu, hiểu biết 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 thiếu sót sai lầm Rất mong góp ý thầy 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áo cáo Chúng em xin chân thành cảm ơn! Cati đ CHƯƠNG I GIỚI THIỆU VỀ AES – Advanced Encryption Standard 1.1 Lịch sử AES Vào năm 1997, Viện tiêu chuẩn công nghệ quốc gia Mỹ (NIST) phát động thi nhằm xây dựng chuẩn mã liệu thay cho chuẩn mã liệu cũ DES đưa vào năm 1974 (Khi họ cho độ dài khóa DES không an toàn có hệ thống thám mã DES phá khóa DES thời gian ngày).[1] Đến khoảng tháng năm 1998, có 15 thuật toán đưa cho NIST lúc Khoảng năm sau, có thuật toán chọn Quá trình tuyển chọn cuối kéo dài đến tháng 10 năm 2000, NIST công bố chuẩn mã liệu lựa chọn thuật toán Rijndeal (thuật toán mã khối) Thuật toán thiết kế hai nhà mật mã học người Bỉ: Joan Deaman Vincent Rijmen Thuật toán đặt tên "Rijndael" tham gia thi thiết kế AES [2] 1.2 Sơ lược thuật toán AES Mặc dù tên AES Rijndael thường gọi thay cho thực tế thuật toán không hoàn toàn giống AES làm việc với khối liệu (đầu vào đầu ra) 128 bít khóa có độ dài 128, 192 256 bít (vì mà thuật toán AES có tên khác AES – 128, AES – 192, AES – 256) Rijndael làm việc với liệu khóa có độ dài bội số 32 bít nằm khoảng từ 128 tới 256 bít Các khóa sử dụng chu trình tạo trình tạo khóa Rijndael Mỗi khóa cột gồm byte Hầu hết phép toán thuật toán AES thực trường hữu hạn byte Mỗi khối liệu 128 bit đầu vào chia thành 16 byte (mỗi byte bit),có thể xếp thành cột, cột phần tử ma trận 4x4 byte,nó gọi ma trận trạng thái, hay vắn tắt trạng thái (tiếng Anh: state, trang thái Rijndael có thêm cột) Trong trình thực thuật toán toán tử tác động để biến đổi ma trận trạng thái 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 khối đầu vào, đầu ra, state 128 bits Độ dài khóa (key cipher) 128, 192, 256 bits Độ dài khóa đại diện Nk = 4, 6, 8, phản ánh số lượng từ 32 bits (số cột) khóa Đối với AES, số vòng thực mã hóa phụ thuộc vào kích thước khóa, số vòng thực thi kí hiệu Nr Bảng cho biết số vòng mã hóa ứng với độ dài khóa tương ứng AES: Bảng Bảng thông số AES Trong trình mã hóa giải mã, vòng lặp gồm phép biến đổi mật mã theo byte: 1) 2) 3) 4) Thay byte (byte substitution) sử dụng bảng thay (S-box) Dịch hàng mảng trạng thái (State array) theo số dòng Trộn liệu cột State array Cộng khóa vòng (round key) vào State array Phần giới thiệu trình mã hóa, giải mã cuối 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 vòng lặp, khối liệu đầu vào gán cho State array Sau cột State array kết hợp với khóa đầu vào theo thứ tự từ đầu dãy khóa Sau State array biến đổi thông qua 10, 12, 14 vòng lặp (Nr), với vòng cuối khác với Nr - vòng trước Sau State array gán cho liệu đầu Cati đ Các vòng lặp sử dụng tham số khóa sinh trình mở rộng khóa trình bày phần mục Tập hợp khóa mảng chiều, phần tử bytes Các phép biến đổi hình 2.2: SubBytes, ShiftRows, MixColumns, AddRoundKey mô tả phần Mảng w[] chứa khóa sinh hàm mở rộng khóa mô tả … Theo hình 2.2, Nr-1 vòng thực giống nhau, vòng cuối MixColumns Quá trình mã hóa biểu diễn giải thuật tham khảo phần 3.3.2.a: Hình Giải thuật mã hóa AES 2.2.1 Phép thay byte (SubBytes) Phép biến đổi AES phép thay byte phi tuyến gọi phép biến đổi SubBytes(), hoạt động độc lập byte cách sử dụng bảng tra S – box Bảng tra S – box xây dựng nên từ phép biến đổi: - Tính nghịch đảo phép nhân 𝐺𝐹(28 ) - Sau đó, sử dụng phép biến đổi Affine nghịch đảo Quá trình biểu diễn sau: Cati đ Hình 2.2 biểu diễn thay đổi phép biến đổi SubBytes(): Hình 2 Mô tả phép biến đổi SubByte() Bảng tra S – box sử dụng SubBytes() biểu thị dạng hệ 16 bảng 2.2 : Bảng 2 Bảng thay byte (S-box) Ví dụ: muốn thay 𝑠1,1 = {53} State array lấy số dòng ‘5’ số cột ‘3’ bảng 𝑠 ′1,1 = {𝑒𝑑} Cati đ 2.2.2 Phép dịch hàng (ShiftRows) Trong phép dịch hàng, lượng dịch Shift(𝑟, 𝑁𝑏) phụ thuộc vào số hàng 𝑟 Các khối đầu vào đầu khối 128 bits gồm 𝑁𝑏 = word Phép biến đổi ShiftRows() biểu thị sau: 𝑠 ′ 𝑟,𝑐 = 𝑠 𝑟 (𝑐 + 𝑠ℎ𝑖𝑓𝑡(𝑟, 𝑁𝑏)) 𝑚𝑜𝑑 𝑁𝑏 ≤ 𝑐 < 𝑁𝑏 Như hàng không dịch, tức 𝑠ℎ𝑖𝑓𝑡(0, 4) = Với hàng lại lượng dịch tùy theo số hàng: 𝑠ℎ𝑖𝑓𝑡(1, 4) = 𝑠ℎ𝑖𝑓𝑡(2, 4) = 𝑠ℎ𝑖𝑓𝑡(3, 4) = Phép dịch phép dịch vòng, bit cao chuyển xuống bit thấp bits thấp đẩy lên bit cao, hình mô tả trình dịch hàng: Hình Mô tả trình ShiftRows 2.2.3 Trộn cột (MixColumns) Phép biến đổi MixColumns() dùng để trộn liệu cột State array Các cột xem đa thức 𝐺𝐹(28 ) Đầu MixColumns() 𝑠′(𝑥) tạo cách nhân cột 𝑠(𝑥) với đa thức 𝑎(𝑥) rút gọn theo modulo (𝑋 + 1) : 𝑠 ′ (𝑥) = 𝑎(𝑥) ⊗ 𝑠(𝑥) Trong đó: 𝑎(𝑥) = 03𝐻 𝑥 + 01𝐻 𝑥 + 02𝐻 Ở dạng ma trận viết sau: Cati đ Kết biểu diễn sau: Hình mô tả trình biến đổi MixColumns(): Hình 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 kết hợp với cột State array phép XOR (cộng modulo 2) Mỗi Round Key chứa word, thêm vào cột State array sau: [𝑠 ′ 0,𝑐 , 𝑠 ′1,𝑐 , 𝑠 ′ 2,𝑐 , 𝑠 ′ 3,𝑐 ] = [𝑠 0,𝑐 , 𝑠 0,𝑐 , 𝑠 0,𝑐 , 𝑠 0,𝑐 ] ⊕ [𝑤𝑟𝑜𝑢𝑛𝑑∙𝑁𝑏+𝑐 ] 𝑣ớ𝑖 ≤ 𝑐 ≤ 𝑁𝑏 Cati đ Với [𝑤𝑖 ] cột khóa vòng tương ứng bảng phân phối khóa mô tả phần sau round giá trị nằm đoạn [0;Nr] Trong trình mã hóa, bước khởi động vòng lặp xảy round = 0, lúc khóa đầu vào thêm vào State array Phép biến đổi AddRoundKey() miêu tả hình với l = round * Nb: Hình Mô tả phép biến đổi AddRoundKey 2.3 Quá trình mở rộng khóa Thuật toán AES lấy khóa K thực trình mở rộng khóa để thu bảng phân phối khóa (Key Schedule) Quá trình mở rộng khóa tạo tổng cộng 𝑁𝑏(𝑁𝑟 + 1) từ 32 bits: thuật toán yêu cầu tập khởi tạo đầu vào 𝑵𝒃 từ 32 bits, vòng Nr vòng mã hóa cần 𝑁𝑏 từ 32 bits làm khóa Mỗi kết bảng phân phối khóa từ bytes, kí hiệu 𝑤𝑖 , với ≤ 𝑖 < 𝑁𝑏(𝑁𝑟 + 1) Quá trình sinh khóa vòng biểu thị qua giải thuật hình 2.6 tham khảo mục 3.3.2.c Trong giải thuật ta có hai hàm SubWord() RotWord(): - SubWord(): hàm thay byte đầu vào byte bảng tra S-box - RotWord(): thực phép dịch vòng byte từ từ bytes Từ từ bytes [𝑎0 𝑎1 𝑎2 𝑎3 ] sau phép dịch vòng [𝑎1 𝑎2 𝑎3 𝑎0 ] - Sau từ bytes kết hợp với mảng bytes gọi Rcon[𝑖] cho sau [𝑥 𝑖−1 , {00}, {00}, {00}] với 𝑥 𝑖−1 bậc 𝑥 (𝑥 kí hiệu {02}) trường 𝐺𝐹(28 ) (𝑖 chạy từ 1, từ 0) Trong thuật toán trên, ta thấy 𝑁𝑘 từ mã khóa vòng lấp khóa đầu vào Mọi từ mã tiếp theo, 𝑤𝑖 , kết phép XOR từ mã trước đó, 𝑤𝑖−1 , với từ mã trước 𝑁𝑘 vị trí, 𝑤𝑖−𝑁𝑘 Đối với từ mã vị trí Cati đ 10 số nguyên lần 𝑁𝑘, từ mã RotWord(), sau SubWord(), cuối XOR với Rcon[𝑖] Riêng AES – 256 𝑁𝑘 = 𝑖 − bội 𝑁𝑘 từ mã SubWord() Hình Thuật toán mở rộng khóa 2.4 Quá trình giải mã Quá trình mã hóa mô tả phần thực theo thứ tự đảo nghịch đảo để sinh trình giải mã thuật toán AES Những phép biến đổi thực trình giải mã là: InvShiftRows(), InvSubBytes(), InvMixColumns(), AddRoundKey() Giải thuật sau mô tả trình giải mã: Cati đ 11 Hình Thuật toán giải mã AES 2.4.1 Dịch hàng nghịch đảo (InvShiftRows) InvShiftRows phép biến đổi nghịch đảo với phép ShiftRows trình mã hóa Các bytes hàng cuối State array dịch vòng với lượng dịch khác Hàng giữ nguyên, hàng lại dịch vòng theo công thức: Hình miêu tả phép biến đổi InvShiftRows: Hình Mô tả phép biến đổi InvShiftRows() Cati đ 12 2.4.2 Thay byte nghịch đảo (InvSubBytes) Đây phép biến đổi nghịch đảo với phép SubBytes trình giải mã Mỗi byte State array thay độc lập cách tra bảng S–box nghịch đảo (inverse S-box) Đây kết phép biến đổi Affine nghịch đảo sau nhân State array với ma trận nghịch đảo 𝐺𝐹(28 ) Bảng S-Box sử dụng InvSubBytes() cho mô tả bảng Bảng Inverse S-box: Bảng thay byte nghịch đảo 2.4.3 Trộn cột nghịch đảo (InvMixColumns) Phép biến đổi InvMixColumns phép biến đổi nghịch đảo với phép MixColumns trình mã hóa Các cột xem đa thức 𝐺𝐹(28 ) nhân với modulo (𝑋 + 1) với đa thức cố định cho sẵn 𝑎−1 (𝑥): Ở dạng ma trận viết sau: Kết phép nhân biểu thị sau: Cati đ 13 2.4.4 Cộng khóa vòng (AddRoundKey) giải mã Phép biến đổi trình giải mã tương tự với trình mã hóa 2.5 Quá trình giải mã ngược Các phép biến đổi trình giải mã có thứ tự ngược với phép biến đổi trình mã hóa, mà khóa mã hóa khóa giải mã giống (đặc điểm bật hệ mật khóa bí mật) Tuy nhiên, vài tính chất thuật toán AES cho phép sử dụng trình giải mã tương đương có thứ tự phép biến đổi trình mã hóa Hai tính chất cho phép sử dụng trình giải mã tương đương giải thích sau: Phép SubBytes() ShiftRows() có tính chất giao hoán, có nghĩa là, phép SubBytes() thực phép ShiftRows() tương đương với phép ShiftRows() thực phép SubBytes() Cũng tương đương với hai phép biến đổi InvShiftRows() InvSubBytes() Phép biến đổi trộn cột – MixColumns() InvMixColumns() tuyến tính với đầu vào cột, có nghĩa là: InvMixColumns(state XOR Round Key) = InvMixColumns(state) XOR InvMixColumns(Round Key) Cati đ 14 Hình Thuật toán giải mã ngược Cati đ 15 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 sử dụng: Java IDE sử dụng: Eclipse Giao diện chương trình gồm phần: - Phần 1: bao gồm hộp thoại lựa chọn file liệu, lựa chọn kích thước khóa tương ứng, nút thực thi chương trình - Phần 2: khung hiển thị nhật kí: liệu file input, trình sinh key, mã hóa, giải mã Hình Giao diện chương trình Cách sử dụng: Tiến hành chọn file liệu để tiến hành mã hóa, giải mã thư mục “test vector” kèm Sau đó, chọn độ dài khóa tương ứng với liệu Nhấn nút “Execute” để chương trình tiến hành mã hóa, giải mã liệu nhận Sau hoàn tất trình mã hóa, giải mã, liệu ghi xuống file “encrypt.txt” “decrypt.txt” thư mục chứa chương trình Đồng thời liệu hiển thị bên phần log (bao gồm trình sinh key, block sau 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, yêu cầu tập lớn, việc xây dựng giao diện chương trình cho thân thiện Tiến hành xây dựng chương trình với class - AES.java: Chứa phương thức chính: keyExpansion (mở rộng khóa), encrypt (mã hóa liệu), decrypt (giải mã) - AESUtils.java: Chứa tất phương thức phục vụ cho trình mở rộng khóa, mã hóa giải mã AES VD: SubByte, ShiftRow, MixColumn, AddRoundKey, … Cati đ 16 - Utils.java: Chứa phương thức StringToArray (chuyển đồi chuỗi mảng để phục vụ cho việc tính toán), readFile (đọc liệu từ file input), writeFile, … - GUI.java: Xây dựng giao diện cho chương trình, xử lý kiện tương tác với người sử dụng 3.3 Xây dựng phương thức Phần giới thiệu nội dung chi tiết (code) phương thức sử dụng chương trình Phần thiết kế giao diện (GUI.java) phương thức phụ (Utils.java) xin phép không trình bày 3.3.1 AESUtils.java SubByte, InvSubByte Thực cách tra bảng sBox SubByte sBoxRev InvSubByte public char[] subByte(char[] state, boolean reverse) { char[] output = new char[state.length]; for (int i = 0; i < state.length; i++) { // Sub Byte if (!reverse) output[i] = sBox[(int) state[i]]; // Inv SubByte else output[i] = sBoxRev[(int) state[i]]; } return output; } ShiftRow, InvShiftRow Tiến hành dịch trái hàng với số lần dịch số thứ tự hàng Với InvShiftRow tiến hành dịch trái với số lần (Nb – số thứ tự hàng) public static char[] shiftRows(char[] state, boolean reverse ) { for (int i = 0; i < 4; i++) { public static char[] shiftARow( char[] row = new char[4]; char[] row, int loop) { // Get row from state char temp; row[0] = state[i]; for (int i = 1; i 0; i ) { 10 plain = AESUtils.shiftRows(plain, true); 11 plain = AESUtils.subBytes(plain, true); 12 System.arraycopy(expandedKey, i * 16, roundKey, 0, 16); 13 plain = AESUtils.addRoundKey(plain, roundKey); 14 plain = AESUtils.mixColumns(plain, true); 15 } 16 // Final round 17 plain = AESUtils.shiftRows(plain, true); 18 plain = AESUtils.subBytes(plain, true); 19 20 System.arraycopy(expandedKey, i * 16, roundKey, 0, 16); 21 plain = AESUtils.addRoundKey(plain, roundKey); 22 return plain; 23 } Cati đ 19 c Mở rộng khóa (KeyExpansion) public char[] keyExpansion(char[] key) { char[] expandedKey = new char[4 * nb * (nr + 1)]; // Copy key -> key schedule System.arraycopy(key, 0, expandedKey, 0, nk * 4); // Calculate key schedule char[] temp = new char[4]; for (int i = nk; i < nb * (nr + 1); i++) { // Copy Wi_1 -> temp System.arraycopy(expandedKey, nb * (i - 1), temp, 0, nb); 10 11 if (i % nk == 0) { 12 // Nk [...]... 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ã: Cati đ 11 Hình 2 7 Thuật toán giải mã AES 2.4.1... ĐẮN CỦA CHƯƠNG TRÌNH 4.1 Nguồn dữ liệu Để kiểm tra việc cài đặt thuật toán có đúng hay không, ta có thể sử dụng “test vector” – hiểu nôm na là tập hợp bộ dữ liệu chuẩn (bao gồm: input, output, key, …) cho một thuật toán nào đó Chương trình này sử dụng các “test vector” dành cho AES được công bố trong NIST Special Publication 800-38A [4] AES ECB 128- bit encryption mode Encryption key: 2b7e151628aed2a6abf7158809cf4f3c... 1; 11 for (; i < nr; i++) { 12 cipher = AESUtils.subBytes(cipher, false); 13 cipher = AESUtils.shiftRows(cipher, false); 14 cipher = AESUtils.mixColumns(cipher, false); 15 16 System.arraycopy(expandedKey, i * 16, roundKey, 0, 16); 17 cipher = AESUtils.addRoundKey(cipher, roundKey); 18 } 19 // Final Round 20 cipher = AESUtils.subBytes(cipher, false); 21 cipher = AESUtils.shiftRows(cipher, false); 22 System.arraycopy(expandedKey,... int i = nr - 1; 9 for (; i > 0; i ) { 10 plain = AESUtils.shiftRows(plain, true); 11 plain = AESUtils.subBytes(plain, true); 12 System.arraycopy(expandedKey, i * 16, roundKey, 0, 16); 13 plain = AESUtils.addRoundKey(plain, roundKey); 14 plain = AESUtils.mixColumns(plain, true); 15 } 16 // Final round 17 plain = AESUtils.shiftRows(plain, true); 18 plain = AESUtils.subBytes(plain, true); 19 20 System.arraycopy(expandedKey,... 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,... bytes of expanded key 14 temp = AESUtils.subBytes(AESUtils.rotWord(temp), false); 15 temp[0] ^= AESUtils.Rcon[i / nk - 1]; 16 } else if (nk == 8 && i % nk == 4) { 17 // Nk = 8 18 temp = AESUtils.subBytes(temp, false); 19 } 20 // Get Wi_nk 21 char[] Wi_nk = new char[4]; 22 System.arraycopy(expandedKey, nb * (i - nk), Wi_nk, 0, nb); 23 // Wi = Wi-nk + temp 24 char[] Wi = AESUtils.xor2char(Wi_nk, temp);... được miêu tả như hình 2 5 với l = round * Nb: Hình 2 5 Mô tả phép biến đổi AddRoundKey 2.3 Quá trình mở rộng khóa Thuật toán AES lấy khóa K và thực hiện quá trình mở rộng khóa để thu được bảng phân phối khóa (Key Schedule) Quá trình mở rộng khóa sẽ tạo ra tổng cộng 𝑁𝑏(𝑁𝑟 + 1) từ 32 bits: thuật toán yêu cầu một tập khởi tạo đầu vào 𝑵𝒃 từ 32 bits, và mỗi vòng trong Nr vòng mã hóa cần 𝑁𝑏 từ 32 bits làm khóa... 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í Cati đ 10 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... 18 3.3.2 AES. java Với việc mô tả cách hoạt động của AES tại Chương I, ta có các phương thức mã hóa, giải mã, mở rộng khóa như sau: a Mã hóa (encrypt) 1 public char[] encrypt(char[] data, char[] key) { 2 char[] cipher = new char[16]; 3 char[] roundKey = new char[16]; 4 // Expansion key 5 char[] expandedKey = keyExpansion(key); 6 System.arraycopy(expandedKey, 0, roundKey, 0, 16); 7 8 cipher = AESUtils.addRoundKey(data,... 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 ... Cati đ 20 CHƯƠNG IV KIỂM TRA TÍNH ĐÚNG ĐẮN CỦA CHƯƠNG TRÌNH 4.1 Nguồn liệu Để kiểm tra việc cài đặt thuật toán có hay không, ta sử dụng “test vector” – hiểu nôm na tập hợp liệu chuẩn (bao gồm:... thứ 2: Hình Test Vector Với test lại, chương trình cho kết mong muốn Khẳng định, chương trình cài đặt thành công Bên cạnh liệu chương trình ghi vào file “encrypt.txt” Hình Nội dung file encrypt.txt... mã khối) Thuật toán thiết kế hai nhà mật mã học người Bỉ: Joan Deaman Vincent Rijmen Thuật toán đặt tên "Rijndael" tham gia thi thiết kế AES [2] 1.2 Sơ lược thuật toán AES Mặc dù tên AES Rijndael

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

Từ khóa liên quan

Mục lục

  • BẢNG KÝ HIỆU

  • DANH MỤC BẢNG BIỂU

  • DANH MỤC HÌNH VẼ

  • LỜI NÓI ĐẦU

  • CHƯƠNG I. GIỚI THIỆU VỀ AES – Advanced Encryption Standard

    • 1.1. Lịch sử AES

    • 1.2. Sơ lược về thuật toán AES

    • CHƯƠNG II. CẤU TẠO, HOẠT ĐỘNG CỦA AES

      • 2.1 Thông số thuật toán

      • 2.2. Quá trình mã hóa

        • 2.2.1 Phép thay thế byte (SubBytes)

        • 2.2.2 Phép dịch hàng (ShiftRows)

        • 2.2.3 Trộn cột (MixColumns)

        • 2.2.4 Cộng khóa vòng (AddRoundKey)

        • 2.3. Quá trình mở rộng khóa

        • 2.4. Quá trình giải mã

          • 2.4.1. Dịch hàng nghịch đảo (InvShiftRows)

          • 2.4.2. Thay thế byte nghịch đảo (InvSubBytes)

          • 2.4.3. Trộn cột nghịch đảo (InvMixColumns)

          • 2.4.4. Cộng khóa vòng (AddRoundKey) trong giải mã

          • 2.5. Quá trình giải mã ngược

          • CHƯƠNG III. PHÂN TÍCH, THIẾT KẾ CHƯƠNG TRÌNH

            • 3.1. Giới thiệu chương trình

            • 3.2. Cấu trúc chương trình

            • 3.3. Xây dựng các phương thức chính

              • 3.3.1. AESUtils.java

Tài liệu cùng người dùng

Tài liệu liên quan