Đồ án Tìm hiểu và xây dựng ứng dụng mã hóa khóa đối xứng bằng thuật toán Rijndael - Đỗ Thị Bích Thùy
Bạn đang xem 20 trang mẫu của tài liệu "Đồ án Tìm hiểu và xây dựng ứng dụng mã hóa khóa đối xứng bằng thuật toán Rijndael - Đỗ Thị Bích Thùy", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- do_an_tim_hieu_va_xay_dung_ung_dung_ma_hoa_khoa_doi_xung_ban.pdf
Nội dung text: Đồ án Tìm hiểu và xây dựng ứng dụng mã hóa khóa đối xứng bằng thuật toán Rijndael - Đỗ Thị Bích Thùy
- 1 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƢỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG o0o TÌM HIỂU VÀ XÂY DỰNG ỨNG DỤNG MÃ HÓA KHÓA ĐỐI XỨNG BẰNG THUẬT TOÁN RIJNDAEL ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY NGÀNH CÔNG NGHỆ THÔNG TIN Sinh viên thực hiên: Đỗ Thị Bích Thủy Giáo viên hƣớng dẫn: Ths. Lê Thụy Mã số sinh viên: 111339
- 2 LỜI CẢM ƠN Để hoàn thành đồ án này, trƣớc hết, em xin gửi lời cảm ơn và biết ơn sâu sắc tới thầy giáo Lê Thụy, ngƣời đã tận tình hƣớng dẫn, chỉ bảo và giúp đỡ em trong suốt thời gian nghiên cứu và hoàn thành đồ án. Em xin chân thành cảm ơn tới các thầy cô trong khoa Công Nghệ Thông Tin cũng nhƣ các thầy cô trong trƣờng Đại học dân lập Hải Phòng, những ngƣời đã tận tình giảng dậy, và tạo điều kiện cho em trong suốt quá trình học tập và nghiên cứu tại trƣờng. Cuối cùng, em xin cảm ơn gia đình, bạn bè, ngƣời thân đã luôn ở bên động viên và là nguồn cổ vũ lớn lao, là động lực trong suốt quá trình học tập và nghiên cứu. Mặc dù em đã cố gắng hoàn thành đồ án trong phạm vi và khả năng có thể. Tuy nhiên sẽ không tránh khỏi những điều thiếu sót. Em rất mong nhận đƣợc sự cảm thông và tận tình chỉ bảo của quý thầy cô và toàn thể các bạn. Một lần nữa em xin chân thành cảm ơn !
- 3 MỤC LỤC DANH MỤC HÌNH VẼ 6 DANH MỤC BẢNG BIỂU 7 MỞ ĐẦU 8 CHƢƠNG 1: CƠ SỞ TOÁN HỌC 9 1.1 Các khái niệm toán học 9 1.1.1. Số nguyên tố và số nguyên tố cùng nhau. 9 1.1.1 Khái niệm đồng dƣ 9 1.1.2 Định nghĩa Phi Euler 10 1.1.3 Thuật toán Euclide 10 * 1.1.4 Không gian Zn và Zn 11 1.1.4.1 Không gian Zn (các số nguyên theo modulo n) 11 * 1.1.4.2 Không gian Zn 11 * 1.1.5 Định nghĩa cấp của một số a Zn 11 1.1.6 Khái niệm Nhóm, Nhóm con, Nhóm Cyclic 12 1.1.6.1 Khái niệm Nhóm 12 1.1.6.2 Nhóm con của nhóm (G, *) 12 1.1.6.3 Nhóm Cyclic 13 1.1.7 Tập thặng dƣ bậc hai theo modulo 13 1.1.8 Phần tử nghịch đảo 14 1.2 Khái niệm Độ phức tạp của thuật toán 14 1.2.1 Khái niệm Thuật toán 14 1.2.2 Độ phức tạp của thuật toán 15 1.2.3 Ví dụ về việc xác định độ phức tạp của thuật toán: 16 CHƢƠNG 2: VẤN ĐỀ MÃ HÓA 18 2.1 Mật mã học 18 2.1.1 Giới thiệu chung 18 2.1.2 Định nghĩa 18 2.2 Khái niệm hệ mật mã 19
- 4 2.3 Khái niệm mã hóa (Encryption), giải mã (Decryption) 19 2.4 Những tính năng của hệ mã hóa 19 2.5 Các phƣơng pháp mã hóa 20 2.5.1 Phƣơng pháp mã hóa đối xứng 20 2.5.1.1 Mã khối (Block cipher) 21 2.5.1.2 Mã dòng 25 2.5.2 Phƣơng pháp mã hóa công khai 26 2.6 Chữ ký điện tử 28 2.6.1 Giới thiệu 28 2.6.2 Định nghĩa 29 2.6.3 Phân loại chữ ký số 29 2.6.3.1 Phân loại chữ ký theo đặc trƣng kiểm tra chữ ký 29 2.6.3.2 Phân loại chữ ký theo mức an toàn 30 2.6.3.3 Phân loại chữ ký theo ứng dụng đặc trƣng 30 2.7 Hàm băm mật mã 30 2.7.1 Giới thiệu về hàm băm 30 2.7.2 Tính chất hàm băm 31 2.7.3 Cấu trúc của hàm băm 33 2.7.4 Một số phƣơng pháp băm 33 2.7.4.1 Hàm băm MD4 33 2.7.4.2 Hàm băm MD5 34 2.7.4.3 Hàm băm Chuẩn SHA 36 CHƢƠNG 3: THUẬT TOÁN MÃ HÓA RIJNDAEL VÀ ỨNG DỤNG 39 3.1 Giới thiệu 39 3.2 Tham số, ký hiệu, thuật ngữ và hàm 39 3.3 Một số khái niệm toán học 40 3.3.1 Phép cộng 41 8 3.3.2 Phép nhân trên GF(2 ) 41 3.3.2.1 Phép nhân với x 41
- 5 8 3.3.2.2 Đa thức với hệ số trên GF(2 ) 43 3.4 Phƣơng pháp Rijndael 44 3.4.1 Quá trình mã hóa bao gồm 4 bƣớc: 45 3.4.1.1 Bƣớc SubBytes 47 3.4.1.2 Bƣớc ShiftRows 49 3.4.1.3 Bƣớc MixColumns 50 3.4.1.4 Bƣớc AddRoundKey 51 3.4.1.5 Phát sinh khóa của mỗi chu kỳ 52 3.4.2 Quy trình giải mã 54 3.4.2.1 Phép biến đổi InvShiftRows 55 3.4.2.2 Phép biến đổi InvSubbytes 56 3.4.2.3 Phép biến đổi InvMixColumns 58 3.4.3 Các vấn đề cài đặt thuật toán 59 3.4.4 Kết quả thử nghiệm 62 3.4.5 Kết luận 62 3.4.5.1 Khả năng an toàn 62 3.4.5.2 Đánh giá 63 3.5 Ứng dụng của thuật toán 64 3.5.1 Giao diện chƣơng trình 64 3.5.2 Chức năng chính của chƣơng trình 64 3.5.2.1 Mã hóa 64 3.5.2.2 Giải mã 65 3.5.3 Code thực hiện mã hóa và giải mã 65 KẾT LUẬN 70 TÀI LIỆU THAM KHẢO 71
- 6 DANH MỤC HÌNH VẼ Hình 2.1: Mô hình hệ thống mã hõa đối xứng Hình 2.2: Mô tả sơ đồ chức năng của mật mã CBC(mã hóa và giải mã). Hình 2.3: Mô hình hệ thống mã hóa công khai Hình 2.4: Cách đi đúng của thông tin : thông tin đƣợc truyền đúng từ A đến B Hình 2.5: Thông tin bị lấy trộm và bị thay đổi trên đƣờng truyền Hình 3.1: Biểu diễn dạng ma trận của trạng thái (Nb=6) và mã khóa (Nk=4) Hình 3.2: Thao tác SubBytes tác động trên từng byte của trạng thái. Hình 3.3: Thao tác ShiftRows tác động trên từng dòng của trạng thái Hình 3.4: Thao tác MixColumns tác động lên mỗi cột của trạng thái Hình 3.5: Thao tác AddRoundKey tác động lên mỗi cột của trạng thái. Hình 3.6: Thao tác InvShiftRows tác động lên từng dòng của trạng thái hiện hành. Hình 3.7: Giao diện chƣơng trình.
- 7 DANH MỤC BẢNG BIỂU Bảng 2.1: Các tính chất của các thuật toán băm an toàn Bảng 3.1: Bảng thay thế S-box cho giá trị {xy} ở dạng thập lục phân Bảng 3.2: Giá trị di số shift(r,Nb) Bảng 3.3: Mã khóa mở rộng và cách xác định mã khóa của chu kỳ (Nb = 6 và Nk = 4) Bảng 3.4: Bảng thay thế nghịch đảo giá trị {xy} ở dạng thập lục phân Bảng 3.5: Tốc độ xử lý của phƣơng pháp Rijndael
- 8 MỞ ĐẦU Từ khi con ngƣời có nhu cầu trao đổi thông tin, thƣ từ với nhau thì nhu cầu giữ bí mật và bảo mật tính riêng tƣ của những thông tin, thƣ từ đó cũng nảy sinh. Hình thức thông tin trao đổi phổ biến sớm nhất là dƣới dạng các văn bản, để giữ bí mật của thông tin ngƣời ta đã sớm nghĩ đến cách che dấu nội dung các văn bản bằng cách biến dạng các văn bản đó để ngƣời ngoài đọc nhƣng không hiểu đƣợc, đồng thời có cách khôi phục lại nguyên dạng ban đầu để ngƣời trong cuộc vẫn hiểu đƣợc; theo cách gọi ngày nay thì dạng biến đổi của văn bản đƣợc gọi là mật mã của văn bản, cách lập mã cho một văn bản đƣợc gọi là phép lập mã, còn cách khôi phục lại nguyên dạng ban đầu gọi là phép giải mã. Phép lập mã và phép giải mã đƣợc thực hiện nhờ một chìa khóa riêng nào đó mà chỉ những ngƣời trong cuộc đƣợc biết và nó đƣợc gọi là khóa lập mã. Ngƣời ngoài dù có lấy đƣợc bản mật mã trên đƣờng truyền mà không có khóa mật mã thì cũng không thể hiểu đƣợc nội dung của văn bản truyền đi. Có rất nhiều thuật toán đã đƣợc đƣa ra nhằm mục đích bảo mật thông tin với độ an toàn cao. Và một trong số các thuật toán đó có thuật toán mã hóa đối xứng Rijndael đƣợc Viện Tiêu chuẩn và Công nghệ Hoa Kỳ (National Institute of Standards and Technology – NIST) chọn làm chuẩn mã hóa nâng cao (Advanced Encryption Standard) từ 02 tháng 10 năm 2000. Vì đó mà em chọn đề tài ―Tìm hiểu và xây dựng ứng dụng mã hóa đối xứng bằng thuật toán Rijndael‖ để hiểu rõ các bƣớc thực hiện trong thuật toán mới này khi mã hóa thông tin. .Luận văn gồm phần mở đầu, kết luận và 3 chƣơng với các nội dung chính sau: - Chƣơng 1: Cơ sở lý thuyết về toán học. - Chƣơng 2: Nói về vấn đề mã hóa bao gồm giới thiệu về mật mã, các khái niệm về mã hóa, các phƣơng pháp mã hóa, chữ ký số và hàm băm. - Chƣơng 3: Tìm hiểu thuật toán Rijndael và mô phỏng chƣơng trình ứng dụng.
- 9 CHƢƠNG 1: CƠ SỞ TOÁN HỌC 1.1 Các khái niệm toán học 1.1.1. Số nguyên tố và số nguyên tố cùng nhau. - Số nguyên tố là số nguyên dƣơng lớn hơn 1chỉ chia hết cho 1 và chính nó. Ví dụ: 2, 3, 5, 7, 11, là những số nguyên tố. - Hệ mật mã thƣờng sử dụng các số nguyên tố ít nhất là lớn hơn 10150. - Hai số m và n đƣợc gọi là nguyên tố cùng nhau nếu ƣớc số chung lớn nhất của chúng bằng 1. Ký hiệu: gcd(m, n) = 1. Ví dụ: 11 và 13 là nguyên tố cùng nhau. Định lý số nguyên tố: Với mọi n>=2 đều có thể phân tích thành lũy thừa cơ e1 e2 e3 + số nguyên tố n = p1 p2 p3 , với pi : số nguyên tố, ei Z . e1 e2 e3 ek Hệ quả: Giả sử a = p1 .p2 p3 pk f1 f2 f3 fk b = p1 .p2 .p3 pk min(e1,f1) min(e2,f2) min(ek,fk) thì gcd(a,b) = p1 .p2 pk (1.1) max(e1,f1) max(e2,f2) max(ek, fk) lcm(a,b) = p1 .p2 pk (1.2) Ví dụ: a = 4864=28.19 và b = 3458 =2.7.13.19 ta đƣợc : gcd(a,b)=2.19 và lcm(a,b)= 28.19.7.13 1.1.1 Khái niệm đồng dƣ Cho n là một số nguyên dƣơng. Nếu a và b là hai số nguyên, khi đó a đƣợc gọi là đồng dƣ với b theo modulo n, đƣợc viết a ≡ b (mod n) nếu n│(a – b), và n đƣợc gọi là modulo của đồng dƣ. Ví dụ: 24 ≡ 9 (mod 5), 17 ≡ 5 (mod 3) Tính chất: (i) a ≡ b (mod n), nếu và chỉ nếu a và b đều trả số dƣ nhƣ nhau khi đem chia chúng cho n. (ii) a ≡ a (mod n)(tính phản xạ). (iii) Nếu a ≡ b (mod n) thì b ≡ a (mod n).
- 10 (iv) Nếu a ≡ b (mod n) và b ≡ c (mod n) thì a ≡ c (mod n). (v) Nếu a ≡ a1 (mod n) và b ≡ b1 (mod n) thì a + b ≡ (a1 + b1) (mod n) và a.b ≡ a1.b1 (mod n). 1.1.2 Định nghĩa Phi Euler Với n ≥ 1, đặt (n) là số các số nguyên trong khoảng [1, n] và nguyên tố cùng nhau với n. Hàm nhƣ thế đƣợc gọi là hàm phi-Euler. Tính chất: - Nếu p là số nguyên tố thì (p) = p-1 (1.3) - Nếu gcd(n.m) = 1, thì (m.n) = (m) . (n) (1.4) e1 e2 ek - Nếu n = p1 .p2 pk , dạng khai triển chính tắc của n, thì (n) = (1.5) Ví dụ: (11) = 11-1 = 10 1.1.3 Thuật toán Euclide Thuật toán: Thuật toán Euclide, tính ƣớc số chung lớn nhất của hai số. INPUT: Hai số nguyên không âm a và b sao cho a ≥ b. OUTPUT: Ƣớc số chung lớn nhất của a và b. 1. Trong khi b ≠ 0, thực hiện Đặt r ← a mod b, a ← b, b ← r. 2. Kết_quả(a) Ví dụ: Tính gcd(4864, 3458) = 38: 4864 = 1.3458 + 1406 3458 = 2.1406 + 646 1406 = 2.646 + 114 646 = 5.114 + 76 114 = 1.76 + 38 76 = 2.38 + 0.
- 11 Thuật toán Euclidean có thể đƣợc mở rộng để không chỉ tính đƣợc ƣớc số chung d của hai số nguyên a và b, mà còn có thể tính đƣợc hai số nguyên x, y thoả mãn: ax + by = d *Thuật toán Euclidean mở rộng INPUT: Hai số nguyên không âm a và b với a ≥ b. OUTPUT: d = gcd(a, b) và hai số x, y thoả mãn ax + by = d. 1. Nếu b = 0, đặt d←a , x←1, y←0, Kết_quả(d, x, y). 2. Đặt x2←1, x1←0 , y2 ←0 , y1←1. 3. Trong khi còn b > 0, thực hiện: 3.1 q←⎣a/b⎦, r←a–q.b, x←x2–q.x1, y←y2–q.y1 3.2 a←b, b←r, x2←x1, x1←x, y2←y1, y1←y 4. Đặt d←a, x←x2 , y←y2 , Kết_quả(d, x, y). * 1.1.4 Không gian Zn và Zn 1.1.4.1 Không gian Zn (các số nguyên theo modulo n) Là tập hợp các số nguyên {0, 1, 2, , n-1}. Các phép toán trong Zn như cộng, trừ, nhân, chia đều đƣợc thực hiện theo module n. Ví dụ: Z21 = {0, 1, 2, 3, ,20} * 1.1.4.2 Không gian Zn * Là tập hợp các số nguyên a Zn, nguyên tố cùng n. Tức là: Zn = {a Zn | * gcd (n, a) =1}, (n) là số phần tử của Zn . * Nếu n là một số nguyên tố thì: Zn = {a Zn |1 ≤ a ≤ n-1} (1.6) * Ví dụ: Z3 = {0, 1,2} thì Z3 = {1,2} vì gcd(1, 3) = 1và gcd(2,3) = 1. * 1.1.5 Định nghĩa cấp của một số a Zn * Cho α Zn , khi đó cấp của a, kí hiệu ord(a) là số nguyên dƣơng nhỏ nhất t * sao cho a 1(mod n) trong Zn .
- 12 1.1.6 Khái niệm Nhóm, Nhóm con, Nhóm Cyclic 1.1.6.1 Khái niệm Nhóm Nhóm là một bội (G, *), trong đó G , * là phép toán hai ngôi trên G thỏa mãn ba tính chất sau: + Phép toán có tính kết hợp: (x*y)*z = x*(y*z) với mọi x, y, z G. (1.7) + Có phần tử trung lập e G: x*e = e*x = x với mọi x G. (1.8) + Với mọi x G, có phần tử nghịch đảo x’ G: x*x’ = x’*x = e. (1.9) Cấp của nhóm G đƣợc hiểu là số phần tử của nhóm, ký hiệu là |G|. Cấp của nhóm có thể là nếu G có vô hạn phần tử. Nhóm Abel là nhóm (G, *), trong đó phép toán hai ngôi * có tính giao hoán. Tính chất: Nếu a*b = a*c, thì b = c. Nếu a*c = b*c, thì a = b. Ví dụ: +) Tập hợp các số nguyên Z cùng với phép cộng (+) thông thƣờng là nhóm giao hoán, có phần tử đơn vị là số 0. Gọi là nhóm cộng các số nguyên. +)Tập Q * các số hữu tỷ khác 0 (hay tập R * các số thực khác 0), cùng với phép nhân (*) thông thƣờng là nhóm giao hoán. Gọi là nhóm nhân các số hữu tỷ (số thực). +)Tập các vectơ trong không gian với phép toán cộng vectơ là nhóm giao hoán. 1.1.6.2 Nhóm con của nhóm (G, *) Nhóm con của G là tập S G, S , và thỏa mãn các tính chất sau: + Phần tử trung lập e của G nằm trong S. + S khép kín đối với phép tính (*) trong G, tức là x*y S với mọi x, y S. + S khép kín đối với phép lấy nghịch đảo trong G, tức x 1 S với mọi x S.
- 13 1.1.6.3 Nhóm Cyclic * Cho α Zn , nếu cấp của α là (n), khi đó α đƣợc gọi là phần tử sinh hay phần * * * tử nguyên thủy của Zn . Nếu Zn có một phần tử sinh, thì Zn đƣợc gọi là nhóm Cyclic. (chú ý nếu n là số nguyên tố thì (n) = n-1) Tính chất: * * i - Nếu α là phần tử sinh của Zn thì Zn = {α mod n | 0 ≤ i ≤ (n) –1} * i - Giả sử α là một phần tử sinh của Zn , khi đó b = α mod n cũng là một phần * * tử sinh của Zn khi và chỉ khi gcd(i, (n)) = 1. Và sau đó nếu Zn là nhóm Cyclic thì số phàn tử sinh sẽ là ((n)). * * (n)/p - α Zn là phần tử sinh của Zn khi và chỉ khi α ! (mod n) với mỗi số chia nguyên tố của (n). * k k - Zn có phần tử sinh khi và chỉ khi n = 2, 4, p hay 2p khi p là số nguyên tố * lẻ và k Còn nếu p là số nguyên tố thì chắc chắn Zp có phần tử sinh. * * Ví dụ: Z21 không phải là nhóm Cyclic vì không phần tử nào của Z21 có cấp là φ(21) = 12, chú ý là 21 không thỏa mãn điều kiện nào theo tính chất của phần tử * sinh trên. Trong khi đó Z13 là nhóm Cyclic và có phần tử sinh α = 2 Thật vậy: 20 mod 13 = 1 21 mod 13 = 2 22 mod 13 = 4 23 mod 13 = 8 24 mod 13 = 3 25 mod 13 = 6 26 mod 13 = 12 27 mod 13 = 11 28 mod 13 = 9 29 mod 13 = 5 210 mod 13 = 10 211 mod 13 = 7 Phần tử 2i là sinh khi và chỉ khi gcd(i, 12) = 1 nghĩa là khi và chỉ khi i =1, 5, * 7 hoặc 11. Vậy các phần tử sinh của Z13 là 2, 6, 7 và 11. 1.1.7 Tập thặng dƣ bậc hai theo modulo * Định nghĩa: Cho a Z n, a đƣợc gọi là thặng dƣ bậc hai theo modulo n nếu * tồn tại một x Z n sao cho , và nếu không tồn tại x nhƣ vậy thì a đƣợc gọi là bất thặng dƣ bậc hai theo modulo n. Tập hợp các thặng dƣ bậc hai đƣợc kí hiệu là Qn và tập các bất thặng dƣ bậc hai ký hiệu là . * Ví dụ: α = 6 là phần tử sinh của Z 13 ta có:
- 14 Do đó Q13 = {1, 3, 4, 9, 10, 12} và = {2, 5, 6, 7, 8, 11} 1.1.8 Phần tử nghịch đảo Định nghĩa: Cho a Zn, số nghịch đảo của a theo modulo n là một số nguyên x Zn, nếu a.x 1 (mod n). Nếu tồn tại x nhƣ vậy, thì nó là duy nhất và a đƣợc gọi là khả nghịch, nghịch đảo của a đƣợc kí hiệu là a-1. Tính chất: a Zn, a là khả nghịch khi và chỉ khi gcd(a, n) = 1. -1 Ví dụ: Các phần tử khả nghịch trong Z9 là 1, 2, 4, 5, 7 và 8. Cho ví dụ, 4 =7 vì 4.7 1(mod 9). Thuật toán tính nghịch đảo trên Zn Input: a Zn . Output: a-1 mod n, nếu tồn tại, 1. Sử dụng thuật toán Euclidean mở rộng, tìm x và y để ax + ny = d, trong đó d = gcd(a, n). 2. Nếu d >1, thì a-1 mod n không tồn tại, Ngƣợc lại, kết quả(x). 1.2 Khái niệm Độ phức tạp của thuật toán 1.2.1 Khái niệm Thuật toán Thuật toán là một dãy hữu hạn các quy tắc ( chỉ thị, mệnh lệnh) mô tả chính xác một quá trình tính toán. Theo đó với mỗi bộ dữ liệu vào sẽ cho một kết quả ( Yêu cầu của bài toán ).[1] Các đặc trƣng của Thuật toán đơn định: - Tính đơn định: Thực hiện đúng các bƣớc của thuật toán với một dữ liệu vào thì chỉ cho duy nhất một kết quả nghĩa là ở mỗi bƣớc của thuật toán, các thao tác phải hết sức rõ ràng, không gây nên sự nhập nhằng, lộn xộn, đa nghĩa - Tính dừng: Thuật toán phải dừng và cho ra kết quả sau một số hữu hạn các bƣớc. - Tính đúng: Cho ra kết quả phù hợp yêu cầu bài toán với những dữ liệu vào đúng đắn.
- 15 - Tính phổ dụng: Thuật toán phải giải quyết đƣợc một lớp rộng các bài toán. - Tính khả thi: Thuật toán phải đƣợc máy tính thực hiện trong khoảng thời gian và điều kiện ( bộ nhớ ) cho phép. 1.2.2 Độ phức tạp của thuật toán Thông thƣờng để đánh giá thuật toán ngƣời ta dựa trên hai tiêu chuẩn sau: Tiêu chuẩn 1: Độ đơn giản, dễ hiểu, dễ cài đặt ( viết chƣơng trình ). Tiêu chuẩn 2: Sử dụng tiết kiệm tài nguyên hệ thống và với thời gian ngắn nhất. Độ phức tạp của thuật toán là phƣơng pháp đánh giá thuật toán theo hƣớng xấp xỉ tiệm cận qua các khái niệm toán học O lớn O(); o nhỏ o(); (); (). Hầu hết tất cả các thuật toán có thời gian chạy tiệm cận tới một trong các hàm sau: a. Hằng số: Hầu hết các chỉ thị của các chƣơng trình đều đƣợc thực hiện một lần hay nhiều nhất chỉ một vài lần. Nếu tất cả các chỉ thị của cùng một chƣơng trình có tính chất này thì chúng ta sẽ nói rằng thời gian chạy của nó là hằng số. Điều này hiển nhiên là điều mà ta phấn đấu để đạt đƣợc trong việc thiết kế thuật toán. b. LogN: Khi thời gian chạy của chƣơng trình là logarit tức là thời gian chạy chƣơng trình tiến chậm khi N lớn dần. Thời gian chạy thuộc loại này xuất hiện trong các chƣơng trình mà giải một bài toán lớn bằng cách chuyển nó thành một bài toán nhỏ hơn, bằng cách cắt bớt kích thƣớc một hằng số nào đó. Với mục đích của chúng ta, thời gian chạy có đƣợc xem nhƣ nhỏ hơn một hằng số ―lớn―. Cơ số của logarit làm thay đổi hằng số đó nhƣng không nhiều: Khi N là 1000 thì logN là 3 nếu cơ số là 10, là 10 nếu cơ số là 2; khi N là một triệu, logN đƣợc nhân gấp đôi. bất cứ khi nào N đƣợc nhân đôi, logN tăng lên thêm một hằng số. c. N: Khi thời gian chạy của một chƣơng trình là tuyến tính, nói chung đây là trƣờng hợp mà một số lƣợng nhỏ các xử lý đƣợc làm cho mỗi phần tử dữ liệu nhập. Khi N là một triệu thì thời gian chạy cũng cỡ nhƣ vậy. Khi N đƣợc nhân gấp đôi thì thời gian chạy cũng đƣợc nhân gấp đôi. Đây là tình huống tối ƣu cho một thuật toán mà phải xử lý N dữ liệu nhập (hay sản sinh ra N dữ liệu xuất). d. NlogN: Đây là thời gian chạy tăng dần lên cho các thuật toán mà giải một bài toán bằng cách tách nó thành các bài toán con nhỏ hơn, kế đến giải quyết chúng một cách độc lập và sau đó tổ hợp các lời giải. Chúng ta nói rằng thời gian chạy của
- 16 thuật toán nhƣ thế là ―NlogN‖. Khi N là một triệu, NlogN khoảng 20 triệu. khi N đƣợc nhân gấp đôi, thời gian chạy bị nhân lên nhiều hơn gấp nhiều đôi. e. N2: Khi thời gian chạy của một thuật toán là bậc hai, trƣờng hợp này chỉ có ý nghĩa thực tế cho các bài toán tƣơng đối nhỏ. Thời gian bình phƣơng thƣờng tăng dần lên trong các thuật toán mà xử lý tất cả các phần tử dữ liệu (có thể là hai vòng lặp lồng nhau). Khi n là một ngàn thì thời gian chạy là 1 triệu. khi N đƣợc nhân đôi thì thời gian chạy tăng lên gấp 4 lần. f. N3: Tƣơng tự, một thuật toán mà xử lý các bộ ba của các phần tử dữ liệu (có thể là 3 vòng lặp lồng nhau) có thời gian chạy bậc ba và cũng chí ý nghĩa thực tế trong các bài toán nhỏ. Khi N là một trăm thì thời gian chạy là một triệu. Khi N đƣợc nhân đôi thì thời gian chạy tăng lên gấp 8 lần. g. 2N: Một số ít thuật toán có thời gian chạy lũy thừa lại thích hợp trong một số trƣờng hợp thực tế. Khi N là hai mƣơi thì thời gian chạy là 1 triệu. khi N tăng gấp đôi thì thời gian chạy đƣợc nâng lên luỹ thừa hai! Thời gian chạy của một chƣơng trình cụ thể đôi khi là một hệ số hằng nhân với các số hạng nói trên (―số hạng dẫn đầu‖) cộng thêm một số hạng nhỏ hơn. Giá trị của hệ số hằng và các số hạng phụ thuộc vào kết quả của sự phân tích và các chi tiết cài đặt. Hệ số của số hạng dẫn đầu liên quan tới số chỉ thị bên trong vòng lặp: Ở một tầng tùy ý của thiết kế thuật toán thì phải cẩn thận giới hạn số chỉ thị nhƣ thế. Với N lớn thì các số hạng dẫn đầu đóng vai trò chủ chốt; với N nhỏ thì các số hạng cùng đóng góp vào sự so sánh các thuật toán sẽ khó khăn hơn. Trong hầu hết các trƣờng hợp, chúng ta sẽ gặp các chƣơng trình có thời gian chạy là ―tuyến tính‖, ―NlogN‖, ―bậc ba‖, với hiểu ngầm là các phân tích hay nghiên cứu thực tế phải đƣợc làm trong trƣờng hợp mà tính hiệu quả là rất quan trọng. 1.2.3 Ví dụ về việc xác định độ phức tạp của thuật toán: Ví dụ với bài toán tính tổng các số nguyên dƣơng từ 1 đến n ta có thể tính theo thuật toán sau: Input n; Tong:=0; For i:= 1 to n do Tong := Tong + i; Output Tong;
- 17 Với thuật toán này thời gian tính toán tỷ lệ thuận với n, khi n càng lớn thì thời gian càng tốn hay độ phức tạp tính toán là O(n) Nếu tính tổng các số nguyên dƣơng từ 1 đến n theo thuật toán: Input n; Tong := n*(n+1)/2; Output Tong; Thì độ phức tạp tính toán này là O(1) không phụ thuộc vào giá trị n
- 18 CHƢƠNG 2: VẤN ĐỀ MÃ HÓA 2.1 Mật mã học 2.1.1 Giới thiệu chung Mật mã học là ngành khoa học ứng dụng toán học vào việc biến đổi thông tin thành một dạng khác với mục đích che dấu nội dung, ý nghĩa thông tin cần mã hóa. Đây là một ngành quan trọng và có nhiều ứng dụng trong đời sống xã hội. Ngày nay, các ứng dụng mã hóa và bảo mật thông tin đang đƣợc sử dụng ngày càng phổ biến hơn trong các lĩnh vực khác nhau trên thế giới, từ các lĩnh vực an ninh, quân sự, quốc phòng , cho đến các lĩnh vực dân sự nhƣ thƣơng mại điện tử, ngân hàng Cùng với sự phát triển của khoa học máy tính và Internet, các nghiên cứu và ứng dụng của khoa học mật mã ngày càng trở nên đa dạng hơn, mở ra nhiều hƣớng nghiên cứu chuyên sâu vào từng lĩnh vực ứng dụng đặc thù với những đặc trƣng riêng. Ứng dụng của khoa học mật mã 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: chứng thực nguồn gốc nội dung thông tin (kỹ thuật chữ ký điện tử), chứng nhận tính xác thực về ngƣời sở hữu mã khóa (chứng nhận khóa công cộng), các quy trình giúp trao đổi thông tin và thực hiện giao dịch điện tử an toàn trên mạng Những kết quả nghiên cứu về mật mã cũng đã đƣợc đƣa vào trong các hệ thống phức tạp hơn, kết hợp với những kỹ thuật khác để đáp ứng yêu cầu đa dạng của các hệ thống ứng dụng khác nhau trong thực tế, ví dụ nhƣ hệ thống bỏ phiếu bầu cử qua mạng, hệ thống đào tạo từ xa, hệ thống quản lý an ninh của các đơn vị với hƣớng tiếp cận sinh trắc học, hệ thống cung cấp dịch vụ multimedia trên mạng với yêu cầu cung cấp dịch vụ và bảo vệ bản quyền sở hữu trí tuệ đối với thông tin số 2.1.2 Định nghĩa Mật mã học là sự nghiên cứu các phƣơng pháp toán học liên quan đến một số khía cạnh của thông tin nhƣ sự an toàn, sự toàn vẹn dữ liệu, sự xác nhận tồn tại và sự xác nhận tính nguyên bản của thông tin.[2]
- 19 2.2 Khái niệm hệ mật mã Một sơ đồ hệ thống mật mã là bộ năm S = (P, C, K, E, D) thỏa mãn các điều kiện: P: là một tập hữu hạn các ký tự bản rõ. C: là một tập hữu hạn các ký tự bản mã. K: là một tập hữu hạn các khóa. E: là một ánh xạ từ KxP vào C, đƣợc gọi là phép lập mật mã. D: là một ánh xạ từ KxC vào P, đƣợc gọi là phép giải mã. Với k K ta định nghĩa ek E, ek: P → C ; dk D, dk: C → P; ek, dk đƣợc gọi là hàm lập mã và hàm giải mã tƣơng ứng với khóa mật mã k. Các hàm đó phải thỏa mãn hệ thức: dk(ek(x)) = x với x P. Tính chất này bảo đảm một mẩu tin x P đƣợc mã hóa bằng luật mã hóa ek E có thể đƣợc giải mã chính xác bằng luật dk D. 2.3 Khái niệm mã hóa (Encryption), giải mã (Decryption) Mã hóa: là quá trình chuyển thông tin có thể đọc đƣợc (gọi là bản rõ) thành thông tin ―khó‖ thể đọc đƣợc theo cách thông thƣờng (gọi là bản mã). Đó là một trong những kỹ thuật để bảo mật thông tin. Giải mã: là quá trình chuyển thông tin ngƣợc lại từ bản mã thành bản rõ. Thuật toán mã hóa hay giải mã là thủ tục để thực hiện mã hóa hay giải mã. Khóa mã hóa là một giá trị làm cho thuật toán mã hóa thực hiện theo cách riêng biệt và sinh ra bản rõ riêng. Thông thƣờng khóa càng lớn thì bản mã càng an toàn. Phạm vi các giá trị có thể có của khóa đƣợc gọi là Không gian khóa. Hệ mã hóa là tập các thuật toán, các khóa nhằm che giấu thông tin, cũng nhƣ làm rõ nó. 2.4 Những tính năng của hệ mã hóa + Tính bảo mật: Bảo đảm bí mật cho các thông báo và dữ liệu bằng việc che giấu thông tin nhờ các kỹ thuật mã hóa. + Tính toàn vẹn: Bảo đảm với các bên rằng bản tin không bị thay đổi trên đƣờng truyền tin. + Chống chối bỏ: Có thể xác nhận rằng tài liệu đã đến từ ai đó, ngay cả khi họ cố gắng từ chối nó.
- 20 + Tính xác thực: Cung cấp hai dịch vụ: - Nhận dạng nguồn gốc của một thông báo, đảm bảo rằng nó là đúng sự thực. - Kiểm tra định danh của ngƣời đang đăng nhập hệ thống, tiếp tục kiểm tra đặc điểm của họ trong trƣờng hợp ai đó cố gắng kết nối và giả danh là ngƣời sử dụng hợp pháp. 2.5 Các phƣơng pháp mã hóa 2.5.1 Phƣơng pháp mã hóa đối xứng Khái niệm: Hệ mã hóa khóa đối xứng là hệ mã hóa mà biết đƣợc khóa lập mã thì có thể ―dễ‖ tính đƣợc khóa giải mã và ngƣợc lại. Đặc biệt một số hệ mã hóa có khóa lập mã và khóa giải mã trùng nhau (ke = kd), nhƣ hệ mã hóa ―dịch chuyển‖ hay DES. Hệ mã hóa khóa đối xứng còn gọi là Hệ mã hóa khóa bí mật, hay khóa riêng, vì phải giữ bí mật cả 2 khóa. Trƣớc khi dùng hệ mã hóa khóa đối xứng, ngƣời gửi và ngƣời nhận phải thỏa thuận thuật toán mã hóa và khóa chung (lập mã hay giải mã), khóa phải đƣợc bí mật. Độ an toàn của Hệ mã hóa loại này phụ thuộc vào khóa, nếu để lộ ra khóa này nghĩa là bất kỳ ngƣời nào cũng có thể mã hóa và giải mã thông báo trong hệ thống mã hóa.Sự mã hóa và giải mã của hệ thống mã hóa khóa đối xứng biểu thị bởi: Ek: P → C và Dk: C → P Hình 2.1: Mô hình hệ thống mã hõa đối xứng
- 21 Ví dụ: + Hệ mã hóa cổ điển là Mã hóa khóa đối xứng: dễ hiểu, dễ thực thi, nhƣng có độ an toàn không cao. Vì giới hạn tính toán chỉ trông phạm vi bảng chữ cái, sử dụng trong bản tin cần mã, ví dụ Z26 nếu dùng các chữ cái tiếng anh. Với hệ mã hóa cổ điển, nếu biết khóa lập mã hay thuật toán lập mã, có thể ―dễ‖ xác định đƣợc bản rõ, vì ―dễ‖ tìm đƣợc khóa giải mã. + Hệ mã hóa DES (1973) là Mã hóa khóa đối xứng hiện đại, có độ an toàn cao. Ưu điểm: Hệ mã hóa khóa đối xứng mã hóa và giải mã nhanh hơn Hệ mã hóa khóa công khai. Nhược điểm: (i). Mã hóa khóa đối xứng chƣa thật an toàn với lý do sau: Ngƣời mã hóa và ngƣời giải mã có ―chung‖ một khóa. Khóa phải đƣợc giữ bí mật tuyệt đối, vì biết khóa này ―dễ‖ xác định đƣợc khóa kia và ngƣợc lại. (ii). Vấn đề thỏa thuận khóa và quản lý khóa chung là khó khăn và phức tạp. Ngƣời gủi và ngƣời nhận phải luôn thống nhất với nhau về khóa. Việc thay đổi khóa là rất khó và dễ bị lộ. Khóa chung phải đƣợc gửi cho nhau trên kênh an toàn. Mặt khác khi hai ngƣời (lập mã, giải mã) cùng biết ―chung‖ một bí mật, thì càng khó giữ đƣợc bí mật! Nơi sử dụng hệ mã hóa khóa đối xứng. Hệ mã hóa khóa đối xứng thƣờng đƣợc sử dụng trong môi trƣờng mà khóa chung có thể dễ dàng trao chuyển bí mật, chẳng hạn trong cùng một mạng nội bộ. Hệ mã hóa khóa đối xứng thƣờng dùng để mã hóa những bản tin lớn, vì tốc độ mã hóa và giải mã nhanh hơn hệ mã hóa công khai. 2.5.1.1 Mã khối (Block cipher) Mật mã khối đƣợc cấu trúc trên nguyên tắc là bản tin đƣợc chia thành các khối có độ dài bằng nhau và việc mã hoá tiến hành theo từng khối độc lập nhau. Trong môi trƣờng máy tính độ dài của khối đƣợc tính bằng bit. Độ bảo mật của mã trong trƣờng hợp này phụ thuộc vào độ dài của khối và độ phức tạp của thuật toán mã. Nếu kích cỡ của khối quá bé thì việc giải mã không mấy khó khăn do dò tìm đƣợc đặc tính cấu trúc thống kê của bản tin rõ. Nếu tăng
- 22 kích thƣớc khối thì mức độ cấu trúc thống kê cũng tăng theo số mũ và nếu kích cỡ khối tiến đến đoạn tin thì tác dụng mã khối sẽ giảm.[2] Các phương pháp ứng dụng của mật mã khối : Mật mã khối xử lý các khối dữ liệu có độ dài cố định và độ dài bản tin có thể bất kỳ. Có bốn phƣơng pháp ứng dụng mã khối thƣờng gặp trong hệ thống truyền tin và số liệu truyền tin:[3] a. Phƣơng pháp dùng từ điển điện tử, còn gọi là mật mã ECB (Electronic CodeBook) Mật mã ECB sử dụng trực tiếp thuật toán để mã hóa từng khối tin một. Mật mã ECB sử dụng từ điển điện tử có một số giới hạn nhất định bởi vì trong các ứng dụng thực tế có những mấu đoạn tin có xu hƣớng lặp lại. Ngay các đoạn tin từ các máy tính cũng có tính chất lặp lại, nó có thể chứa những dãy 0 hoặc khoảng trống. Các định nghĩa về thể thức cho các tham số là các giá trị hằng số, đoạn tin có khuôn dạng cố định với các dữ liệu quan trọng luôn cùng vị trí. Đối phƣơng có thể sử dụng các dạng dữ liệu tƣơng tự để phát hiện các tính quy luật. Mặt khác sự yếu kém của mã còn ở chỗ các khối tin đƣợc mã hóa riêng rẽ, chúng không có quan hệ với nhau. b. Phƣơng pháp móc xích các khối đã đƣợc mã hoá, còn gọi là mật mã CBC (Cipher Block Chaining) Phƣơng pháp mật mã CBC sử dụng đầu ra của phép toán mã hóa để biến đổi đầu vào tiếp theo. Nhƣ vậy mỗi một khối đƣợc mã hóa không những chỉ phụ thuộc vào đoạn tin rõ tƣơng ứng mà còn phụ thuộc vào tất cả các khối của đoạn tin rõ trƣớc nó. Hình 2.2: Mô tả sơ đồ chức năng của mật mã CBC(mã hóa và giải mã).
- 23 Tất cả các phép toán đƣợc thực hiện với 64 bit song song. Phần bên trái của hình vẽ đặc trƣng cho sự móc xích khối dữ liệu đã đƣợc mã hóa ở đầu ra với khối dữ liệu rõ ở đầu vào. Trừ khối đầu tiên, mỗi một khối trƣớc khi mã hóa sẽ đƣợc cộng modul -2 với khối đã đƣợc mã hóa trƣớc đó, tức khối thứ n đƣợc mã hóa thành Cn phụ thuộc vào tất cả các khối dữ liệu rõ P1 Pn. Phần bên phải của hình vẽ là quá trình giải mã theo phƣơng pháp ngƣợc lại. Ở đây, sau khi giải mã sẽ thực hiện phép công modul-2 với khối đã đƣợc mã hóa trƣớc đó để có dữ liệu rõ ban đầu. Trong quá trình thực hiện, mỗi một bit của khối dữ liệu vào, Pn đƣợc cộng modul-2 với 1 bit tƣơng ứng của khối dữ liệu đã đƣợc mã hóa trƣớc đó, Cn-1. Trong quá trình thực hiện phép toán có thể thực hiện theo phƣơng pháp nối tiếp hoặc song song từng byte một. Có thể giải thích phƣơng pháp mật mã CBC nhƣ sau: Với phép mã hóa: Cn = Ek(Pn ⊕ Cn-1) Với phép giải mã: Qr = Dk(Cn)⊕ Cn-1. Phƣơng pháp mật mã CBC có thể đƣợc đặc trƣng nhƣ một sự phản hồi bản tin đã mã hóa về phía phát và một sự phản hồi về phía thu. Quá trình phản hồi đó dẫn đến 1 điều cần lƣu ý là nếu có 1 bit lỗi trong bản tin sẽ dẫn đến tất cả các khối dữ liệu có quan hệ với khối đó đều bị lỗi. Mật mã CBC đƣợc xây dựng trên cơ sở các khối dữ liệu có quan hệ móc xích với nhau, nhằm khắc phục nhƣợc điểm của phƣơng pháp dùng từ điển. Điều đó chỉ đúng bắt đầu từ khối dữ liệu thứ hai, còn khối dữ liệu đầu tiên lại phụ thuộc vào giá trị khởi đầu (IV). Nếu nhƣ giá trị khởi đầu luôn là hằng số với tất cả các bản tin thì điều đó tạo tính quy luật đối phƣơng dễ phát hiện. Trong thực tế truyền tin các giá trị khởi đầu luôn đƣợc thay đổi và ngƣời ta cũng tránh việc dùng cùng giá trị khởi đầu và cùng khóa mã nhiều lần cho các bản tin đƣợc truyền. c. Phƣơng pháp phản hồi bản tin đã mã hoá, còn gọi là mật mã CFB (Cipher feedblack) Dữ liệu đƣợc xử lý và đƣợc truyền dƣới nhiều dạng khác nhau, chúng có thể dƣới dạng các bản tin hoàn chỉnh, các khối dữ liệu, các gói, các ký tự riêng rẽ, theo byte hoặc theo bit. Khi phải xử lý các đoạn tin theo byte hoặc theo bit, ngƣời ta thƣờng sử dụng một phƣơng pháp mật mã dƣới dạng phản hồi đoạn tin đã mã hóa, đƣợc gọi là mật mã CFB. Yêu cầu ở đây là các byte dữ liệu khi xuất hiện ra đƣờng truyền cần đƣợc mã hóa ngay và việc mã hóa đó không ảnh hƣởng đến sự chậm tốc độ truyền. Ở phía giải mã cũng có yêu cầu giải mã ngay khi một byte dữ liệu đến.
- 24 Việc mã hóa chuỗi các ký tự đƣợc thực hiện theo phƣơng pháp cộng modul-2 ký tự lấy ở đầu ra của thuật toán DES với ký tự bản tin rõ để tạo thành một ký tự đƣợc mã hóa. Ở phía thu cùng thực hiện phép cộng modul-2 của cùng ký tự lấy từ đầu ra của DES với ký tự đã đƣợc mã hóa để có ký tự của bản tin rõ. Cấu trúc hệ thống nhƣ vậy đảm bảo rằng, dữ liệu đƣợc bổ sung thêm là hoàn toàn giả ngẫu nhiên. Trong khi phƣơng pháp mật mã CBC thực hiện trên các khối dữ liệu hoàn chỉnh thì phƣơng pháp CFB thực hiện mỗi lần theo một ký tự và chiều dài m có thể đƣợc chọn nhƣ một thông số trƣớc kia. Chiều dài m nhỏ nhất là 1 bit và trƣờng hợp này là mật mã CFC một bit. Về nguyên lý, giá trị m có thể từ 1 đến 64. Hiện nay trên các hệ truyền tin phổ biến nhất là sử dụng m=8. Cũng giống nhƣ mật mã CBC, phƣơng pháp mật mã CFB liên kết các ký tự với nhau và làm cho bản tin đƣợc mã hóa vào toàn bộ bản tin rõ. Khởi đầu thực hiện CFB thì thanh ghi dịch chuyển cũng phải có một giá trị khởi đầu, Thƣờng sử dụng các giá trị khác nhau IV cho mỗi đoạn tin và trong thời gian thực hiện một vòng khóa mã để tránh đặc tính chu kỳ. Các giá trị IV có thể truyền tin công khai bởi chúng đã trải qua phép toán mã hóa. Mật mã CFB cũng đƣợc sử dụng để mã hóa một chuỗi các ký tự mà mỗi ký tự đƣợc biểu thị bởi m bit. Trong một tập nhƣ thế, mỗi ký tự là một số nằm trong khoảng 0 và n-1 với n =2m. Các ký tự rõ cũng nhƣ ký tự đã mã hóa đều nằm trong khoảng đó. Cũng có một số mã kí hiệu không nằm trong khoảng 2m giá trị. Ví dụ trong trƣờng hợp chỉ sử dụng các số thập phân 0, 1, , 9. Một tập các giá trị nhƣ vậy cần lƣu ý tránh các giá trị nhị phân tƣơng ứng với các kí tự điều khiển. Ví dụ mã ASCII có các giá trị kí tự điều khiển nhƣ: khởi đầu bản tin, kết thúc bản tin, bắt buộc thu, phát, thoát khỏi mà điều đó dẫn đến hiểu nhầm là thể thức truyền dẫn mạng. Nếu n=2m thì có thể sử dụng mật mã CFB bình thƣờng. Trong trƣờng hợp phải mã hóa các ký tự m bit với m là số nguyên khá nhỏ và n<2m thì việc mã hóa và giải mã có hơi khác một ít. d. Phƣơng pháp phản hồi đầu ra, còn gọi là OFB (Output Feedblack) Trong số 3 phƣơng pháp mật mã đƣợc giới thiệu trên thì phƣơng pháp mật mã ECB sử dụng hạn chế, còn 2 phƣơng pháp mật mã CBC và CFB đƣợc sử dụng tƣơng đối thông dụng. Có một phƣơng pháp đƣợc dành riêng cho các ứng dụng mà quá trình truyền tin chấp nhận một sai số nào đó. Đó là phƣơng pháp mật mã phản hồi từ đầu ra, OFB. Mật mã OFB thƣờng đƣợc sử dụng trong truyền tín hiệu số hóa
- 25 âm thanh hoặc số hóa hình ảnh dƣới dạng điều chế mã xung PCM, trên nền nhiễu bị sai số. Mã OFB sử dụng phƣơng thức mã hóa kiểu Vernam, chỉ có nguồn giả ngẫu nhiên là mới. Cấu trúc của mã gần giống nhƣ mã CFB vì nó có thể đƣợc sử dụng với các dãy ký tự m bit với m trong khoảng 1 đến 64. Mật mã OFB có phƣơng thức thực hiện phản hồi. Chuỗi giả ngẫu nhiên đƣợc lấy từ mã DES và đƣợc phản hồi về chính nó. Việc đồng bộ cho các bộ tạo giả ngẫu nhiên ở hai đầu đƣờng truyền ở đây cần đƣợc chú ý. Nếu nhƣ việc đồng bộ không đảm bảo thì bản tin rõ sau khi mã hóa ở phía đầu thu cũng sẽ có dạng ngẫu nhiên. Để tạo lại đồng bộ ở phƣơng pháp mã OFB thì các thanh ghi dịch chuyển phải đƣợc nạp các giá trị giống nhau. Các giá trị khởi đầu có thể gửi dƣới dạng dữ liệu rõ bởi vì nếu đối phƣơng nếu biết thì cũng không thể tạo đƣợc dãy giả ngẫu nhiên. Dãy giả ngẫu nhiên ở đây đƣợc cộng modul-2 với đoạn tin trong phép toán mã hóa và giải mã còn đƣợc gọi là dòng khóa (key stream). Các phƣơng pháp ứng dụng của mật mã khối trên đƣợc phát triển mạnh sau khi xuất hiện mã DES. Trên thƣc tế có thể có những phƣơng pháp khác, nhƣng bốn phƣơng pháp trên đƣợc ứng dụng phổ biến và cũng khá đầy đủ. 2.5.1.2 Mã dòng Một hệ mã dòng là một bộ (P, C, K, L, F, E, D) thoả mãn các điều kiện sau đây: + P là một tập hữu hạn các bản rõ. + C là một tập hữu hạn các bản mã. + K là một tập hữu hạn các khoá chính. + L là một tập hữu hạn các khoá dòng. + F = {f1, f2, } là bộ sinh khoá dòng; fi = K L i-1 P i-1 → L Với mỗi z L có một hàm lập mã ez E: P → C và một hàm giải mã dz D : C → P sao cho dz(ez(x)) = x với mọi x P. Nếu bộ sinh dòng khoá không phụ thuộc vào bản rõ, thì ta gọi mã dòng đó là đồng bộ, trong trƣờng hợp đó, K nhƣ là hạt giống để sinh ra dòng khoá z1, z2, . Nếu zi+d = zi thì mã dòng đƣợc gọi là tuần hoàn chu kỳ d. Trong thực tế, mã dòng thƣờng đƣợc dùng với các văn bản nhị phân, tức là: P = C = Z2 = {0, 1}, các phép lập mã và giải mã là:
- 26 ez(x) = x + z mod 2 dz (y) = y + z mod 2 2.5.2 Phƣơng pháp mã hóa công khai Khái niệm: Mã hoá bằng khoá công khai (MHKCK - public-key) dùng để gửi dữ liệu một cách an toàn qua các mạng không an toàn nhƣ Internet. Cách mã hoá này làm cho những cặp mắt tò mò không thể đọc đƣợc dữ liệu. Mỗi ngƣời dùng đều có hai khoá, một khoá công khai, một khoá riêng. Khoá công khai đƣợc giữ trong một thƣ mục. Ai cũng có thể truy cập khoá này để mã hoá một thông điệp trƣớc khi gửi tới ngƣời có khoá riêng tƣơng ứng. Còn khoá riêng thì chỉ ngƣời nhận mới có thể truy cập đƣợc và dùng nó để giải mã thông điệp. Hình 2.3: Mô hình hệ thống mã hóa công khai Ví dụ: +) Hệ mật mã công khai RSA đƣợc đƣa ra năm 1977 là công trình nghiên cứu của ba đồng tác giả Ronald Linn Revest, Adi Shamir, Leonard Aldeman. Hệ mật mã đƣợc xây dựng dựa trên tính khó giải của bài toán phân tích một số thành thừa số nguyên tố hay còn gọi là bài toán RSA. +)Hệ mật mã công khai ElGamal đƣợc đƣa ra năm 1978. Hệ mật mã này đƣợc xây dựng dựa trên bài toán khó giải của bài toán logarit rời rạc
- 27 +) Hệ mật mã công khai Merkle-Helman (xếp ba lô) đƣợc xây dựng trên cơ sở của bài toán tổng hợp con. Mã hóa công khai dựa trên nguyên tắc hoạt động của 2 loại hàm: +) Hàm một phía Hàm f(x) đƣợc gọi là hàm một phía nếu tính “xuôi” y = f(x) thì “dễ”, nhƣng tính “ngược” x = f 1 (y) lại rất “khó”. Ví dụ: Hàm f(x) = g x (mod p), với p là số nguyên tố lớn, (g là phần tử nguyên thủy mod p) là hàm một phía. +) Hàm một phía cửa sập Hàm f(x) đƣợc gọi là hàm của sập một phía nếu tính y = f(x) thì “dễ”, tính x = f (y) lại rất “khó” . Tuy nhiên có cửa sổ sập z để tính x = f (y) là “dễ”. Ví dụ: Hàm f(x) = x a (mod n) (với n là tích của hai số nguyên tố lớn n = p*q) là hàm một phía. Nếu chỉ biết a và n thì tính x = f (y) rất “khó” , nhƣng nếu biết cửa sập p và q,, thì tính đƣợc f (y) là khá “dễ”. Ƣu điểm: Khi áp dụng hệ thống mã hóa công cộng, ngƣời A sẽ sử dụng mã hóa công cộng để mã hóa thông điệp gửi cho ngƣời B. Nếu ngƣời C phát hiện thông điệp mà A gửi cho B, kết hợp thông tin về mã khóa công cộng đã đƣợc công bố, cũng rất khó có khả năng giải mã đƣợc thông điệp này do không nắm đƣợc mã khóa riêng của B. Các phƣơng pháp mã hóa công cộng giúp cho việc trao đổi mã khóa trở nên dễ dàng hơn. Nội dung của khóa công cộng không cần phải giữ bí mật trong các phƣơng pháp mã hóa quy ƣớc. Ngƣời mã hóa dùng khóa công khai, ngƣời giải mã dùng khóa bí mật. Khả năng lộ khóa bí mật khó hơn vì chỉ có một ngƣời giữ. Nếu thám mã biết khóa công khai, cố gắng tím khóa bí mật thì sẽ phải đƣơng đầu với bài toán ―khó‖. Thuật toán đƣợc viết một lần, công khai cho nhiều lần dùng, cho nhiều ngƣời dùng, họ chỉ cần giữ bí mật cho khóa riêng của mình.
- 28 Nhƣợc điểm: Tốc độ xử lý chậm hơn mã hóa đối xứng Để có mức an toàn tƣơng đƣơng với một phƣơng pháp mã hóa quy ƣớc, một phƣơng pháp mã hóa khóa công cộng phải sử dụng mã khóa có độ dài lớn hơn nhiều lần mã khóa bí mật đƣợc sử dụng trong mã hóa quy ƣớc. Nơi sử dụng hệ mã hóa khóa công khai. Hệ mã hóa khóa công khai thƣờng đƣợc sử dụng chủ yếu trên các mạng công khai nhƣ Internet, khi mà việc trao đổi chuyển khóa bí mật tƣơng đối khó khăn. Đặc trƣng nổi bật của hệ mã hóa công khai là khóa công khai (public key) và bản mã (ciphertext) đều có thể gửi đi trên một kênh truyền tin không an toàn. Có biết cả khóa công khai và bản mã, thám mã cũng không dễ khám phá đƣợc bản rõ. Nhƣng vì có tốc độ mã hóa và giải mã chậm, nên hệ mã hóa khóa công khai chỉ dùng để mã hóa những bản tin ngắn, ví dụ nhƣ mã hóa khóa bí mật gửi đi. Hệ mã hóa khóa công khai thƣờng đƣợc sử dụng cho cặp ngƣời dùng thỏa thuận khóa bí mật của hệ mã hóa khóa riêng. 2.6 Chữ ký điện tử 2.6.1 Giới thiệu Chữ ký điện tử (chữ ký số) không đƣợc sử dụng nhằm bảo mật thông tin mà nhằm bảo vệ thông tin không bị ngƣời khác cố tình thay đổi để tạo ra thông tin sai lệch. Nói cách khác, chữ ký điện tử giúp xác định đƣợc ngƣời đã tạo ra hay chịu trách nhiệm đối với một thông điệp. Nhƣ vậy “ký số” trên “tài liệu số” là “ký” trên từng bít tài liệu. Kẻ gian khó thể giả mạo ―chữ ký số‖ nếu nó không biết ―khóa lập mã‖. Để kiểm tra một “chữ ký số” thuộc về một “tài liệu số”, ngƣời ta giải mã “chữ ký số” bằng ―khóa giải mã‖, và so sánh với tài liệu gốc Một phƣơng pháp chữ ký điện tử bao gồm hai thành phần chính: thuật toán dùng để tạo ra chữ ký điện tử và thuật toán tƣơng ứng để xác nhận chữ ký điện tử. Áp dụng cho các thông điệp có độ dài cố định và thƣờng tƣơng đối ngắn.
- 29 2.6.2 Định nghĩa Một phƣơng pháp chữ ký điện tử đƣợc định nghĩa là một bộ năm (P, A, K, S, V) thỏa mãn các điều kiện sau: 1. P là tập hợp hữu hạn các thông điệp. 2. A là tập hợp hữu hạn các chữ ký có thể đƣợc sử dụng. 3. K là tập hợp hữu hạn các khóa có thể sử dụng. 4. S là tập các thuật toán ký. 5. V là tập các thuật toán kiểm thử. Với mỗi khóa k K, tồn tại thuật toán chữ kí sigk S và thuật toán xác nhận chữ ký tƣơng ứng verk V. Mỗi thuật toán sigk : P A và verk : P A {true, false} là các hàm thỏa điều kiện: (2.1) Ví dụ: +) Phƣơng pháp chữ ký điện tử RSA đƣợc xây dựng dựa theo phƣơng pháp mã hóa công cộng RSA. +) Phƣơng pháp chữ ký điện tử ElGamal: đƣợc giới thiệu vào năm 1985, sau đó đƣợc sửa đổi bổ sung thành chuẩn chữ ký điện tử (Digital Signature Standard - DSS). Phƣơng pháp này đƣợc xây dựng nhằm giải quyết bài toán chữ ký điện tử. Sử dụng chữ ký 320 bit trên thông điệp 160 bit. 2.6.3 Phân loại chữ ký số 2.6.3.1 Phân loại chữ ký theo đặc trƣng kiểm tra chữ ký +). Chữ ký khôi phục thông điệp: Là loại chữ ký, trong đó ngƣời gửi chỉ cần gửi “chữ ký” , ngƣời nhận có thể khôi phục lại đƣợc thông điệp, đã đƣợc “ký” bởi “chữ ký” này. +). Chữ ký đi kèm thông điệp: Là loại chữ ký, trong đó ngƣời gửi chỉ cần gửi “chữ ký”, phải gửi kèm cả thông điệp đã đƣợc “ký” bởi “chữ ký” này. Ngƣợc lại, sẽ không có đƣợc thông điệp gốc.
- 30 Ví dụ:Chữ ký Elgamal là chữ ký đi kèm thông điệp, sẽ trình bày trong mục sau. 2.6.3.2 Phân loại chữ ký theo mức an toàn +). Chữ ký “không thể phủ nhận”: Nhằm tránh việc nhân bản chữ ký để sử dụng nhiều lần, tốt nhất là ngƣời gửi tham gia trực tiếp vào việc kiểm thử chữ ký. Điều đó đƣợc thực hiện bằng một giao thức kiểm thử, dƣới dạng một giao thức mời hỏi và trả lời. Ví dụ: Chữ ký không phủ định (Chaum- van Antverpen), trình bày trong mục sau. +). Chữ ký “một lần”: Để bảo đảm an toàn, ―Khóa ký‖ chỉ dùng 1 lần (one - time) trên 1 tài liệu. Ví dụ: Chữ ký một lần Lamport. Chữ ký Fail - Stop (Van Heyst & Pedersen). 2.6.3.3 Phân loại chữ ký theo ứng dụng đặc trƣng Chữ ký ―mù‖ (Blind Signature). Chữ ký ―nhóm‖ (Group Signature). Chữ ký ―bội‖ (Multy Signature). Chữ ký ―mù nhóm‖ (Blind Group Signature). Chữ ký ―mù bội‖ (Blind Multy Signature). 2.7 Hàm băm mật mã 2.7.1 Giới thiệu về hàm băm Hàm băm mật mã là hàm toán học chuyển đổi một thông điệp có độ dài bất kỳ thành một dãy bit có độ dài cố định (tùy thuộc vào thuật toán băm). Dãy bit này đƣợc gọi là thông điệp rút gọn (message digest) hay giá trị băm (hash value), đại diện cho thông điệp ban đầu. Hàm băm h không phải là một song ánh. Do đó với thông điệp x bất kỳ, tồn tại thông điệp x’ x sao cho h(x) = h(x’). Lúc này, ta nói rằng ―có sự đụng độ xảy
- 31 ra‖. Hàm băm h đƣợc gọi là an toàn (hay ―ít bị đụng độ‖) khi không thể xác định đƣợc (bằng cách tính toán) cặp thông điệp x và x’ thỏa mãn x x’ và h(x) = h(x’). Trên thực tế, các thuật toán băm là hàm một chiều, do đó rất khó để xây dựng lại thông điệp ban đầu từ thông điệp rút gọn. Hàm băm giúp xác định đƣợc tính toàn vẹn dữ liệu của thông tin: mọi thay đổi, dù là rất nhỏ, trên thông điệp cho trƣớc , ví dụ nhƣ đổi giả trị 1 bit, đều làm thay đổi thông điệp rút gọn tƣơng ứng. Tính chất này hữu ích trong việc phát sinh, kiểm tra chữ ký điện tử, các đoạn mã chứng nhận thông điệp, phát sinh số ngẫu nhiên, tạo ra khóa cho quá trình mã hóa 2.7.2 Tính chất hàm băm +) Tính chất 1: Hàm băm h là không va chạm yếu. Ví dụ: Xét kiểu tấn công nhƣ sau: Kiểu tấn công theo tính chất 1. Hình 2.4: Cách đi đúng của thông tin : thông tin đƣợc truyền đúng từ A đến B Hình 2.5: Thông tin bị lấy trộm và bị thay đổi trên đƣờng truyền
- 32 * Kiểu tấn công theo tính chất 1: + Ngƣời A gửi cho ngƣời B bản tin (x, y) với y= sigK (h(x)). B không nhận đƣợc (x, y) vì: trên đƣờng truyền, tin bị lấy trộm. Tên trộm, bằng cách nào đó tìm đƣợc một bản tin x’≠ x nhƣng lại có h(x’) = h(x). Hắn thay thế x bằng x’, và chuyển tiếp (x’, y) cho B. + Ngƣời B nhận đƣợc (x’, y) và vẫn xác thực đƣợc thông tin đúng đắn. Do đó, để tránh kiểu tấn công nhƣ trên, hàm h phải thỏa mãn tính chất: không va chạm yếu. * Khái niệm: Hàm băm không va chạm yếu. Hàm băm h đƣợc gọi là không va chạm yếu, nếu cho trƣớc bức điện x, ―khó‖ thể tính toán để tìm ra bức điện x’≠ x mà h(x’) = h(x). +) Tính chất 2: Hàm băm h là không va chạm mạnh. Ví dụ: Xét kiểu tấn công nhƣ sau: Kiểu tấn công theo tính chất 2. + Đầu tiên, tên giả mạo tìm đƣợc hai thông điệp khác nhau x’ và x (x’ ≠ x) mà có h(x) = h(x’). (Coi bức thông điệp x là hợp lệ, x’ là giả mạo). + Tiếp theo, hắn thuyết phục ông A ký vào bản tóm lƣợc h(x) để nhận đƣợc y. Khi đó (x’, y) là bức điện giả mạo nhƣng hợp lệ vì h(x) = h(x’). Để tránh tấn công kiểu này, hàm h phải thỏa mãn tính chất: không va chạm mạnh. * Khái niệm: Hàm băm không va chạm mạnh. Hàm băm b đƣợc gọi là không va chạm mạnh nếu ―khó‖ thể tính toán để tìm ra hai bức thông điệp khác nhau x’ và x (x’ ≠ x) mà có h(x’) = h(x). +) Tính chất 3: Hàm băm h là hàm một chiều. Ví dụ: Xét kiểu tấn công nhƣ sau: Kiểu tấn công theo tính chất 3. + Ngƣời A gửi cho B thông tin (x, z, y) với z = h(x), y = sigK(z) + Giả sử tên giả mạo tìm đƣợc bản tin x’, đƣợc tính ngƣợc từ bản tóm lƣợc z = h(x). + Tên trộm thay thế bản tin x hợp lệ bằng bản tin x’ giả mạo nhƣng lại có z = h(x’). Hắn ta ký số trên bản tóm lƣợc z của x’ bằng đúng chữ ký hợp lệ. Nếu làm nhƣ vậy thì (x’, z, y) là bức điện giả mạo nhƣng hợp lệ.
- 33 Để tránh đƣợc kiểu tấn công này, hàm băm h cần thỏa mãn tính chất một chiều. * Khái niệm: Hàm băm một chiều. Hàm băm h đƣợc gọi là hàm một chiều nếu khi cho trƣớc một bản tóm lƣợc thông báo z thì ―khó thể‖ tính toán để tìm ra thông điệp ban đầu x sao cho h(x) = z. 2.7.3 Cấu trúc của hàm băm Cho trƣớc một thông điệp M có độ dài bất kỳ. Tùy theo thuật toán đƣợc sử dụng, chúng ta có thể cần bổ sung một số bit vào thông điệp này để nhận đƣợc thông điệp có độ dài là bội số của một hằng số cho trƣớc. Chia nhỏ thông điệp thành từng khối có kích thƣớc bằng nhau: M1, M2, , Ms. Gọi H là trạng thái có kích thƣớc n bit, f là ―hàm nén‖ thực hiện thao tác trộn khối dữ liệu với trạng thái hiện hành +) Khởi gán H0 bằng một vector khởi tạo nào đó +) Hi = f (Hi-1, Mi) với i = 1,2,3, ,s Hs chính là thông điệp rút gọn của thông điệp M ban đầu 2.7.4 Một số phƣơng pháp băm 2.7.4.1 Hàm băm MD4 - Hàm băm MD4 đƣợc giáo sƣ Ron Rivest đề nghị vào năm 1990. Vào năm 1992, phiên bản cải tiến MD5 của thuật toán này ra đời. - Thông điệp rút gọn có độ dài 128 bit. - Năm 2004, nhóm tác giả Xiaoyu Wang, Dengguo Feng, Xuejia Lai và Hongbo Yu đã công bố kết quả về việc phá vỡ thuật toán MD4 và MD5 bằng phƣơng pháp tấn công đụng độ . - INPUT: Thông điệp có độ dài tùy ý - OUTPUT: Bản băm, đại diện cho thông điệp gốc, độ dài cố định 128 bit. Mô tả thuật toán: Giả sử đầu vào là một xâu a có độ dài b bit (b có thể bằng 0) Bƣớc 1: Khởi tạo các thanh ghi
- 34 Có 4 thanh ghi đƣợc sử dụng để tính toán nhằm đƣa ra các đoạn mã: A, B, C, D. Bản tóm lƣợc của thông điệp đƣợc xây dựng nhƣ sự kết nối của các thanh ghi. Mỗi thanh ghi có độ dài 32 bit. Các thanh ghi này đƣợc khởi tạo giá trị hecxa. word A := 67 45 23 01 word B := ef cd ab 89 word C := 98 ba dc fe word D := 10 32 54 76 Bước 2: Xử lý thông điệp a trong 16 khối word, có nghĩa là xử lý cùng một lúc 16 word = 512 bit (chia mảng M thành các khối 512 bit, đƣa từng khối 512 bit đó vào mảng T[j]). Mỗi lần xử lý một khối 512 bit. Lặp lại N/16 lần. 2.7.4.2 Hàm băm MD5 MD5 đƣợc công bố năm 1991. MD5 dùng bốn vòng thay cho ba và châm hơn 30% so với MD4 (khoảng 0.9 MB/giây trên cùng một máy). INPUT: Thông điệp (văn bản có độ dài tùy ý). OUTPUT: Bản băm, đại diện cho thông điệp gốc, độ dài cố định 128 bit Mô tả thuật toán: Các bƣớc 1, 2 của MD5 tƣơng tự nhƣ của MD4. Bước 3: Thực hiện bốn vòng băm Đầu tiên, bốn biến A, B, C, D đƣợc khởi tạo. Những biến này đƣợc gọi là chaining variables. Bốn chu kỳ biến đổi trong MD5 hoàn toàn khác nhau và lần lƣợt sử dụng các hàm F, G, H và I. Mỗi tham số X, Y, Z là các từ 32 bit và kết quả là một từ 32 bit. F(X, Y, Z) = (X Y) (( X) Z) G(X, Y, Z) = (X Z) (Y ( Z)) H(X, Y, Z) = X Y Z I(X, Y, Z) = Y (X ( Z))
- 35 Thông điệp ban đầu x sẽ đƣợc mở rộng thành dãy bit X có độ dài là bội số của 512. Một bit 1 đƣợc thêm vào sau dãy bit x, tiếp đến là dãy gồm d bit 0 và cuối cùng là dãy 64 bit l biểu diễn độ dài thông điệp x. Dãy gồm d bit 0 đƣợc thêm vào sao cho dãy X có độ dài là bội số của 512. Quy trình này đƣợc thể hiện trong thuật toán xây dựng dãy bit X từ dãy bit x: Đơn vị xử lý trong MD5 là các từ 32-bit nên dãy X sẽ đƣợc biểu diễn thành dãy các từ X[i] 32 bit: X = X[0] X[1] X[N-1] với N là bội số của 16. Định nghĩa các hàm: với Mj là M[j] và hằng số ti xác định theo công thức: Ƣu điểm: - Thêm chu kỳ thứ 4 để tăng mức độ an toàn.
- 36 - Mỗi bƣớc trong từng chu kỳ chịu ảnh hƣởng kết quả bƣớc biến đổi trƣớc đó nhằm tăng nhanh tốc độ của hiệu ứng lan truyền. - Các hệ số dịch chuyển xoay vòng trong mỗi chu kỳ đƣợc tối ƣu hóa nhằm tăng tốc độ hiệu ứng lan truyền. Ngoài ra, mỗi chu kỳ sử dụng bốn hệ số dịch chuyển khác nhau. - Hàm G ở chu kỳ 2 của MD4 : G(X, Y, Z) = ((X Y) (X Z) (Y Z)) đƣợc thay thế bằng ((X Z) (Y Z)) nhằm giảm tính đối xứng. 2.7.4.3 Hàm băm Chuẩn SHA Chuẩn hàm băm SHA phức tạp và chậm hơn dòng MD. SHA đƣợc thiết kế để chạy trên máy kiến trúc endian lớn hơn là trên máy endian nhỏ. SHA tạo ra bản tóm lƣợc thông điệp có kích thƣớc 160 bit, sử dụng 5 thanh ghi 32 bit. INPUT : Thông điệp (văn bản) có độ dài tùy ý OUTPUT: Bản băm, đại diện cho thông điệp gốc, độ dài cố định 160 bit. Các thuật toán hàm băm SHA gồm 2 bƣớc: tiền xử lý và tính toán giá trị băm. + Bƣớc tiền xử lý bao gồm các thao tác: - Mở rộng thông điệp - Phân tích thông điệp đã mở rộng thành các khối m bit - Khởi tạo giá trị băm ban đầu + Bƣớc tính toán giá trị băm bao gồm các thao tác: - Làm N lần các công việc sau: +) Tạo bảng phân bố thông điệp (message schedule) từ khối thứ i. +) Dùng bảng phân bố thông điệp cùng với các hàm, hằng số, các thao tác trên từ để tạo ra giá trị băm i. - Sử dụng giá trị băm cuối cùng để tạo thông điệp rút gọn. Thông điệp M đƣợc mở rộng trƣớc khi thực hiện băm,nhằm đảm bảo thông điệp mở rộng có độ dài là bội số của 512 hoặc 1024 bit tùy thuộc vào thuật toán. Sau khi thông điệp đã mở rộng, thông điệp cần đƣợc phân tích thành N khối m-bit trƣớc khi thực hiện băm.
- 37 Đối với SHA-1 và SHA-256, thông điệp mở rộng đƣợc phân tích thành N (1) (2) khối 512-bit M , M , , M( N). Do đó 512 bit của khối dữ liệu đầu vào có thể đƣợc (i) thể hiện bằng 16 từ 32-bit, M0(i) chứa 32 bit đầu của khối thông điệp i, M1 chứa 32 bit kế tiếp, Đối với SHA-384 và SHA-512, thông điệp mở rộng đƣợc phân tích thành N khối 1024-bit M(1), M(2), , M(N). Do đó 1024 bit của khối dữ liệu đầu vào có thể (i) (i) đƣợc thể hiện bằng 16 từ 64-bit, M0 chứa 64 bit đầu của khối thông điệp i, M1 chứa 64 bit kế tiếp, Với mỗi thuật toán băm an toàn, giá trị băm ban đầu H(0) phải đƣợc thiết lập. Kích thƣớc và số lƣợng từ trong H(0) tùy thuộc vào kích thƣớc thông điệp rút gọn. Các cặp thuật toán SHA-224 và SHA-256; SHA-384 và SHA-512 có các thao tác thực hiện giống nhau, chỉ khác nhau về số lƣợng bit kết quả của thông điệp rút gọn. Nói cách khác, SHA-224 sử dụng 224 bit đầu tiên trong kết quả thông điệp rút gọn sau khi áp dụng thuật toán SHA256. Tƣơng tự SHA-384 sử dụng 384 bit đầu tiên trong kết quả thông điệp rút gọn sau khi áp dụng thuật toán SHA-512. Trong hàm băm SHA, chúng ta cần sử dụng thao tác quay phải một từ, ký hiệu là ROTR, và thao tác dịch phải một từ, ký hiệu là SHR. Mỗi thuật toán có bảng hằng số phân bố thông điệp tƣơng ứng. Kích thƣớc bảng hằng số thông điệp (scheduleRound) của SHA-224 và SHA-256 là 64, kích thƣớc bảng hằng số thông điệp của SHA-384 và SHA-512 là 80. Trong hàm băm SHA-224 và SHA-256, chúng ta cần sử dụng các hàm: Trong hàm băm SHA-384 và SHA-512, chúng ta cần sử dụng các hàm sau:
- 38 Nhận xét 3 Chuẩn SHS đặc tả 5 thuật toán băm an toàn SHA-1, SHA-224 , SHA-256, SHA-84 và SHA-512. Bảng 2.1 thể hiện các tính chất cơ bản của bốn thuật toán băm an toàn. Sự khác biệt chính của các thuật toán là số lƣợng bit bảo mật của dữ liệu đƣợc băm – điều này có ảnh hƣởng trực tiếp đến chiều dài của thông điệp rút gọn. Khi một thuật toán băm đuợc sử dụng kết hợp với thuật toán khác đòi hỏi phải cho kết quả số lƣợng bit tƣơng ứng. Ví dụ, nếu một thông điệp đƣợc ký với thuật toán chữ ký điện tử cung cấp 128 bit thì thuật toán chữ ký đó có thể đòi hỏi sử dụng một thuật toán băm an toàn cung cấp 128 bit nhƣ SHA-256. Ngoài ra, các thuật toán khác nhau về kích thƣớc khối và kích thƣớc từ đƣợc sử dụng. Bảng 2.1: Các tính chất của các thuật toán băm an toàn
- 39 CHƢƠNG 3: THUẬT TOÁN MÃ HÓA RIJNDAEL VÀ ỨNG DỤNG 3.1 Giới thiệu Phƣơng pháp Rijndael do Vincent Rijmen và Joan Daeman đƣa ra. Thuật toán đƣợc đặt tên là "Rijndael" khi tham gia cuộc thi thiết kế AES(Tiêu chuẩn mã hóa tiên tiến). Đƣợc Viện Tiêu chuẩn và Công nghệ Hoa Kỳ (National Institute of Standards and Technology – NIST) chọn làm chuẩn mã hóa nâng cao (Advanced Encryption Standard) từ 02 tháng 10 năm 2000. Là phƣơng pháp mã hóa theo khối (block cipher) có kích thƣớc khối và mã khóa thay đổi linh hoạt với các giá trị 128, 192 hay 256 bit. Phƣơng pháp này thích hợp ứng dụng trên nhiều hệ thống khác nhau từ các thẻ thông minh cho đến các máy tính cá nhân. 3.2 Tham số, ký hiệu, thuật ngữ và hàm - AddroundKey: Phép biến đổi sử dụng trong mã hóa và giải mã, thực hiện việc cộng mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của mã khóa của chu kỳ bằng với kích thƣớc của trạng thái. - SubBytes: Phép biến đổi sử dụng trong mã hóa, thực hành việc thay thế phi tuyến từng byte trong trạng thái hiện hành thông qua bảng thay thế (S-box). - InvSubBytes: Phép biến đổi sử dụng trong giải mã. Đây là phép biến đổi ngƣợc của phép biến đổi SubBytes. - Mixcolumns: Phép biến đổi sử dụng trong mã hóa, thực hiện thao tác trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột đƣợc xử lý độc lập. - InvMixcolumns: Phép biến đổi sử dụng giải mã. Đây là phép biến đổi ngƣợc của phép biến đổi Mixcolumns. - ShiftRows: Phép biến đổi sử dụng trong mã hóa, thực hiện việc dịch chuyển xoay vòng của trạng thái hiện hành với di số tƣơng ứng khác nhau. - InvShiftRows: Phép biến đổi sử dụng trong giải mã. Đây là phép biến đổi ngƣợc của phép biến đổi ShiftRows. - Nw: Số lƣợng byte trong một đơn vị dữ liệu ―từ‖. Trong thuật toán Rijndael, thuật toán mở rộng 256/384/512 bit và thuật toán mở rộng 512/768/1024 bit, giá trị Nw lần lƣợt là 4, 8 và 16. - K: Khóa chính.
- 40 - Nb: Số lƣợng cột (số lƣợng các từ 8 ) trong trạng thái. Giá trị Nb = 4, 6, hay 8. Chuẩn AES giới hạn lại giá trị của Nb =4. - Nk: Số lƣợng các từ(8 ) trong khóa chính. Giá trị Nk = 4, 6, hay 8. - Nr: Số lƣợng các chu kỳ, phụ thuộc vào giá trị Nk hay Nb theo công thức: Nr = max(Nb, Nk)+6 - Rcon[]: hằng của chu kỳ. -RotWord: Hàm đƣợc sử dụng trong quá trình mở rộng mã khóa, thực hiện thao tác dịch chuyển xoay vòng Nw byte thành phần của một từ. - SubWord: Hàm đƣợc sử dụng trong quá trình mở rộng mã khóa. Nhận vào một từ(Nw byte), áp dụng phép thay thế dựa vào S-box đối với từng byte thành phần và trả về từ gồm Nw byte thành phần đã đƣợc thay thế. - XOR: Phép toán Exclusive-OR. - : Phép toán Exclusive-OR. - ⊗: Phép nhân hai đa thức(mỗi đa thức có bậc < Nw) modulo cho đa thức xNw+1. - • : Phép nhân trên trƣờng hữu hạn. 3.3 Một số khái niệm toán học 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. Đơn vị thông tin đƣợc xử lý trong thuật toán Rijndael là byte . Mỗi byte xem nhƣ một phần tử của trƣờng Galois GF(28) đƣợc trang bị phép cộng (ký hiệu ) và phép nhân (ký hiệu ) Mỗi byte đƣợc biểu diễn theo nhiều cách khác nhau: Dạng nhị phân: {b7b6b5b4b3b2b1b0} Dạng thập lục phân: {h1h0} 7 i Dạng đa thức có các hệ số nhị phân bi x i 0
- 41 3.3.1 Phép cộng Phép cộng hai phần tử trên GF(28) đƣợc thực hiện bằng cách ―cộng‖ (thực chất là phép toán XOR, ký hiệu ⊕) các hệ số của các đơn thức đồng dạng của hai đa thức tƣơng ứng với hai toán hạng đang xét. Nhƣ vậy, phép cộng và phép trừ hai phần tử bất kỳ trên GF(28) là hoàn toàn tƣơng đƣơng nhau. Nếu biểu diễn lại các phần tử thuộc GF(28) dƣới hình thức nhị phân thì phép cộng giữa {a7a6a5a4a3a2a1a0} {b7b6b5b4b3b2b1b0}= {c7c6c5c4c3c2c1c0} với ci = ai bi, 0 i 7 3.3.2 Phép nhân trên GF(28) Khi xét trong biểu diễn đa thức, phép nhân trên GF(28) (ký hiệu •) 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 (irreducible polynomial) bậc 8. Đa thức đƣợc gọi là tối giản khi và chỉ khi đa thức này chỉ chia hết cho 1 và chính mình. Trong thuật toán Rijndael, đa thức tối giản đƣợc chọn là: m(x) = x8 + x4 + x3 + x + 1 (3.1) hay 1{1b} trong biểu diễn dạng thập lục phân. Kết quả nhận đƣợc là một đa thức bậc nhỏ hơn 8 nên có thể đƣợc biểu diễn dƣới dạng 1 byte. Phép nhân trên GF(28) không thể đƣợc biểu diễn bằng một phép toán đơn giản ở mức độ byte. Phép nhân đƣợc định nghĩa trên đây có tính kết hợp, tính phân phối đối với phép cộng và có phần tử đơn vị là {01}.Với mọi đa thức b(x) có hệ số nhị phân với bậc nhỏ hơn 8 tồn tại phần tử nghịch đảo của b(x), ký hiệu b-1(x) (đƣợc thực hiện bằng cách sử dụng thuật toán Euclide mở rộng ). Nhận xét: Tập hợp 256 giá trị từ 0 đến 255 đƣợc trang bị phép toán cộng (đƣợc định nghĩa là phép toán XOR) và phép nhân định nghĩa nhƣ trên tạo thành trƣờng hữu hạn GF(28). 3.3.2.1 Phép nhân với x Phép nhân (thông thƣờng) đa thức 7 7 6 5 4 3 2 i b(x) = b7x + b6x + b5x + b4x + b3x +b2x +b1x + b0 = bi x (3.2) i 0 với đa thức x cho kết quả là đa thức:
- 42 8 7 6 5 4 3 2 b7x + b6x + b5x + b4x + b3x +b2x +b1x + b0 x (3.3) Kết quả x•b(x) đƣợc xác định bằng cách modulo kết quả này cho đa thức m(x). 1.Trƣờng hợp b7 = 0 7 6 5 4 3 2 x•b(x) = b6x + b5x + b4x + b3x +b2x +b1x + b0 x (3.4) 2.Trƣờng hợp b7 = 1 8 7 6 5 4 3 2 x•b(x) =( b7x + b6x + b5x + b4x + b3x +b2x +b1x + b0 x) mod m(x) 8 7 6 5 4 3 2 =( b7x + b6x + b5x + b4x + b3x +b2x +b1x + b0 x) – m(x) (3.5) Nhƣ vậy, phép nhân với đa thức x (hay phần tử {00000010} GF(28)) có thể đƣợc thực hiện ở mức độ byte bằng một phép shift trái và sau đó thực hiện tiếp phép toán XOR với giá trị {1b}nếu b7 = 1 .Thao tác này đƣợc ký hiệu là xtime(). Phép nhân với các lũy 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ả của phép nhân với một giá trị bất kỳ đƣợc xác định bằng cách cộng ( ⊕ ) các kết quả trung gian này lại với nhau. Khi đó, việc thực hiện phép nhân giữa hai phần tử a, b bất kỳ thuộc GF(28) có thể đƣợc tiến hành theo các bƣớc sau: 1. Phân tích một phần tử (giả sử là a) ra thành tổng của các lũy thừa của 2. 2. Tính tổng các kết quả trung gian của phép nhân giữa phần tử còn lại (là b) với các thành phần là lũy thừa của 2 đƣợc phân tích từ a. Ví dụ: {57} • {13} = {fe} vì {57} • {02} = xtime({57}) = {ae} {57} • {04} = xtime({ae}) = {47} {57} • {08} = xtime({47}) = {8e} {57} • {10} = xtime({8e}) = {07}, Nhƣ vậy: {57} • {13} = {57} • ({01} ⊕ {02} ⊕ {10}) = {57} ⊕ {ae} ⊕ {07} = {fe}
- 43 3.3.2.2 Đa thức với hệ số trên GF(28) Xét đa thức a(x) và b(x) bậc 4 với các hệ số thuộc GF(28): 3 2 3 2 a(x) = a3x + a2x + a1x +a0 và b(x) = b3x + b2x + b1x +b0 (3.6) Hai đa thức này có thể đƣợc biểu diễn lại dƣới dạng từ gồm 4 byte [a0 , a1 , a2 , a3 ] và [b0 , b1 , b2 , b3 ]. Phép cộng đa thức đƣợc thực hiện bằng cách cộng (chính là phép toán XOR trên byte) các hệ số của các đơn thức đồng dạng với nhau. Phép nhân giữa a(x) với b(x) đƣợc thực hiện thông qua hai bƣớc. Trƣớc tiên, thực hiện phép nhân thông thƣờng c(x) = a(x)b(x) . 6 5 4 3 2 c(x) = c6x + c5x +c4x + c3x + c2x + c1x + c0 (3.7) với (3.8) Rõ ràng là c(x) không thể đƣợc biểu diễn bằng một từ gồm 4 byte. Đa thức c(x) có thể đƣợc đƣa về một đa thức có bậc nhỏ hơn 4 bằng cách lấy c(x) modulo cho một đa thức bậc 4. Trong thuật toán Rijndael, đa thức bậc 4 đƣợc chọn là M(x) = x4 +1. Do x j mod(x4 +1)= xj mod 4 nên kết quả d(x) = a(x) ⊗b(x) đƣợc xác định bằng 3 2 d(x) = d3x + d2x + d1x + d0 (3.9) với (3.10) Trong trƣờng hợp đa thức a(x) cố định, phép nhân d(x) = a(x) b(x) có thể đƣợc biểu diễn dƣới dạng ma trận nhƣ sau:
- 44 (3.11) Do x4 +1 không phải là một đa thức tối giản trên GF(28) nên phép nhân với một đa thức a(x) cố định đƣợc chọn bất kỳ không đảm bảo tính khả nghịch. Vì vậy, trong phƣơng pháp Rijndael đã chọn đa thức a(x) có phần tử nghịch đảo (modulo M(x)) (3.12) (3.13) 3.4 Phƣơng pháp Rijndael Phƣơng pháp mã hóa Rijndael bao gồm nhiều bƣớc biến đổi đƣợc thực hiện tuần tự, kết quả đầu ra của bƣớc biến đổi trƣớc là đầu vào của bƣớc biến đổi tiếp theo. Kết quả trung gian giữa các bƣớc biến đổi đƣợc gọi là trạng thái (state).Một trạng thái đƣợc biểu diễn dƣới dạng ma trận gồm 4 dòng và Nb cột với Nb bằng độ dài khối chia cho 32. Mã khóa chính (Cipher Key) đƣợc biểu diễn dƣới dạng ma trận gồm 4 dòng và Nk cột với Nk bằng độ dài khóa chia cho 32. Số lƣợng chu kỳ phụ thuộc vào giá trị của Nb và Nk theo công thức Nr = max{Nb, Nk}+6
- 45 Hình 3.1: Biểu diễn dạng ma trận của trạng thái (Nb=6) và mã khóa (Nk=4) AES làm việc với từng khối dữ liệu 4×4 byte (tiếng Anh: state, khối trong Rijndael có thể có thêm cột). 3.4.1 Quá trình mã hóa bao gồm 4 bƣớc: 1. AddRoundKey — mỗi byte của khối đƣợc kết hợp với khóa con, các khóa con này đƣợc tạo ra từ quá trình tạo khóa con Rijndael. 2. SubBytes — đây là phép thế (phi tuyến) trong đó mỗi byte sẽ đƣợc thế bằng một byte khác theo bảng tra (Rijndael S-box). 3. ShiftRows — đổi chỗ, các hàng trong khối đƣợc dịch vòng. 4. MixColumns — quá trình trộn làm việc theo các cột trong khối theo một phép biến đổi tuyến tính. Tại chu trình cuối thì bƣớc MixColumns đƣợc thay thế bằng bƣớc AddRoundKey Mỗi phép biến đổi thao tác trên trạng thái hiện hành S. Kết quả S’ của mỗi phép biến đổi sẽ trở thành đầu vào của phép biến đổi kế tiếp trong quy trình mã hóa. Trƣớc tiên, toàn bộ dữ liệu đầu vào đƣợc chép vào mảng trạng thái hiện hành. Sau khi thực hiện thao tác cộng mã khóa đầu tiên, mảng trạng thái sẽ đƣợc trải qua Nr = 10, 12 hay 14 chu kỳ biến đổi (tùy thuộc vào độ dài của mã khóa chính cũng nhƣ độ dài của khối đƣợc xử lý). Nr −1 chu kỳ đầu tiên là các chu kỳ biến đổi bình thƣờng và hoàn toàn tƣơng tự nhau, riêng chu kỳ biến đổi cuối cùng có sự khác biệt so với Nr −1 chu kỳ trƣớc đó. Cuối cùng, nội dung của mảng trạng thái sẽ đƣợc chép lại vào mảng chứa dữ liệu đầu ra.
- 46 Quy trình mã hóa Rijndael đƣợc tóm tắt lại nhƣ sau: 1. Thực hiện thao tác AddRoundKey đầu tiên trƣớc khi thực hiện các chu kỳ mã hóa. 2. Nr – 1 chu kỳ mã hóa bình thƣờng: mỗi chu kỳ bao gồm bốn bƣớc biến đổi liên tiếp nhau: SubBytes, ShiftRows, MixColumns, và AddRoundKey. 3. Thực hiện chu kỳ mã hóa cuối cùng: trong chu kỳ này thao tác MixColumns đƣợc bỏ qua Trong thuật toán dƣới đây, mảng w[] chứa bảng mã khóa mở rộng; mảng in[] và out[] lần lƣợt chứa dữ liệu vào và kết quả ra của thuật toán mã hóa.
- 47 3.4.1.1 Bƣớc SubBytes Các byte đƣợc thế thông qua bảng tra S-box (bảng 3.1 ). Đây chính là quá trình phi tuyến của thuật toán. Hộp S-box này đƣợc tạo ra từ một phép nghịch đảo trong trƣờng hữu hạn GF (28) có tính chất phi tuyến. Để chống lại các tấn công dựa trên các đặc tính đại số, hộp S-box này đƣợc tạo nên bằng cách kết hợp phép nghịch đảo với một phép biến đổi affine khả nghịch. Gồm 2 bƣớc: 1. Xác định phần tử nghịch đảo x-1 GF(28). Quy ƣớc {00}-1 = {00}. 2. Áp dụng phép biến đổi affine (trên GF(2)) đối với x-1 (giả sử x-1 có biểu diễn nhị phân là {x7 x6 x5x4 x3x2x1x0): (3.14) hay yi = xi x(i+4) mod 8 x(i+5) mod 8 x(i+6) mod 8 8 x(i+7) mod 8 ci (3.15) với ci là bit thứ i của {63}, 0 7. Hình 3.2: Thao tác SubBytes tác động trên từng byte của trạng thái.
- 48 Bảng 3.1: Bảng thay thế S-box cho giá trị {xy} ở dạng thập lục phân
- 49 Đoạn mã giả cho phép biến đổi SubBytes 3.4.1.2 Bƣớc ShiftRows Các hàng đƣợc dịch vòng một số vị trí nhất định. Đối với AES, hàng đầu đƣợc giữ nguyên. Mỗi byte của hàng thứ 2 đƣợc dịch trái một vị trí. Tƣơng tự, các hàng thứ 3 và 4 đƣợc dịch 2 và 3 vị trí. Do vậy, mỗi cột khối đầu ra của bƣớc này sẽ bao gồm các byte ở đủ 4 cột khối đầu vào. Đối với Rijndael với độ dài khối khác nhau thì số vị trí dịch chuyển cũng khác nhau. Hình 3.3: Thao tác ShiftRows tác động trên từng dòng của trạng thái Byte Sr,c tại dòng r cột c sẽ dịch chuyển đến cột (c - shift(r, Nb)) mod Nb hay: S’r,c = Sr.(c + shift(r,Nb)mod Nb với 0 < r < 8 và 0 ≤ c < Nb (3.16) Giá trị di số shift(r, Nb) phụ thuộc vào chỉ số dòng r và kích thƣớc Nb của khối dữ liệu.
- 50 Bảng 3.2: Giá trị di số shift(r,Nb) Mã giả cho phép biến đổi ShiftRows: 3.4.1.3 Bƣớc MixColumns 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ùng với bƣớc ShiftRows, MixColumns đã tạo ra tính chất khuyếch tán cho thuật toán. Mỗi cột đƣợc xem nhƣ một đa thức trong trƣờng hữu hạn và đƣợc nhân với đa thức c(x) = {03}x3 +{01} x2 +{01} x +{02} (modulo x4 + 1). Vì thế, bƣớc này có thể đƣợc xem là phép nhân ma trận trong trƣờng hữu hạn. Hình 3.4 mô tả thao tác MixColums tác động lên cột của mỗi trạng thái. Thao tác này đƣợc thể hiện ở dạng ma trận nhƣ sau:
- 51 (3.17) Hình 3.4: Thao tác MixColumns tác động lên mỗi cột của trạng thái 3.4.1.4 Bƣớc AddRoundKey Tại bƣớc này, khóa con đƣợc kết hợp với các khối. Khóa con trong mỗi chu trình đƣợc tạo ra từ khóa chính với quá trình tạo khóa con Rijndael; mỗi khóa con có độ dài 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 bít của khóa con với khối dữ liệu đang xét: (3.18) Thao tác biến đổi ngƣợc của AddRoundKey cũng chính là thao tác AddRoundKey.
- 52 Hình 3.5: Thao tác AddRoundKey tác động lên mỗi cột của trạng thái. Đoạn mã giả: 3.4.1.5 Phát sinh khóa của mỗi chu kỳ Các khóa của mỗi chu kỳ (RoundKey) đƣợc phát sinh từ khóa chính. Quy trình phát sinh khóa cho mỗi chu kỳ gồm 2 giai đoạn:: 1. Mở rộng khóa chính thành bảng khóa mở rộng, 2. Chọn khóa cho mỗi chu kỳ từ bảng khóa mở rộng. a) Xây dựng bảng khóa mở rộng Bảng khóa mở rộng là mảng 1 chiều chứa các từ (có độ dài 4 byte), đƣợc ký hiệu là w[Nb*(Nr + 1)]. Hàm phát sinh bảng khóa mở rộng phụ thuộc vào giá trị Nk, tức là phụ thuộc vào độ dài của mã khóa chính
- 53 Hàm SubWord(W) thực hiện việc thay thế (sử dụng S-box) từng byte thành phần của từ 4 byte đƣợc đƣa vào và trả kết quả về là một từ bao gồm 4 byte kết quả sau khi thực hiệc việc thay thế. Hàm RotWord(W) thực hiện việc dịch chuyển xoay vòng 4 byte thành phần (a, b, c, d) của từ đƣợc đƣa vào. Kết quả trả về của hàm RotWord là một từ gồm 4 byte thành phần là (b, c, d, a) Các hằng số của mỗi chu kỳ hoàn toàn độc lập với giá trị Nk và đƣợc xác định bằng Rcon[i] = (RC[i], {00}, {00}, {00}) với RC[i] GF(28) và thỏa: RC[1]=1 ({01})
- 54 RC[i] =x ({02})•(RC[i-1]) = x(i-1) (3.19) b) Xác định khóa của chu kỳ Khóa của chu kỳ thứ i đƣợc xác định bao gồm các từ (4 byte) có chỉ số từ Nb * i đến Nb * (i +1) −1 của bảng mã khóa mở rộng. Nhƣ vậy, mã khóa của chu kỳ thứ i bao gồm các phần tử w[Nb* i] , w[Nb* i +1] , , w[Nb*(i +1) −1] . Bảng 3.3: Mã khóa mở rộng và cách xác định mã khóa của chu kỳ (Nb = 6 và Nk = 4) Việc phát sinh mã khóa cho các chu kỳ có thể đƣợc thực hiện mà không nhất thiết phải sử dụng đến mảng w[Nb*(Nr +1)] . Trong trƣờng hợp dung lƣợng bộ nhớ hạn chế nhƣ ở các thẻ thông minh, các mã khóa cho từng chu kỳ có thể đƣợc xác định khi cần thiết ngay trong quá trình xử lý mà chỉ cần sử dụng max(Nk,Nb)* 4 byte trong bộ nhớ. Bảng khóa mở rộng luôn đƣợc tự động phát sinh từ khóa chính mà không cần phải đƣợc xác định trực tiếp từ ngƣời dùng hay chƣơng trình ứng dụng. Việc chọn lựa khóa chính (Cipher Key) là hoàn toàn tự do và không có một điều kiện ràng buộc hay hạn chế nào. 3.4.2 Quy trình giải mã Quy trình giải mã đƣợc thực hiện qua các giai đoạn sau: 1. Thực hiện thao tác AddRoundKey đầu tiên trƣớc khi thực hiện các chu kỳ giải mã. 2. Nr −1 chu kỳ giải mã bình thƣờng: mỗi chu kỳ bao gồm bốn bƣớc biến đổi liên tiếp nhau: InvShiftRows, InvSubBytes, AddRoundKey,InvMixColumns. 3. Thực hiện chu kỳ giải mã cuối cùng. Trong chu kỳ này, thao tác InvMixColumns đƣợc bỏ qua.
- 55 3.4.2.1 Phép biến đổi InvShiftRows Hình 3.6: Thao tác InvShiftRows tác động lên từng dòng của trạng thái hiện hành. InvShiftRows chính là phép biến đổi ngƣợc của phép biến đổi ShiftRows. Dòng đầu tiên của trạng thái sẽ vẫn đƣợc giữ nguyên trong khác ba dòng cuối của trạng thái sẽ đƣợc dịch chuyển xoay vòng theo chiều ngƣợc với phép biến đổi ShiftRows với các di số Nb–shift (r, Nb) khác nhau. Các byte ở cuối dòng đƣợc đƣa vòng lên đầu dòng trong khi các byte còn lại có khuynh hƣớng di chuyển về cuối dòng. S’r,(c+shift(r, Nb)) mod Nb = Sr,c với 0<r<4 và 0 c<Nb (3.20) Giá trị của di số shift(r,Nb) phụ thuộc vào chỉ số dòng r và kích thƣớc Nb của khối và đƣợc thể hiện trong Bảng 3.1. Đoạn mã giả cho phép biến đổi này:
- 56 3.4.2.2 Phép biến đổi InvSubbytes Phép biến đổi ngƣợc của thao tác SubBytes, ký hiệu là InvSubBytes, sử dụng bảng thay thế nghịch đảo của S-box trên GF(28), ký hiệu là S-box-1. Quá trình thay thế 1 byte y dựa vào S-box-1 bao gồm hai bƣớc sau: 1. Áp dụng phép biến đổi affine (trên GF(2)) sau đối với y (có biểu diễn nhị phân là {y7 y6 y5 y4 y3 y2 y1y0}): (3.21) Hay : xi = y(i+2) mod8 ⊕ y(i+5) mod8 ⊕ y(i+7)mod8 ⊕ di, (3.22) với di là bit thứ i của giá trị {05}, 0 i 7 Đây chính là phép biến đổi affine ngƣợc của phép biến đổi affine ở bƣớc 1 của S-box 8 2. Gọi x là phần tử thuộc GF(2 ) có biểu diễn nhị phân là {x7 x6x5x4x3x2x1x0 } . Xác định phần tử nghịch đảo x-1 GF(28) với quy ƣớc {00}-1 = {00}
- 57 Bảng 3.4: Bảng thay thế nghịch đảo giá trị {xy} ở dạng thập lục phân Đoạn mã giả cho phép InvSubBytes
- 58 3.4.2.3 Phép biến đổi InvMixColumns InvMixColumns là biến đổi ngƣợc của phép biến đổi MixColumns. Mỗi cột của trạng thái hiện hành đƣợc xem nhƣ đa thức s(x) bậc 4 có các hệ số thuộc GF(28) và đƣợc nhân với đa thức a-1(x) là nghịch đảo của đa thức a(x) (modulo M(x)) đƣợc sử dụng trong phép biến đổi MixColumns. a-1(x) = {0b} x3 + {0d}x2 + {09}x + {0e} (3.23) Phép nhân s’(x) = a-1(x) ⊗ s(x) có thể đƣợc biểu diễn dƣới dạng ma trận: (3.24) Trong đoạn mã giả sau, hàm Ffmul (x, y) thực hiện phép nhân trƣờng GF(28) hai phần tử x và y với nhau.
- 59 3.4.3 Các vấn đề cài đặt thuật toán Gọi a là trạng thái khi bắt đầu chu kỳ mã hóa. Gọi b, c, d, e lần lƣợt là trạng thái. Kết quả đầu ra sau khi thực hiện các phép biến đổi SubBytes, ShiftRows, MixColumns và AddRoundKey trong chu kỳ đang xét. Quy ƣớc: trong trạng thái s ( s = a,b, c,d, e ), cột thứ j đƣợc kí hiệu sj, phần tử tại dòng i cột j kí hiệu là si,j. Sau biến đổi SubBytes: (3.25) Sau biến đổi ShiftRows: (3.26) Sau biến đổi MixColumns: (3.27)
- 60 Sau biến đổi AddRoundKey: (3.28) Kết hợp các kết quả trung gian của mỗi phép biến đổi trong cùng chu kỳ với nhau ta có: (3.29) Kí hiệu j[r] = (j + shift(r, Nb)) mod Nb ta có: (3.30) Khai triển phép nhân ma trận ta có: (3.31) Định nghĩa các bảng tra cứu T0, T1, T2, T3 nhƣ sau:
- 61 (3.32) Khi đó ta viết lại biểu thức (3.32) nhƣ sau: (3.33) Với round là số thứ tự chu kỳ đang xét. Nhƣ vậy, mỗi cột ej của trạng thái kết quả sau khi thực hiện một chu kỳ mã hóa có thể đƣợc xác định bằng bốn phép toán XOR trên các số nguyên 32 bit sử dụng bốn bảng tra cứu T0, T1, T2 và T3. Công thức (3.33) chỉ áp dụng đƣợc cho Nr-1 chu kì đầu. Do chu kỳ cuối cùng không thực hiện phép biến đổi MixColumns nên cần xây dựng 4 bảng tra cứu riêng cho chu kì này: (3.34)
- 62 3.4.4 Kết quả thử nghiệm Bảng 3.5: Tốc độ xử lý của phƣơng pháp Rijndael Kết quả thử nghiệm thuật toán Rijndael đƣợc ghi nhận trên máy Pentium 200 MHz (sử dụng hệ điều hành Microsoft Windows 98), máy Pentium II 400 MHz, Pentium III 733 MHz (sử dụng hệ điều hành Microsoft Windows 2000 Professional), Pentium IV 2,4GHz (sử dụng hệ điều hành Microsoft Windows XP Service Pack 2). 3.4.5 Kết luận 3.4.5.1 Khả năng an toàn - Việc sử dụng các hằng số khác nhau ứng với mỗi chu kỳ giúp hạn chế khả năng tính đối xứng trong thuật toán. - Sự khác nhau trong cấu trúc của việc mã hóa và giải mã đã hạn chế đƣợc các khóa ―yếu‖ (weak key) nhƣ trong phƣơng pháp DES. - Trong các phiên bản mở rộng, các khóa đƣợc sử dụng thông qua thao tác XOR và tất cả những thao tác phi tuyến đều đƣợc cố định sẵn trong S-box mà không phụ thuộc vào giá trị cụ thể của mã khóa. - Tính chất phi tuyến cùng khả năng khuếch tán thông tin (diffusion) trong việc tạo bảng mã khóa mở rộng làm cho việc phân tích mật mã dựa vào các khóa tƣơng đƣơng hay các khóa có liên quan trở nên không khả thi. - Trong trƣờng hợp thuật toán Rijndael với số lƣợng chu kỳ lớn hơn 6, không tồn tại phƣơng pháp công phá mật mã nào hiệu quả hơn phƣơng pháp thử và sai. - Tính chất phức tạp của biểu thức S-box trên GF(28) cùng với hiệu ứng khuếch tán giúp cho thuật toán không thể bị phân tích bằng phƣơng pháp nội suy.
- 63 3.4.5.2 Đánh giá Phƣơng pháp Rijndael thích hợp cho việc triển khai trên nhiều hệ thống khác nhau, không chỉ trên các máy tính cá nhân mà điển hình là sử dụng các chip Pentium, mà cả trên các hệ thống thẻ thông minh. Trên các máy tính cá nhân, thuật toán AES thực hiện việc xử lý rất nhanh so với các phƣơng pháp mã hóa khác. Trên các hệ thống thẻ thông minh, phƣơng pháp này càng phát huy ƣu điểm không chỉ nhờ vào tốc độ xử lý cao mà còn nhờ vào mã chƣơng trình ngắn gọn, thao tác xử lý sử dụng ít bộ nhớ. Ngoài ra, tất cả các bƣớc xử lý của việc mã hóa và giải mã đều đƣợc thiết kế thích hợp với cơ chế xử lý song song nên phƣơng pháp Rijndael càng chứng tỏ thế mạnh của mình trên các hệ thống thiết bị mới. Do đặc tính của việc xử lý thao tác trên từng byte dữ liệu nên không có sự khác biệt nào đƣợc đặt ra khi triển khai trên hệ thống big-endian hay little-endian. Xuyên suốt phƣơng pháp AES, yêu cầu đơn giản trong việc thiết kế cùng tính linh hoạt trong xử lý luôn đƣợc đặt ra và đã đƣợc đáp ứng. Độ lớn của khối dữ liệu cũng nhƣ của mã khóa chính có thể tùy biến linh hoạt từ 128 đến 256-bit với điều kiện là chia hết cho 32. Số lƣợng chu kỳ có thể đƣợc thay đổi tùy thuộc vào yêu cầu riêng đƣợc đặt ra cho từng ứng dụng và hệ thống cụ thể. Tuy nhiên, vẫn tồn tại một số hạn chế mà hầu hết liên quan đến quá trình giải mã. Mã chƣơng trình cũng nhƣ thời gian xử lý của việc giải mã tƣơng đối lớn hơn việc mã hóa, mặc dù thời gian này vẫn nhanh hơn đáng kể so với một số phƣơng pháp khác. Khi cài đặt bằng chƣơng trình, do quá trình mã hóa và giải mã không giống nhau nên không thể tận dụng lại toàn bộ đoạn chƣơng trình mã hóa cũng nhƣ các bảng tra cứu cho việc giải mã. Khi cài đặt trên phần cứng, việc giải mã chỉ sử dụng lại một phần các mạch điện tử sử dụng trong việc mã hóa và với trình tự sử dụng khác nhau. Phƣơng pháp Rijndael với mức độ an toàn rất cao cùng các ƣu điểm đáng chú ý khác chắc chắn sẽ nhanh chóng đƣợc áp dụng rộng rãi trong nhiều ứng dụng trên các hệ thống khác nhau.
- 64 3.5 Ứng dụng của thuật toán 3.5.1 Giao diện chƣơng trình Hình 3.7: Giao diện chƣơng trình. 3.5.2 Chức năng chính của chƣơng trình 3.5.2.1 Mã hóa Trong quá trình mã hóa thực hiện các bƣớc: - Chọn file cần mã hóa bằng cách nhấn nút ―ChonFile‖. - Nút ―LuuFile‖ cho phép bạn lƣu file cần mã hóa dƣới dạng đuôi .rij . - Nhập PassWord.
- 65 - Khi nhấp nút ―MaHoa‖ file bạn muốn mã hóa sẽ đƣợc thực hiện. Kết quả sẽ đƣợc hiển thị ở bảng trắng phía dƣới. Bảng này chỉ cho phép ngƣời dùng thấy đƣợc thông tin sau khi đã mã hóa, không cho phép ngƣời dùng nhập thêm vào. Dƣới cùng là thanh progress để biết tiến độ của quá trình mã hóa. Các bƣớc trên đƣợc thực hiện tuần tự. 3.5.2.2 Giải mã Trong quá trình giải mã ta cần thực hiện: - Chọn file cần giãi mã bằng cách nhấp ―ChonFile‖. - Sau đó, chƣơng trình tự động load file key dƣới dạng XML trong cùng thƣ mục. - Nếu muốn lƣu file ở thƣ mục khác bạn sẽ nhấn nút ―LuuFile‖ để thực hiện. - Nếu file key là hợp lệ nút ―GiaiMa‖ cho phép bạn thực hiện quá trình giải mã file với việc tự động nhập PassWord. Dƣới cùng là thanh progress để biết tiến độ quá trình giải mã. 3.5.3 Code thực hiện mã hóa và giải mã // Mã Hóa private void EncryptFile(string scrFileName, string destFileName, byte[] key, byte[] iv) { Stream scrFile = new FileStream(scrFileName, FileMode.Open, FileAccess.Read); Stream rijFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); using (SymmetricAlgorithm alg = SymmetricAlgorithm.Create("Rijndael")) { alg.Key = key;
- 66 alg.IV = iv; progressBar1.Minimum = 0; progressBar1.Maximum = Convert.ToInt16(scrFile.Length / 1024) + 1; progressBar1.Value = 1; progressBar1.Step = 1; CryptoStream cryptoStream = new CryptoStream(scrFile, alg.CreateEncryptor(), CryptoStreamMode.Read); int bufferlength; byte[] buffer = new byte[1024]; rijFile.Write(key, 0, 16); rijFile.Write(iv, 0, 16); do { bufferlength = cryptoStream.Read(buffer, 0, 1024); rijFile.Write(buffer, 0, bufferlength); ChuoiMaHoa += "\n" + BitConverter.ToString(buffer, 0, bufferlength); progressBar1.PerformStep(); } while (bufferlength > 0); rijFile.Flush(); Array.Clear(key, 0, key.Length); Array.Clear(iv, 0, iv.Length); cryptoStream.Clear(); cryptoStream.Close(); scrFile.Close(); rijFile.Close();
- 67 MessageBox.Show("Ma hoa file thanh cong"); } } } // Giải mã private void DecryptFile(string scrFileName, string destFileName, byte[] key, byte[] iv) { Stream scrFile = new FileStream(scrFileName, FileMode.Open, FileAccess.Read); Stream destFile = new FileStream(destFileName, FileMode.Create, FileAccess.Write); using (SymmetricAlgorithm alg = SymmetricAlgorithm.Create("Rijndael")) { alg.Key = key; alg.IV = iv; CryptoStream cryptoStream = new CryptoStream(destFile, alg.CreateDecryptor(), CryptoStreamMode.Write) int bufferlength, i = 0; byte[] buffer = new byte[1024]; progressBar1.Minimum = 0; progressBar1.Maximum = Convert.ToInt16(scrFile.Length/1024) +1; progressBar1.Value = 1;
- 68 progressBar1.Step = 1; do { if (i == 0) { bufferlength = scrFile.Read(buffer, 0, 16); bufferlength = scrFile.Read(buffer, 0, 16); i++; } else { bufferlength = scrFile.Read(buffer, 0, 1024); cryptoStream.Write(buffer, 0, bufferlength); ChuoiGiaiMa += "\n" + BitConverter.ToString(buffer, 0, bufferlength); progressBar1.PerformStep(); } } while (bufferlength > 0); cryptoStream.FlushFinalBlock(); Array.Clear(key, 0, key.Length); Array.Clear(iv, 0, iv.Length); cryptoStream.Clear(); cryptoStream.Close(); scrFile.Close(); destFile.Close();
- 69 MessageBox.Show("Giai ma xong", "Thong Bao"); } } } }
- 70 KẾT LUẬN Hiện nay, với sự phát triển của khoa học hiện đại và Công nghệ thông tin, ngành mật mã đã có những bƣớc phát triển mạnh mẽ, đạt đƣợc nhiều kết quả lý thuyết sâu sắc và tạo cơ sở cho việc phát triển các giải pháp bảo mật, an toàn thông tin trong mọi lĩnh vực hoạt động của con ngƣời. Tìm hiểu qua các tài liệu đề tài đã hệ thống lại các kiến thức cơ bản của lĩnh vực mã hóa, tập trung tìm hiểu phƣơng pháp mã hóa khóa đối xứng và nghiên cứu từng bƣớc thực hiện của thuật toán mã hóa Rijndael. Bƣớc đầu xây dựng chƣơng trình mã hóa tệp tin bằng thuật toán Rijndael sử dụng thƣ viện Cryptography. Đồ án tuy còn nhiều điểm cần phải nghiên cứu và hoàn thiện nhƣng do thời gian và trình độ còn hạn chế nên không thể tránh khỏi những thiếu xót,nhƣợc điểm. Em rất mong đƣợc sự góp ý của các Thầy, Cô và các bạn. Em xin chân thành cảm ơn!
- 71 TÀI LIỆU THAM KHẢO Tài liệu tiếng Việt [1]. NHÓM TÁC GIẢ: TS. Dƣơng Anh Đức - ThS. Trần Minh Triết cùng với sự đóng góp của các sinh viên Khoa Công nghệ Thông tin, Trƣờng Đại học Khoa học Tự nhiên, Đại học Quốc gia thành phố Hồ Chí Minh - Book_MaHoaVaUngDung. [2]. Lê Thụy – ATBMTT1 - Trƣờng Đại học Dân lập Hải Phòng. [3]. Phan Đình Diệu – Lý thuyết mật mã & an toàn thông tin – Đại học quốc gia Hà Nội. [4]. Phạm Trọng Huy – Giáo trình cấu trúc dữ liệu – Khoa Kỹ Thuật trƣờng cao đẳng kinh tế, kĩ thuật Hải Dƣơng. [5].An toàn thông tin mạng máy tính, truyền tin số và truyền dữ liệu – PGS,TS.Thái Hồng Nhị & TS. Phạm Minh Việt. Tài liệu tiếng anh [6]. fip – Federal Information Processing Standards Publication 197 Specification for the Advanced Encrytion Standard .(November 26,2001) [7]. A specification for Rijndael, the AES Algorithm - Dr.Brian Gladman, v3.1, 3 rd March 2001.