Nối tiếp nội dung của phần 1 giáo trình Cơ sở mật mã học do GS.TS. Nguyễn Bình chủ biên, phần 2 cung cấp cho người học các kiến thức: Mật mã khóa công khai; hàm băm, xác thực và chữ ký số; các thủ tục và thực tế trong sử dụng mã hóa; các chuẩn và áp dụng. Mời các bạn cùng tham khảo nội dung chi tiết.
Chương - Mật mã khố cơng khai CHƯƠNG MẬT MÃ KHỐ CƠNG KHAI Trước tìm hiểu hệ mật khóa cơng khai ơn tập lại số kiến thức lý thuyết số 3.1 SỐ HỌC MODULO 3.1.1 Số nguyên Tập số nguyên: , 3, 2, 1,0,1, 2,3, Z Định nghĩa 3.1: Cho a ,bZ , a ước b c Z : b a c Ký hiệu a b Các tính chất chia hết IT a ,b,c Z ta có: (i) a a (ii) Nếu a b b c a c (iii) Nếu a b a c a bx cy với x , y Z PT (iv) Nếu a b b a a b Định nghĩa 3.2: Thuật toán chia số nguyên: Nếu a b số nguyên với b a qb r , r b q r Phần dư phép chia a b ký hiệu a mod b r Thương phép chia a b ký hiệu a divb q a Ta có a divb , b a a mod b a b b Ví dụ 3.1: a 73,b 17 73div 17 4, 73mod17 Định nghĩa 3.3: Ước chung c ước chung a b c a & c b Định nghĩa 3.4: Ước chung lớn (ƯCLN) Số nguyên dương d ƯCLN số nguyên a b (Ký hiệu d (a ,b) ) nếu: 78 (3.1) Chương - Mật mã khố cơng khai (i) d ước chung a b (ii) Nếu có c a c b c d Như a ,b số nguyên dương lớn ước a b không kể 0,0 Ví dụ 3.2: Các ước chung 12 18 1, 2, 3, 6 12,18 Định nghĩa 3.5: Bội chung nhỏ (BCNN) Số nguyên dương d bội chung nhỏ (BCNN) số nguyên a b (Ký hiệu d BCNN (a ,b) ) nếu: (i) a d , b d (ii) Nếu có a c , b c d c Như d số nguyên dương nhỏ bội a b IT Tính chất BCNN a ,b BCNN 12,18 (3.2) 12.18 36 PT Ví dụ 3.3: 12,18 a b a ,b Định nghĩa 3.6: Hai số nguyên dương a b gọi nguyên tố nếu: a ,b Định nghĩa 3.7: Số nguyên p gọi số nguyên tố ước dương p Ngược lại p gọi hợp số Định lý 3.1: (Định lý số học) Với số ngun n ta ln phân tích dạng tích luỹ thừa số nguyên tố n p 1e1 p e2 p ke k (3.3) Trong pi số nguyên tố khác ei số nguyên dương Hơn phân tích Định nghĩa 3.8: Với n , hàm n xác định số số nguyên khoảng 1,n nguyên tố với n Các tính chất hàm n 79 Chương - Mật mã khố cơng khai Nếu p số ngun tố p p Nếu m , n m n m n Nếu n p1e1 pe22 pkek phân tích thừa số ngun tố n thì: n n 1 1 1 p1 p pk (3.4) Định lý 3.2: Với n : n n 6ln ln n (3.5) 3.1.2 Các thuật toán Z Cho a b số nguyên không âm nhỏ a b b a Cần ý số bit biểu diễn nhị phân n lg n số xấp xỉ lgn Số IT phép toán bit bốn phép toán số cộng, trừ, nhân chia sử dụng thuật tốn kinh điển tóm lược bảng sau Các kỹ thuật tinh tế phép tốn nhân chia có độ phức tạp nhỏ Bảng 3.1 Độ phức tạp bit phép toán Z Độ phức tạp bit PT Phép toán Cộng a b 0(lg a lg b) 0(lg n ) Trừ a b 0(lg a lg b) 0(lg n ) Nhân a b (lga).(lgb) (lg n ) Chia a qb r (lga).(lgb) (lg n )2 ƯCLN số nguyên a b tính theo định lý sau: Định lý 3.3: Nếu a p1e1 pe22 pkek , b p11 p 2 pkk ei , i UCLN a ,b p1min e1 , 1 p 2min e2 , pkmin ek , k max e , max e , max e , BCNN a ,b p1 1 p 2 pk k k Ví dụ 3.4: Cho a 4864 28.19 , b 3458 2.7.13.19 Khi UCLN a ,b 4864, 3458 2.19 38 BCNN a ,b 4864,3458 28.7.13.19 442624 Định lý 3.4: Nếu a b số nguyên dương với a b thì: 80 Chương - Mật mã khố công khai UCLN a ,b UCLN b ,a modb (3.6) Thuật toán Euclide sau cho ta cách tính ƯCLN hiệu mà khơng cần phải phân tích thừa số ngun tố Thuật tốn Euclide Tính UCLN số nguyên VÀO : Hai số nguyên không âm a b với a b RA : ƯCLN a b (1) While b r a modb , a b , b r (2) Return (a) Định lý 3.5: Thuật tốn có thời gian chạy chừng (lg n ) phép toán bit Ví dụ 3.5: Sau bước chia thuật tốn tính: IT 4864,3458 38 PT 4864 1.3458 1406 3458 2.1406 646 1406 2.646 76 646 5.114 38 76 2.38 Thuật toán mở rộng để khơng tính ƯCLN số nguyên a b mà cịn tính số ngun x y thoả mãn ax by d Thuật toán Euclide mở rộng VÀO : Hai số nguyên không âm a b với a b RA : d UCLN a ,b số nguyên x y thoả mãn ax by d Nếu b đặt d a , x , y return d , x , y (1) Đặt x , x , y , y1 (2) While b 2.1 q a / b , r a qb , x x qx , y y qy1 2.2 a b , b r , x x , x x , y y1 , y1 y (3) Đặt d a , x x , y y return d , x , y Định lý 3.6: Thuật tốn có thời gian chạy cỡ 0( lg n ) phép toán bit 81 Chương - Mật mã khố cơng khai Ví dụ 3.6: Bảng 3.2 sau bước thuật toán với giá trị vào a 4864 b 3458 Bảng 3.2 Thuật toán Euclide mở rộng với đầu vào a 4864 b 3458 Q r x y a b x1 x2 y2 y1 4864 3458 0 1 1406 1 3458 1406 1 1 646 2 1406 646 2 1 114 7 646 114 2 76 27 38 114 76 27 7 38 38 32 45 76 38 27 32 38 45 91 128 38 32 91 45 128 Bởi ta có: IT UCLN 4864,3458 38 4864 32 3458 45 38 3.1.3 Các số nguyên modulo n Định nghĩa 3.9: PT Nếu a b số nguyên a gọi đồng dư với b theo modulo (ký hiệu a b mod n ) n a b Số nguyên n gọi modulo đồng dư Ví dụ 3.7: 24 mod 24 3.5 11 17 mod 11 17 4.7 Các tính chất Đối với a ,a1 ,b,b1 ,c Z ta có: (1) a b mod n a b có phần dư chia cho n (2) Tính phản xạ : a a mod n (3) Tính đối xứng : Nếu a b mod n b a mod n Tính bắc cầu : Nếu a b mod n b c mod n a c mod n (4) Nếu a a1 mod n b b1 mod n a b a1 b1 mod n a b a1.b1 mod n 82 Chương - Mật mã khoá công khai Lớp tương đương số nguyên a tập số nguyên đồng dư với a modulo n Từ tính chất (2), (3) (5) ta thấy n cố định, quan hệ đồng dư theo modulo n phân hoạch Z thành lớp tương đương Nếu a qn r với r n a r mod n Bởi số nguyên a đồng dư theo modulo n với số nguyên nằm khoảng từ tới n , số gọi thặng dư tối thiểu a mod n Như a r dùng để biểu thị cho lớp tương đương Định nghĩa 3.10: Các số nguyên modulo n (ký hiêu Zn ) tập (các lớp tương đương) số nguyên 0,1, 2, , n 1 Các phép cộng, trừ, nhân Zn thực theo modulo n Ví dụ 3.8: Z 25 0,1, , 24 Trong Z 25 ta có: 13 16 13 16 29 mod 25 IT Tương tự 13.16 Z 25 Định nghĩa 3.11: (Phần tử nghịch đảo) Cho a Z n , phần tử nghịch đảo (ngược theo phép nhân) a mod n số nguyên x Z n cho: a x 1 mod n PT Nếu x tồn nhất, a gọi khả nghịch Phần tử nghịch đảo a ký hiệu a 1 Định nghĩa 3.12: Phép chia với a cho b mod n tích a b 1 mod n tích xác định b phần tử khả nghịch Định lý 3.7: Cho a Zn , a khả nghịch nếu: a , n Ví dụ 3.9: Các phần tử khả nghịch Z 1, 2, 4, 5, Chẳng hạn 1 4.7 1 mod Định lý 3.8: Cho d a , n , phương trình đồng dư ax b mod n có nghiệm x d b , trường hợp có d nghiệm nằm n , nghiệm tất đồng dư theo modulo n d 83 Chương - Mật mã khố cơng khai Định lý 3.9: (Phần dư China) Nếu số nguyên n , n , , n k nguyên tố đơi hệ phương trình đồng dư: x a1 mod n x a mod n x a k mod n k có nghiệm theo modulo n n n 1.n n k Thuật toán Gausse Nghiệm x hệ phương trình đồng dư định lý phần dư China đươc tính bằng: k x N i M i mod n (3.7) IT i 1 Trong N i n / n i M i N i1 mod n i Các tính tốn thực 0( lg n ) phép toán bit Ví dụ 3.10: Cặp phương trình đồng dư x mod , x mod13 có nghiệm PT x 59 mod 91 Định lý 3.10: Nếu n , n cặp phương trình đồng dư x a mod n , x a mod n có nghiệm x a mod n , n Định nghĩa 3.13: Nhóm nhân Zn Z*n a Z n a , n Đặc biệt, n số nguyên tố Z*n a a n Định nghĩa 3.14: Cấp Z*n số phần tử Z*n (ký hiệu Z*n ) Theo định nghĩa hàm Phi-Euler ta thấy: Z*n n 84 (3.8) Chương - Mật mã khố cơng khai Chú ý: a Z*n b Z*n a ,b Z*n Z*n đóng phép nhân Định lý 3.11: Cho p số nguyên tố: (1) Định lý Euler: Nếu a Z*n a n 1 mod n (2) Nếu n tích số nguyên khác r s mod (n ) a r a s mod n số nguyên a Nói cách khác làm việc với modulo n số mũ rút gọn theo modulo n Định lý 3.12: Cho p số nguyên tố: (1) Định lý Ferma: Nếu a , p a p 1 1 mod p (2) Nếu r s mod p 1 a r a s mod p số nguyên a Nói cách IT khác làm việc với modulo số nguyên tố p luỹ thừa rút gọn theo modulo p (3) Đặc biệt a p a mod p với số nguyên a PT Định nghĩa 3.15: Cho a Z*n Cấp a (ký hiệu ord a ) số nguyên dương nhỏ t cho a t 1 mod n Định nghĩa 3.16: Cho a Z*n , ord (a ) t a s 1 mod n t ước s Đặc biệt t n Ví dụ 3.11: Cho n 21 , Z*21 1, 2, 4,5,8,10,11,13,16,17,19, 20 Chú ý 21 3 12 Z*21 Cấp phần tử Z*21 nêu bảng sau: Bảng 3.3 Cấp phần tử Z*21 * a Z 21 10 11 13 16 17 19 20 ord a 6 6 6 85 Chương - Mật mã khố cơng khai Định nghĩa 3.17: Cho Z*n Nếu cấp n gọi phần tử sinh hay phần tử nguyên thuỷ Z*n Nếu Z*n có phần tử sinh Z*n gọi cyclic Các tính chất phần tử sinh Z*n (1) Z*n có phần tử sinh n 2, 4, p k 2p k , p số nguyên tố lẻ k Đặc biệt, p số nguyên tố Z*n có phần tử sinh (2) Nếu phần tử sinh Z*n thì: Z*n { i mod n i n 1} (3.9) (3) Giả sử phần tử sinh Z*n b i mod n phần tử sinh Z n* i , (n ) Từ ta rút Z*n cyclic số phần tử sinh (n ) nguyên tố p (n ) n / p IT (4) Z*n phần tử sinh Z*n 1 mod n Ví dụ 1.12: Z*21 khơng cyclic khơng chứa phần tử có cấp PT 21 12 (Chú ý 21 không thoả mãn điều kiện (1) trên) Z*25 cyclic có phần tử sinh Định nghĩa 3.18: Cho a Z*n , a gọi thặng dư bậc hai modulo n (hay bình phương modulo n ) tồn x Z*n cho x a mod n Nếu không tồn x a gọi thặng dư khơng bậc hai modn Tập tất thặng dư bậc hai modulo n ký hiệu Qn , tập tất thặng dư không bậc hai ký hiệu Qn Cần ý theo định nghĩa Z*n Bởi Qn Q n Định lý 3.13: Cho p số nguyên tố phần tử sinh Z*p Khi a Z*p thặng dư bậc hai modulo p a i mod p , i số nguyên chẵn Từ rút ra: Qp p 1 Q p 86 p 1 (3.10) Chương - Mật mã khố cơng khai tức nửa số phần tử Z*p thặng dư bậc hai nửa cịn lại thặng dư khơng bậc hai * Ví dụ 3.12: phần tử sinh Z13 Các luỹ thừa liệt kê bảng 3.4 sau đây: Bảng 3.4 i 10 11 12 i mod13 10 12 11 Bởi Q13 {1,3, 4,9,10,12} , Q 13 {2,5,6,7,8,11} Định lý 3.14: Cho n tích hai số nguyên tố lẻ khác q p , n p.q , a Z*n IT thặng dư bậc hai modulo n a Q p a Qq Điều dẫn tới: Q n Qq Q p Qn p 1q 1 PT p 1q 1 Ví dụ 3.13: Cho n 21 Khi : Q 21 {1, 4,16} Q 21 {2,5,8,10,11,13,17,19, 20} Định nghĩa 3.19: Cho a Qn , x Z *n thoả mãn x a mod n x gọi bậc hai a mod n Định lý 3.15: (Số bậc hai) Nếu p số nguyên tố lẻ a Qn a gọi bậc hai theo modulo p Tổng quát hơn, cho n p1e1 pe22 pkek , pi số nguyên tố lẻ phân biệt ei Nếu a Qn có 2k bậc hai khác theo modulo n Ví dụ 3.14: - Các bậc 12 mod 37 30 - Các bậc 121mod 315 11, 74, 101, 151, 164, 214, 241 304 87 Chương - Các chuẩn áp dụng KUC : Khóa chữ ký cơng khai khách hàng Nếu hai đại lượng nhà buôn kiểm tra chữ ký DS, P I, OIMD KU C Tương tự, ngân hàng có Khi ngân hàng tính: H H P I / /OIMD D KU DS C Nếu hai đại lượng ngân hàng kiểm tra chữ ký PI PIMD … …… …… KRC H POMD H OI E OIMD Chữ ký kép H IT … …… …… Hình 6.3 Cấu trúc chữ ký kép : Thông tin chi trả OI : Thông tin đặt hàng H : Hàm băm : Phép ghép PIMD : Tóm lược thơng báo PI OIMD : Tóm lược thơng báo OI POMD: Tóm lược thông báo lệnh chi trả PT PI E : Phép mã hóa (RSA) KRC : Khóa chữ ký riêng khách hàng 6.3 ỨNG DỤNG XÁC THỰC - KERBEROS 6.3.1 Mở đầu Kerberos dịch vụ xác thực xây dựng từ dự án Athena MIT Vấn đề mà Kerberos muốn giải là: Trong môi trường phân tán mở, trạm làm việc muốn truy nhập dịch vụ máy chủ phân tán qua mạng Ta muốn máy chủ có khả hạn chế truy nhập người dùng hợp lệ xác thực yêu cầu dịch vụ Trong môi trường trạm làm việc tự xác định người dùng cho dịch vụ mạng Trên thực tế có ba nguy sau: Người sử dụng sử dụng trạm làm việc giả mạo người dùng khác Người sử dụng (user) thay đổi địa mạng trạm làm việc để yêu cầu gửi từ trạm xuất thể từ trạm mạo danh User "nghe trộm" trao đổi sử dụng kiểu công sử dụng lại để truy nhập vào máy chủ phá vỡ hoạt động 215 Chương - Các chuẩn áp dụng Trong trường hợp người dùng bất hợp pháp truy nhập tới dịch vụ liệu mà không phép truy nhập Khác với việc xây dựng thủ tục xác thực máy chủ, Kerberos cung cấp dịch vụ xác thực tập trung có nhiệm vụ xác thực user máy chủ (server) ngược lại Cần ý Kerberos sử dụng mật mã đối xứng mà không dùng mật mã khóa cơng khai Có hai phiên Kerberos Kv.4 Kv.5 Kv.5 đệ trình xem chuẩn khuyến nghị cho Internet Các yêu cầu đặt cho Kerberos: An toàn : Kẻ thu trộm mạng khơng có khả thu thơng tin cần thiết để mạo danh Hơn nữa, Kerberos phải đủ mạnh để đối phương mạnh khơng thể tìm thấy yếu điểm Tin cậy: Đối với dịch vụ khống chế truy nhập có sử dụng Kerberos, việc thiếu tính sẵn sàng dịch vụ Kerberos có nghĩa thiếu tính sẵn sàng dịch vụ trợ giúp Bởi Kerberos phải tin cậy phải sử dụng kiến trúc máy chủ phân tán có hệ thống dự phịng IT Trong suốt: Về mặt lý tưởng người dùng đưa mật vào họ khơng thể biết q trình xác thực xảy PT Có khả mở rộng: Kerberos phải có khả phục vụ số lượng lớn máy chủ máy trạm Bởi Kerberos phải có kiến trúc phân tán mođun 216 Chương - Các chuẩn áp dụng 6.3.2 Kerberos V.4 (1) User đăng nhập yêu cầu dịch vụ máy chủ (2) AS kiểm tra quyền truy nhập người dùng CSDL tạo thẻ cấp thẻ khóa phiên Một lần với phiên đăng nhập Kerberos Yêu cầu thẻ cấp thẻ Máy chủ Thẻ khóa phiên xác thực (AS) Yêu cầu thẻ cấp dịch vụ Máy chủ cấp thẻ (TGS) Cơ sở liệu Thẻ khóa phiên Kết khóa sử dụng mã phát sinh từ mật người dùng (2) TGS giải mã thẻ chứng xác thực, kiểm tra yêu cầu tạo thẻ cho máy chủ yêu cầu (6) Máy chủ kiểm tra phù hợp thẻ chứng xác thực cấp quyền truy nhập vào dịch vụ Nếu Server có yêu cầu xác thực lẫn máy chủ gửi chứng xác thực IT Một lần với (3) Trạm làm loại dịch vụ việc nhắc nhở người dùng đưa vào mật để giải mã thông tin tới gửi thẻ chứng xác Một lần thực có chứa tên với phiên user, địa mạng dịch vụ thời gian tới TGS CSDL PT (5) Trạm làm việc gửi thẻ chứng xác thực tới máy chủ Hình 6.4 Tóm lược trao đổi thông báo Kv.4 a) Trao đổi dịch vụ xác thực: Để thu nhận thẻ cấp thẻ (1) C AS : ID C // ID tgs // TS1 (Nhãn thời gian) (2) AS C: EKc KC, tgs // IDtgs // TS2 // LT2 (thời gian sống) // Thẻ tgs Thẻ tgs = EKtgs [KC, tgs // IDC // ADC // IDtgs // TS2 // LT2 ] b) Trao đổi dịch vụ cấp thẻ: Để thu nhận thẻ cung cấp dịch vụ (3) C TGS : IDV Thẻ tgs // Authenticator C (IDV : ID dịch vụ yêu cầu) (4) TGS C : EK,tgs KC, V // IDV // TS2 // Thẻ V Thẻ tgs = EKtgs [KC, tgs // IDC // ADC // IDtgs // TS2 // LT2 ] ThẻV = EKv [KC, v // IDC // ADC // IDV // TS2 // LT4 ] Authenticator C = EK,tgs [IDC // ADC // TS 3] 217 Chương - Các chuẩn áp dụng c) Trao đổi xác thực Máy trạm/ máy chủ: Để thu nhận dịch vụ (5) C V : Thẻ V // Authenticator C (6) V C : EKc,v TS5 H (để xác thực lẫn nhau) ThẻV = EKv [KC, v // IDC // ADC // IDV // TS2 // LT4 ] Authenticator C = EK,tgs [IDC // ADC // TS 5] Bảng cho ta thấy kỹ thuật phân phối khoá phiên IT Trước hết khách hàng (client) gửi thông báo tới AS yêu cầu truy nhập vào TGS AS trả lời thông báo mã khóa trích xuất từ mật người dùng (KC) có chứa thẻ Thơng báo chứa khoá phiên KC,tgs cho C TGS, khóa phiên nằm bên thơng báo mã KC nên có máy trạm người dùng đọc Khóa phiên nằm Thẻ tgs mà TGS đọc Như khóa phiên phân phối an toàn cho C TGS Cần ý số thông tin phụ thêm vào pha hội thoại Thông báo (1) chứa nhãn thời gian TS để AS biết thông báo lúc Thông báo (2) chứa số yếu tố thẻ dạng mà C truy nhập Điều cho phép C xác nhận thư TGS biết thời gian hết hạn Khi có thẻ khóa phiên C truy nhập vào TGS PT Trước hết C gửi tới TGS thông báo chứa thẻ + IDV (định danh dịch vụ yêu cầu) (thông báo (3)) Hơn nữa, C phát thẻ xác thực Authenticator bao gồm IDC ADC (địa người dùng C) nhãn thời gian TS Không giống thẻ dùng lại, thẻ xác thực dùng lần có thời gian sống ngắn TGS giải mã thẻ khóa mà chia sẻ với AS Thẻ báo người dùng C cung cấp khóa phiên K c,tgs Thực ra, thẻ báo "Người sử dụng khóa K c,tgs phải C " TGS dùng khóa phiên để giải mã thẻ xác thực Sau TGS kiểm tra tên địa từ thẻ xác thực từ nội dung thẻ từ địa mạng thông báo tới Nếu điều phù hợp TGS dã đảm bảo người gửi thẻ thực chủ nhân thẻ Thực thẻ báo "ở thời điểm TS3 sử dụng K c,tgs " Cần ý thẻ không chứng minh định danh phương pháp để phân phối khóa cách an tồn Chính thẻ xác thực chứng minh định danh client Vì thẻ xác thực dùng lần có thời gian dùng ngắn nên đối phương khó lịng ăn cắp thẻ thẻ xác thực để dùng lại TGS trả lời thông báo (4) có dạng thơng báo (2) Thơng báo mã khóa phiên chia sẻ TGS C, chứa khóa phiên cần chia sẻ C máy chủ V, định danh V; IDV, nhãn thời gian thẻ Bản thân thẻ chứa khóa phiên Lúc C có thẻ cấp dịch vụ dùng lại V Khi C trình thẻ thơng báo (5) gửi kèm theo thẻ xác thực (Authentication) 218 Chương - Các chuẩn áp dụng Máy chủ V giải mã thẻ, khơi phục khóa phiên giải mã thẻ xác thực cần xác thực lẫn nhau, máy chủ trả lời thơng báo (6) Máy chủ trả lại giá trị nhãn thời gian lấy từ thẻ xác thực tăng thêm mã khóa phiên C giải mã thơng báo để khôi phục lại nhãn thời gian tăng Vì thơng báo mã khóa phiên nên C đảm bảo tạo V Nội dung thông báo đảm bảo với C thông báo dùng lại thông báo cũ Cuối cùng, cuối trình, client server chia sẻ khóa bí mật Khóa dùng để mã hóa thông báo tương lai cho hai bên để trao đổi khóa phiên ngẫu nhiên Giải thích yếu tố thủ tục Kv.4 a) Trao đổi dịch vụ xác thực Thông báo (1) IDC Client yêu cầu thẻ cấp thẻ Báo cho AS định danh người dùng từ client ID tgs Báo cho AS biết người dùng yêu cầu truy nhập TGS TS Cho phép AS kiểm tra đồng hồ client đồng với AS AS trả thẻ cấp thẻ IT Thơng báo (2) Mã hóa dựa mật user, cho phép AS client kiểm tra mật bảo vệ nội dung thông báo (2) K C,tgs Bản khóa phiên tạo AS mà client sử dụng để thực trao đổi bí mật client TGS (khơng u cầu chúng phải chia sẻ khóa cố định) PT EKC ID tgs Xác nhận thẻ cho TGS TS Báo cho client thời gian mà thẻ đệ trình LT Báo cho client thời gian sống thẻ Thẻ tgs Thẻ cần client sử dụng để truy nhập TGS b) Trao đổi dịch vụ cấp thẻ Thông báo (3) IDV Thẻ tgs Client yêu cầu thẻ cấp dịch vụ Báo cho TGS user yêu cầu truy nhập tới máy chủ V Đảm bảo cho TGS user xác thực AS AuthenticatorC Được tạo client để xác nhận tính hợp lệ cho thẻ Thơng báo (4) TGS trả thẻ cấp dịch vụ E K C ,tgs Khóa chia sẻ C TGS dùng bảo vệ nội dung thông báo (4) K C,tgs Bản khoá phiên tạo AS IDV Xác nhận thẻ cho máy chủ V TS Báo cho client thời gian mà thẻ đệ trình 219 Chương - Các chuẩn áp dụng Thẻ V Thẻ tgs Thẻ dùng client để truy nhập vào máy chủ V Có khả dùng lại để người dùng khơng phải vào lại mật E Ktgs Thẻ mã hóa khóa có AS TGS biết nhằm tránh phá rối (thu trộm) K C,tgs Bản khóa phiên mà TGS truy nhập dùng để giải mã thẻ xác thực nhờ xác thực thẻ IDC Báo chủ sở hữu hợp lệ thẻ ADC Tránh việc dùng thẻ từ trạm làm việc khác với trạm yêu cầu thẻ ID tgs Đảm bảo cho máy chủ giải mã cho thẻ TS Báo cho TGS thời gian mà thẻ đệ trình LT Tránh dùng lại sau thẻ hết hạn Đảm bảo cho TGS người trình thẻ client mà thẻ trình cho nó, có thời gian sống ngắn để tránh dùng lại E K C ,tgs Thẻ xác thực mã khóa có client TGS biết nhằm tránh thu trộm IT AuthenticatorC ID C Phải phù hợp với ID thẻ để xác thực thẻ AD C Phải phù hợp với địa thẻ để xác thực thẻ TS Báo cho TGS thời gian mà thẻ xác thực tạo PT c) Trao đổi xác thực Máy trạm/ máy chủ (Client/Server) Thông báo (5) Thẻ V Client yêu cầu dịch vụ Đảm bảo với máy chủ người dùng AS xác nhận AuthenticatorC Được tạo client để xác nhận tính hợp lệ cho thẻ Thơng báo (6) Xác thực (tùy chọn) server client E K C ,v Đảm bảo cho C thông báo từ V TS 5+1 Đảm bảo cho C dùng lại hồi đáp cũ Thẻ V Có thể dùng lại để client không cần yêu cầu thẻ từ TGS truy nhập tới máy chủ E Kv Thẻ mã hóa khóa có TGS server biết nhằm tránh thu trộm K C,v Bản khóa phiên mà client truy nhập, dùng để giải mã thẻ xác thực nhằm xác thực thẻ IDC Báo chủ sở hữu hợp lệ thẻ ADC Tránh việc dùng thẻ từ trạm làm việc khác với trạm yêu cầu thẻ ID v Đảm bảo cho server giải mã cho thẻ TS Báo cho server thời gian mà thẻ đệ trình LT Tránh dùng lại sau thẻ hết hạn 220 Chương - Các chuẩn áp dụng AuthenticatorC Đảm bảo cho server người trình thẻ client mà thẻ đưa cho nó, có thời gian sống ngắn để tránh dùng lại E K C ,v Thẻ xác thực mã khóa có server client biết nhằm tránh thu trộm ID C Phải phù hợp với ID thẻ để xác thực thẻ AD C Phải phù hợp với địa thẻ để xác thực thẻ TS Báo cho server thời gian mà thẻ xác thực tạo BÀI TẬP CHƯƠNG Bài 6.1: Nêu ý tưởng thiết kế hệ mật bảo vệ file liệu sở phân tích PGP? IT Bài 6.2: Cấu tạo chữ ký kép? Ý nghĩa chữ ký kép thương mại điện tử? Bài 6.3: Vai trò máy chủ xác thực Kenberos? PT Bài 6.4: Hãy mô tả trình trao đổi dịch vụ xác thực K.V.4? 221 Phụ lục - Mã nguồn DES PHỤ LỤC - MÃ NGUỒN DES #define EN0 #define DE1 /* MODE == encrypt */ /* MODE == decrypt */ typedef struct { unsigned long ek[32]; unsigned long dk[32]; } des_ctx; extern void deskey(unsigned char *, short); /* hexkey[8] MODE * Sets the internal key register according to the hexadecimal * key contained in the bytes of hexkey, according to the DES, * for encryption or decryption according to MODE */ IT extern void usekey(unsigned long *); /* cookedkey[32] * Loads the internal key register with the data in cookedkey */ PT extern void cpkey(unsigned long *); /* cookedkey[32] * Copies the contents of the internal key register into the storage * located at &cookedkey[0] */ extern void des(unsigned char *, unsigned char *); /* from[8] to[8] * Encrypts/Decrypts (according to the key currently loaded in the * internal key register) one block of eight bytes at address `from' * into the block at address `to' They can be the same */ static static static static static static static static void void void void scrunch(unsigned char *, unsigned long *); unscrun(unsigned long *, unsigned char *); desfunc(unsigned long *, unsigned long *); cookey(unsigned long *); unsigned long KnL[32] = { 0L }; unsigned long KnR[32] = { 0L }; unsigned long Kn3[32] = { 0L }; unsigned char Df_Key[24] = { 0ì01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0ì01,0x23,0x45,0x67 }; static unsigned short bytebit[8] = { 0200, 0100, 040, 020, 010, 04, 02, 01 }; static unsigned long 0x800000L, 0x80000L, 0x8000L, 0x800L, bigbyte[24] = { 0x400000L, 0x200000L, 0x40000L, 0x20000L, 0x4000L, 0x2000L, 0x400L, 0x200L, 222 0x100000L, 0x10000L, 0x1000L, 0x100L, Phụ lục - Mã nguồn DES 0x80L, 0x8L, 0x40L, 0x4L, 0x20L, 0x2L, 0x10L, 0x1L }; /* Use the key schedule specified in the Standard (ANSI X3.92-1981) */ static unsigned char pc1[56] = 56, 48, 40, 32, 24, 16, 9, 1, 58, 50, 42, 34, 62, 54, 46, 38, 30, 22, 13, 5, 60, 52, 44, 36, { 8, 26, 14, 28, 0, 18, 6, 20, 57, 49, 41, 33, 25, 17, 10, 2, 59, 51, 43, 35, 61, 53, 45, 37, 29, 21, 12, 4, 27, 19, 11, }; static unsigned char totrot[16] = { 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 }; IT static unsigned char pc2[48] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; void deskey(key, edf) /* Thanks to James Gillogly & Phil Karn! */ unsigned char *key; short edf; { register int i, j, l, m, n; unsigned char pc1m[56], pcr[56]; unsigned long kn[32]; PT for ( j = 0; j < 56; j++ ) { l = pc1[j]; m = l & 07; pc1m[j] = (key[l >> 3] & bytebit[m]) ? : 0; } for( i = 0; i < 16; i++ ) { if( edf == DE1 ) m = (15 - i) 6; *cook = (*raw0 & 0x0003f000L) 4; *cook++ |= (*raw1 & 0ì0000003fL); } usekey(dough); return; } IT void cpkey(into) register unsigned long *into; { register unsigned long *from, *endp; from = KnL, endp = &KnL[32]; while( from < endp ) *into++ = *from++; return; } PT void usekey(from) register unsigned long *from; { register unsigned long *to, *endp; to = KnL, endp = &KnL[32]; while( to < endp ) *to++ = *from++; return; } void des(inblock, outblock) unsigned char *inblock, *outblock; { unsigned long work[2]; scrunch(inblock, work); desfunc(work, KnL); unscrun(work, outblock); return; } static void scrunch(outof, into) register unsigned char *outof; register unsigned long *into; { *into = (*outof++ & 0xffL) 8) & 0xffL; *into++ = *outof++ & 0xffL; *into++ = (*outof >> 24) & 0xffL; *into++ = (*outof >> 16) & 0xffL; *into++ = (*outof >> 8) & 0xffL; *into = *outof & 0xffL; return; } static unsigned long SP1[64] = { 0#01010400L, 0#00000000L, 0#00010000L, 0#01010004L, 0#00010404L, 0#00000004L, 0#00000400L, 0#01010400L, 0#01010404L, 0#01000404L, 0#01010004L, 0#01000000L, 0#00000404L, 0#01000400L, 0#01000400L, 0#00010400L, 0#01010000L, 0#01010000L, 0#00010004L, 0#01000004L, 0#01000004L, 0#00000000L, 0#00000404L, 0#00010404L, 0#00010000L, 0#01010404L, 0#00000004L, 0#01010400L, 0#01000000L, 0#01000000L, 0#01010004L, 0#00010000L, 0#00010400L, 0#00000400L, 0#00000004L, 0#01000404L, 0#01010404L, 0#00010004L, 0#01010000L, 0#01000004L, 0#00000404L, 0#00010404L, 0#00000404L, 0#01000400L, 0#01000400L, 0#00010004L, 0#00010400L, 0#00000000L, 225 Phụ lục - Mã nguồn DES 0#08020200L, 0#00020008L, 0#00000200L, 0#00020000L, 0#00020208L, 0#08000208L, 0#00000008L, 0#08000200L, 0#08020208L, 0#00000000L, 0#08000000L, 0#00020200L, 0#00000208L, 0#08020008L, 0#00000000L, 0#08000200L, 0#08020008L, 0#08020208L, 0#08000008L, 0#08020000L, 0#00020200L }; static unsigned long SP4[64] = { 0#00802001L, 0#00002081L, 0#00802080L, 0#00800081L, 0#00000000L, 0#00802000L, 0#00000081L, 0#00000000L, 0#00000001L, 0#00002000L, 0#00000080L, 0#00800000L, 0#00800081L, 0#00000001L, 0#00002000L, 0#00802080L, 0#00800080L, 0#00800001L, 0#00000081L, 0#00000000L, 0#00002080L, 0#00800080L, 0#00802001L, 0#00002081L, 0#00802081L, 0#00000081L, 0#00800001L, 0#00002001L, 0#00002001L, 0#00002080L, 0#00000080L, 0#00800000L, 0#00002081L, 0#00800001L, 0#00802000L, 0#00800080L, 0#00800000L, 0#00002001L, 0#00002080L, 0#00802081L, 0#00802000L, 0#00000000L, 0#00800081L, 0#00002081L, 0#00000001L, 0#00802080L, 0#00800000L, 0#00002000L, 0#00000080L, 0#00002001L, 0#00802081L, 0#00800001L, 0#00802001L, 0#00002080L, 0#00800080L, 0#00000081L, 0#00802081L, 0#00802000L, 0#00000001L, 0#00000080L, 0#00002000L, 0#00800081L, 0#00802001L, 0#00802080L }; IT 0#00020000L, 0#00000200L, 0#08000008L, 0#08000208L, 0#00000008L, 0#08020000L, 0#00020208L, 0#02080000L, 0x40000000L, 0#02000100L, 0#00080100L, 0x40080000L, 0x42080100L, 0#00000000L, 0x42000000L, 0#00000100L, 0x42000100L, 0x42080000L, 0#02000000L, 0x42000000L, 0x40080000L, 0x40000100L, 0#02080100L, 0x42000100L, 0#02080000L, 0x40080100L, 0x40000000L, 0#00000000L, 0#02000100L, 0x42000000L, 0#00080100L, 0#02000000L, 0x40080100L, 0#02080100L, 0x42080000L, 0x42080100L, 0x42000000L, 0#00080000L, 0x40000100L }; static unsigned long SP6[64] = { 0x20000010L, 0x20400000L, 0x20400000L, 0#00000010L, 0x20004000L, 0#00404010L, 0#00400010L, 0x20004000L, 0#00000000L, 0#00400010L, 0#00404000L, 0x20004010L, 0x20400010L, 0#00000000L, 0#00004010L, 0#00404000L, 0x20004000L, 0#00000010L, 0x20404010L, 0#00400000L, 0#00400000L, 0x20004000L, 0x20000010L, 0x20404010L, 0#00404010L, 0x20404000L, 0#00000010L, 0#00004000L, 0#00004000L, 0#00400010L, 0x20404000L, 0x20000000L, 0#00004000L, 0x20404010L, 0#00400000L, 0x20000000L, 0x20004010L, 0#00000010L, 0#00404010L, 0x20404000L, 0x20400010L, 0#00004010L, 0x20000000L, 0#00404000L, 0#00000000L, 0x20400000L, 0x20004010L, 0#00400010L, 0x20404010L, 0#00400000L, 0x20000010L, 0#00004010L, 0#00004000L, 0x20400010L, 0x20404000L, 0x20000000L, 0#00404000L, 0x20000010L, 0#00004010L, 0x20400000L, 0x20400010L, 0#00404010L, 0#00000000L, 0x20004010L }; PT static unsigned long SP5[64] = { 0#00000100L, 0#02080100L, 0#00080000L, 0#00000100L, 0x40080100L, 0#00080000L, 0x42000100L, 0x42080000L, 0#02000000L, 0x40080000L, 0x40000100L, 0x42080100L, 0x42080000L, 0x40000100L, 0#02080100L, 0#02000000L, 0#00080000L, 0x42000100L, 0x40000000L, 0#02080000L, 0#02000100L, 0x40000000L, 0x40080100L, 0#00000100L, 0x42080100L, 0#00080100L, 0#02080000L, 0#00000000L, 0#00080100L, 0#02000100L, 0#00000000L, 0x40080000L, 226 Phụ lục - Mã nguồn DES 0#04000802L, 0#00200802L, 0#00000000L, 0#04200002L, 0#00200002L, 0#04200800L, 0#00000802L, 0#04000000L, 0#00200000L, 0#04200002L, 0#04000800L, 0#00200802L, 0#04200802L, 0#00000002L, 0#04200000L, 0#00000800L, 0#00000000L, 0#04200800L, 0#04000002L, 0#00000802L, 0#04000800L, 0#00200002L, 0#04200802L, 0#00200800L, 0#04000802L, 0#00000002L, 0#00200000L, 0#04200800L, 0#04200000L, 0#04200802L, 0#00000800L, 0#00200002L }; static unsigned long SP8[64] = { 0x10001040L, 0#00001000L, 0x10000000L, 0x10001040L, 0#00040040L, 0x10040000L, 0x10041000L, 0#00041040L, 0x10040000L, 0x10000040L, 0#00041000L, 0#00040040L, 0#00001040L, 0#00000000L, 0x10000040L, 0x10001000L, 0#00041040L, 0#00040000L, 0#00000040L, 0x10040040L, 0x10001000L, 0#00000040L, 0x10040040L, 0x10000000L, 0#00000000L, 0x10041040L, 0x10040000L, 0x10001000L, 0x10041040L, 0#00041000L, 0#00001040L, 0#00040040L, 0#00040000L, 0#00000040L, 0x10041040L, 0#00001000L, 0x10001000L, 0x10040040L, 0#00000000L, 0#00041040L, 0x10041000L, 0#00001000L, 0x10000040L, 0#00040000L, 0#00040040L, 0x10001040L, 0#00041000L, 0x10000000L, 0x10041040L, 0x10000000L, 0#00041000L, 0#00000040L, 0#00001040L, 0x10041000L, 0x10040040L, 0#00040000L, 0#00001000L, 0#00041040L, 0x10040000L, 0x10001040L, 0x10000040L, 0#00000000L, 0#00001040L, 0x10041000L }; PT IT static unsigned long SP7[64] = { 0#00200000L, 0#04200002L, 0#00000800L, 0#04000802L, 0#04200802L, 0#00200000L, 0#00000002L, 0#04000000L, 0#04000800L, 0#00200802L, 0#04000002L, 0#04200000L, 0#04200000L, 0#00000800L, 0#00200800L, 0#00000002L, 0#04000000L, 0#00200800L, 0#04000802L, 0#04200002L, 0#00200002L, 0#04000000L, 0#04200800L, 0#00000802L, 0#00000802L, 0#04000002L, 0#00200800L, 0#00000000L, 0#00000000L, 0#00200802L, 0#04000002L, 0#04000800L, static void desfunc(block, keys) register unsigned long *block, *keys; { register unsigned long fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0#0f0f0f0fL; right ^= work; leftt ^= (work > 16) ^ right) & 0#0000ffffL; right ^= work; leftt ^= (work > 2) ^ leftt) & 0x33333333L; leftt ^= work; right ^= (work > 8) ^ leftt) & 0#00ff00ffL; leftt ^= work; right ^= (work 31) & 1L)) & 0xffffffffL; work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; 227 Phụ lục - Mã nguồn DES leftt = ((leftt > 31) & 1L)) & 0xffffffffL; IT for( round = 0; round < 8; round++ ) { work = (right > 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = right ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; leftt ^= fval; work = (leftt > 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = leftt ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; right ^= fval; } PT right = (right > 1); work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = (leftt > 1); work = ((leftt >> 8) ^ right) & 0#00ff00ffL; right ^= work; leftt ^= (work > 2) ^ right) & 0x33333333L; right ^= work; leftt ^= (work > 16) ^ leftt) & 0#0000ffffL; leftt ^= work; right ^= (work > 4) ^ leftt) & 0#0f0f0f0fL; leftt ^= work; right ^= (work ek); deskey(key,DE1); cpkey(dc->dk); } /* Encrypt several blocks in ECB mode Caller is responsible for short blocks */ void des_enc(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; cp = data; for(i=0;iek); unscrun(work,cp); cp+=8; } } void des_dec(des_ctx *dc, unsigned char *data, int blocks){ unsigned long work[2]; int i; unsigned char *cp; IT cp = data; for(i=0;idk); unscrun(work,cp); cp+=8; } PT } void main(void){ des_ctx dc; int i; unsigned long data[10]; char *cp,key[8] = {0#01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef}; char x[8] = {0#01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7}; cp = x; des_key(&dc,key); des_enc(&dc,cp,1); printf("Enc(0 7,0 7) = "); for(i=0;i