BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THƠNG Nguyễn Ngọc Điệp NGHIÊN CỨU, XÂY DỰNG GIẢI PHÁP TÍCH HỢP MẬT MÃ VÀO Q TRÌNH TRUYỀN TIN ĐẢM BẢO AN TỒN THƠNG TIN TRÊN MẠNG MÁY TÍNH LUẬN ÁN TIẾN SĨ KỸ THUẬT Hà Nội - 2017 BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG Nguyễn Ngọc Điệp NGHIÊN CỨU, XÂY DỰNG GIẢI PHÁP TÍCH HỢP MẬT MÃ VÀO Q TRÌNH TRUYỀN TIN ĐẢM BẢO AN TỒN THƠNG TIN TRÊN MẠNG MÁY TÍNH CHUN NGÀNH: HỆ THỐNG THƠNG TIN MÃ SỐ: 62.48.01.04 LUẬN ÁN TIẾN SĨ KỸ THUẬT NGƯỜI HƯỚNG DẪN KHOA HỌC: PGS.TS HOÀNG MINH Hà Nội - 2017 ii LỜI CAM ĐOAN Tôi xin cam đoan cơng trình nghiên cứu riêng tơi Các nội dung, số liệu kết nghiên cứu trình bày luận án hoàn toàn trung thực chưa có tác giả cơng bố cơng trình khác, liệu tham khảo trích dẫn đầy đủ Người cam đoan Nguyễn Ngọc Điệp i LỜI CẢM ƠN Luận án thực Học viện Cơng nghệ Bưu Viễn thơng - Bộ Thông tin Truyền thông Nghiên cứu sinh xin bày tỏ lòng biết ơn sâu sắc đến Thầy giáo PGS TS Hồng Minh tận tình hướng dẫn, giúp đỡ, trang bị phương pháp nghiên cứu, kiến thức khoa học để tơi hồn thành nội dung nghiên cứu luận án Nghiên cứu sinh xin bày tỏ lịng biết ơn chân thành tới thầy, Học viện Cơng nghệ Bưu Viễn thơng, nhà khoa học thuộc Viện Khoa học - Công nghệ mật mã, Học viện Kỹ thuật mật mã đóng góp nhiều ý kiến q báu giúp tơi hồn thành nội dung nghiên cứu luận án Nghiên cứu sinh xin trân trọng cảm ơn Học viện Công nghệ Bưu Viễn thơng, Khoa Khoa Quốc tế Đào tạo Sau đại học sở đào tạo đơn vị quản lý, đồng chí Lãnh đạo Viện Khoa học - Công nghệ mật mã, nơi công tác tạo điều kiện thuận lợi, hỗ trợ giúp đỡ tơi suốt q trình học tập, nghiên cứu thực luận án Tôi xin trân trọng cảm ơn bạn bè người thân gia đình cổ vũ, động viên giúp đỡ, tạo điều kiện cho tơi hồn thành luận án Nghiên cứu sinh ii MỤC LỤC LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT vi DANH MỤC CÁC HÌNH VẼ viii DANH MỤC CÁC BẢNG ix MỞ ĐẦU CHƯƠNG I: TỔNG QUAN VỀ GIẢI PHÁP CAN THIỆP MẬT MÃ VÀO HỆ THỐNG MẠNG DÙNG GIAO THỨC TCP/IP 1.1 TỔNG QUAN VỀ AN TỒN THƠNG TIN TRÊN MẠNG 1.1.1 Một số khái niệm an tồn thơng tin .7 1.1.2 Các nguy an toàn thông tin 1.1.3 Các hình thức cơng thơng tin mạng 1.1.4 Một số biện pháp an toàn .10 1.1.5 Các dịch vụ an toàn 10 1.1.5.1 Dịch vụ bí mật 11 1.1.5.2 Dịch vụ xác thực 12 1.1.5.3 Dịch vụ toàn vẹn liệu 13 1.1.5.4 Dịch vụ chối bỏ 14 1.1.5.5 Dịch vụ kiểm soát truy nhập .14 1.2 TÍCH HỢP MẬT MÃ VÀO HỆ THỐNG MẠNG DÙNG GIAO THỨC TCP/IP 15 1.2.1 Cấu trúc giao thức TCP/IP 15 1.2.2 Tích hợp mật mã vào tầng giao thức TCP/IP 17 1.2.2.1 Tích hợp mật mã vào tầng ứng dụng 19 1.2.2.2 Tích hợp mật mã vào tầng vận tải .20 1.2.2.3 Tích hợp mật mã vào tầng Internet 21 1.2.2.4 Tích hợp mật mã vào tầng truy nhập mạng 22 1.2.3 Cài đặt dịch vụ an toàn dùng kỹ thuật mật mã 22 1.3 GIẢI PHÁP BẢO MẬT DỮ LIỆU TRÊN ĐƯỜNG TRUYỀN 27 1.3.1 Một số chuẩn an tồn bảo mật thơng tin 27 1.3.2 Chuẩn an toàn tầng vận tải SSL/TLS 31 1.3.2.1 Giới thiệu giao thức .31 1.3.2.2 Các thành phần giao thức SSL 31 1.3.3 Một số công giao thức SSL 34 1.3.3.1 Tấn công quay lui phiên bản, quay lui thuật tốn mã hóa 34 iii 1.3.3.2 Tấn công làm thông điệp ChangeCipherSpec 35 1.3.3.3 Tấn cơng quay lui thuật tốn trao đổi khố 36 1.3.3.4 Tấn công padding CBC .37 1.3.3.5 Lỗ hổng HeartBleed OpenSSL 38 1.3.4 Giải pháp tích hợp mật mã nâng cao độ an toàn hiệu cho giao thức SSL/TLS 40 KẾT LUẬN CHƯƠNG .42 CHƯƠNG II: NÂNG CAO HIỆU QUẢ THỰC THI, ĐỘ AN TOÀN CỦA CÁC THAM SỐ HỆ MẬT RSA VÀ THUẬT TOÁN MÃ KHỐI 44 2.1 GIỚI THIỆU CHUNG 44 2.2 XÂY DỰNG TIÊU CHUẨN THAM SỐ CHO HỆ MẬT RSA 46 2.2.1 Một số tiêu chuẩn tham số RSA an toàn công bố 47 2.2.2 Phương pháp xác định ngưỡng an toàn Lenstra Verheul 49 2.2.2.1 Ngưỡng an toàn 49 2.2.2.2 Độ dài modulo hệ mật RSA 50 2.2.2.3 Bảng tính ngưỡng an tồn độ dài modulo an tồn cho hệ mật RSA 51 2.2.3 Xác định ngưỡng an toàn theo quan điểm riêng 51 2.2.3.1 Luận xác định đối tượng công .51 2.2.3.2 Cơng thức xác định ngưỡng an tồn năm y (y2016) 52 2.2.4 Phương pháp mã hóa liên tiếp tiêu chuẩn cho số cơng khai 55 2.2.4.1 Một số công thức, định nghĩa 55 2.2.4.2 Giải toán RSA phương pháp mã hóa liên tiếp 56 2.2.4.3 Phân tích modulo n hệ RSA phương pháp mã hóa liên tiếp .57 2.2.4.4 Tiêu chuẩn cho tham số e 59 2.3 MỘT ĐỀ XUẤT MA TRẬN AN TOÀN, HIỆU QUẢ CHO TẦNG TUYẾN TÍNH TRONG CÁC MÃ PHÁP DẠNG AES 61 2.3.1 Một số định nghĩa, khái niệm .63 2.3.2 Phép MixColumns sử dụng ma trận dịch vòng ma trận tựa vịng 4x4 64 2.3.3 Phân tích phép biến đổi MixColumns AES 66 2.3.4 Đề xuất ma trận tuyến tính tựa vòng cho AES 68 2.3.5 Đánh giá cài đặt theo quan điểm phần mềm 71 2.3.6 Đánh giá độ an toàn, số điểm bất động tầng tuyến tính 74 2.3.7 Kết cài đặt thực nghiệm .76 KẾT LUẬN CHƯƠNG .79 CHƯƠNG III: TÍCH HỢP MẬT MÃ TRONG GIAO THỨC VÀ BỘ PHẦN MỀM BẢO MẬT DỮ LIỆU TRÊN ĐƯỜNG TRUYỀN 81 3.1 BỘ PHẦN MỀM OPENVPN 81 3.1.1 Giới thiệu phần mềm OpenVPN .81 3.1.2 Sơ đồ tổng quát 82 3.1.3 Sơ đồ dòng liệu .83 iv 3.2 MỘT SỐ MODULE CHÍNH TRONG BỘ PHẦN MỀM 85 3.2.1 Module VPN Daemon - Vận hành VPN theo chế dịch vụ hệ thống .85 3.2.2 Module TUN/TAP - quản lý giao diện mạng ảo 87 3.2.3 Trao đổi khoá OpenVPN 89 3.2.4 Mã hoá OpenVPN .90 3.2.5 Xác thực tính tồn vẹn gói liệu OpenVPN 90 3.2.6 Giao thức OpenVPN 91 3.3 TÍCH HỢP THAM SỐ RSA AN TOÀN VÀ THUẬT TOÁN MÃ KHỐI BC_VPN TRONG GIAO THỨC SSL/TLS .93 3.3.1 Sử dụng tham số RSA an toàn giao thức SSL/TLS 94 3.3.2 Tích hợp thuật tốn mã khối BC_VPN vào giao thức SSL/TLS 98 3.3.3 Thử nghiệm, đánh giá phần mềm bảo mật đường truyền PMBM_VPN 100 KẾT LUẬN CHƯƠNG III 105 KẾT LUẬN 107 A Các kết Luận án đạt được: 107 B Những đóng góp luận án: 108 C Hướng nghiên cứu tiếp theo: 108 DANH MỤC CÁC CƠNG TRÌNH KHOA HỌC ĐÃ CÔNG BỐ .109 TÀI LIỆU THAM KHẢO 110 PHỤ LỤC: CÁC MODULE CHƯƠNG TRÌNH, KẾT QUẢ THỬ NGHIỆM 115 v DANH MỤC CÁC KÝ HIỆU, CÁC TỪ VIẾT TẮT #(a) #(b) #{(X,Y)} #S N * N e| N Gcd(a,b) Lmc(a,b) AES ACL DLP DoS DDoS ECC ESP FPGA HMAC KDF IKE IDPS IP IPSec ISO Lực lượng a Lực lượng b Lực lượng tập X, Y Số phần tử S Vành số nguyên với phép cộng phép nhân rút gọn theo modulo N Nhóm nhân cực đại của vành N bội e, e ước N Ước số chung lớn a b Bội số chung nhỏ a b Advanced Encryption Standard Access Control List Discrete Logarithm Problem Denial of Service Distributed Denial of Service Elliptic Curve Cryptosystem Encapsulating Security Payload Field Programmable Gate Array Hash Message Authentication Code Key Derivation Function Internet Key Exchange Intruction Detection Prevention System MPLS OSI Internet Protocol Internet Protocol Security International Organization for Standardization Local Area Network Maximum Distance Separable Man In The Middle Multi Protocol Label Switching Open System Interconnection QoS Quality Of Service LAN MDS MITM N Chuẩn mã hóa liệu mở rộng Danh sách điều khiển truy nhập Bài tốn Logarith rời rạc Tấn cơng từ chối dịch vụ Tấn công từ chối dịch vụ phân tán Hệ mật Elliptic Đóng gói mã hóa liệu Mảng cổng lập trình dạng trường Hàm băm có xác thực Hàm dẫn xuất khóa Trao đổi khóa Internet Hệ thống phát ngăn chặn truy cập Giao thức liên mạng Giao thức bảo mật IP Tổ chức tiêu chuẩn quốc tế Mạng cục Phân tách có khoảng cách cực đại Tấn công kẻ đứng Chuyển mạch nhãn đa giao thức Mơ hình tương tác hệ thống mở Chất lượng dịch vụ vi SPN SSL RSA TCP TLS UDP VNI VPN Substitution Permutation Network Secure Sockets Layer Rivest, Shamir and Adlemen Transport Control Protocol Transport Layer Security User Datagram Protocol Virtual Networking Interface Virtual Private Network Mạng thay - hoán vị Giao thức bảo mật tầng Socket Hệ mật khóa cơng khai RSA Giao thức điều khiển truyền tin Giao thức bảo mật tầng vận tải Giao thức gói liệu người dùng Giao diện mạng ảo Mạng riêng ảo vii DANH MỤC CÁC HÌNH VẼ Hình 1.1: Các hình thức cơng thơng tin mạng máy tính Hình 1.2: Cấu trúc giao thức TCP/IP 16 Hình 1.3: Cấu trúc gói tin IP 17 Hình 1.4: Mơ hình bảo mật thông tin dùng kỹ thuật mật mã 23 Hình 1.5: Mơ hình mã hóa khóa đối xứng 24 Hình 1.6: Mơ hình mã hố dùng khố công khai 25 Hình 1.7: Giao thức bắt tay SSL 32 Hình 1.8: Giao thức ghi SSL 33 Hình 1.9: Tấn công ChangeCipherSpec 35 Hình 1.10: Tấn cơng quay lui thuật tốn trao đổi khóa 37 Hình 3.1: Sơ đồ khối tổng quát OpenVPN 82 Hình 3.2: Sơ đồ dòng liệu tương tác xử lý OpenVPN 84 Hình 3.3: Sơ đồ khối VPN Daemon 86 Hình 3.4: Sơ đồ khối hoạt động module TUN/TAP 88 Hình 3.5: Lưu đồ mã hố xác thực OpenVPN 91 Hình 3.6: Lưu đồ giải mã xác thực OpenVPN 91 Hình 3.7: UDP/TCP Format 92 Hình 3.8: Tích hợp tham số RSA thuật toán mã khối OpenVPN 93 Hình 3.9: Lưu đồ mã hố xác thực gói tin PMBM_VPN 98 Hình 3.10: Lưu đồ giải mã xác thực gói tin PMBM_VPN 99 Hình 3.11: Đóng gói bảo vệ gói tin IP PMBM_VPN 99 Hình 3.12: Mơ hình thử nghiệm phần mềm PMBM_VPN 100 Hình 3.13: Cấu hình cho VPN Server 102 Hình 3.14: Cấu hình cho VPN Client 102 Hình 3.15: Trạng thái thời hệ thống VPN kết nối thành cơng 103 Hình 3.16: Tốc độ phần mềm PMBM_VPN (1 luồng) 104 Hình 3.17: Tốc độ phần mềm PMBM_VPN (4 luồng) 104 viii /* Thực vòng lặp sinh NN */ for(j=1; j 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; 8) & 122 t1 = Te0[s1 >> 24] 0xff] ^ Te3[s0 & 0xff] ^ t2 = Te0[s2 >> 24] 0xff] ^ Te3[s1 & 0xff] ^ t3 = Te0[s3 >> 24] 0xff] ^ Te3[s2 & 0xff] ^ /* Vong 2: */ s0 = Te0[t0 >> 24] 0xff] ^ Te3[t3 & 0xff] ^ s1 = Te0[t1 >> 24] 0xff] ^ Te3[t0 & 0xff] ^ s2 = Te0[t2 >> 24] 0xff] ^ Te3[t1 & 0xff] ^ s3 = Te0[t3 >> 24] 0xff] ^ Te3[t2 & 0xff] ^ /* Vong 3: */ t0 = Te0[s0 >> 24] 0xff] ^ Te3[s3 & 0xff] ^ t1 = Te0[s1 >> 24] 0xff] ^ Te3[s0 & 0xff] ^ t2 = Te0[s2 >> 24] 0xff] ^ Te3[s1 & 0xff] ^ t3 = Te0[s3 >> 24] 0xff] ^ Te3[s2 & 0xff] ^ /* Vong 4: */ s0 = Te0[t0 >> 24] 0xff] ^ Te3[t3 & 0xff] ^ s1 = Te0[t1 >> 24] 0xff] ^ Te3[t0 & 0xff] ^ s2 = Te0[t2 >> 24] 0xff] ^ Te3[t1 & 0xff] ^ s3 = Te0[t3 >> 24] 0xff] ^ Te3[t2 & 0xff] ^ /* Vong 5: */ t0 = Te0[s0 >> 24] 0xff] ^ Te3[s3 & 0xff] ^ t1 = Te0[s1 >> 24] 0xff] ^ Te3[s0 & 0xff] ^ t2 = Te0[s2 >> 24] 0xff] ^ Te3[s1 & 0xff] ^ t3 = Te0[s3 >> 24] 0xff] ^ Te3[s2 & 0xff] ^ /* Vong 6: */ s0 = Te0[t0 >> 24] 0xff] ^ Te3[t3 & 0xff] ^ s1 = Te0[t1 >> 24] 0xff] ^ Te3[t0 & 0xff] ^ s2 = Te0[t2 >> 24] 0xff] ^ Te3[t1 & 0xff] ^ s3 = Te0[t3 >> 24] 0xff] ^ Te3[t2 & 0xff] ^ /* Vong 7: */ t0 = Te0[s0 >> 24] 0xff] ^ Te3[s3 & 0xff] ^ t1 = Te0[s1 >> 24] 0xff] ^ Te3[s0 & 0xff] ^ t2 = Te0[s2 >> 24] 0xff] ^ Te3[s1 & 0xff] ^ ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> rk[ 5]; ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> rk[ 6]; ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> rk[ 7]; 8) & ^ Te1[(t1 rk[ 8]; ^ Te1[(t2 rk[ 9]; ^ Te1[(t3 rk[10]; ^ Te1[(t0 rk[11]; >> 16) & 0xff] ^ Te2[(t2 >> 8) & >> 16) & 0xff] ^ Te2[(t3 >> 8) & >> 16) & 0xff] ^ Te2[(t0 >> 8) & >> 16) & 0xff] ^ Te2[(t1 >> 8) & ^ Te1[(s1 rk[12]; ^ Te1[(s2 rk[13]; ^ Te1[(s3 rk[14]; ^ Te1[(s0 rk[15]; >> 16) & 0xff] ^ Te2[(s2 >> 8) & >> 16) & 0xff] ^ Te2[(s3 >> 8) & >> 16) & 0xff] ^ Te2[(s0 >> 8) & >> 16) & 0xff] ^ Te2[(s1 >> 8) & ^ Te1[(t1 rk[16]; ^ Te1[(t2 rk[17]; ^ Te1[(t3 rk[18]; ^ Te1[(t0 rk[19]; >> 16) & 0xff] ^ Te2[(t2 >> 8) & >> 16) & 0xff] ^ Te2[(t3 >> 8) & >> 16) & 0xff] ^ Te2[(t0 >> 8) & >> 16) & 0xff] ^ Te2[(t1 >> 8) & ^ Te1[(s1 rk[20]; ^ Te1[(s2 rk[21]; ^ Te1[(s3 rk[22]; ^ Te1[(s0 rk[23]; >> 16) & 0xff] ^ Te2[(s2 >> 8) & >> 16) & 0xff] ^ Te2[(s3 >> 8) & >> 16) & 0xff] ^ Te2[(s0 >> 8) & >> 16) & 0xff] ^ Te2[(s1 >> 8) & ^ Te1[(t1 rk[24]; ^ Te1[(t2 rk[25]; ^ Te1[(t3 rk[26]; ^ Te1[(t0 rk[27]; >> 16) & 0xff] ^ Te2[(t2 >> 8) & >> 16) & 0xff] ^ Te2[(t3 >> 8) & >> 16) & 0xff] ^ Te2[(t0 >> 8) & >> 16) & 0xff] ^ Te2[(t1 >> 8) & ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> rk[28]; ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> rk[29]; ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> rk[30]; 8) & 8) & 8) & 8) & 8) & 123 t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; /* Vong 8: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; /* Vong 9: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; if (Nr > 10) { /* Vong 10: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; /* Vong 11: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; if (Nr > 12) { /* Vong 12: */ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; s1 = Te0[t1 >> 24] ^ Te1[(t2 >> & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; s2 = Te0[t2 >> 24] ^ Te1[(t3 >> & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; s3 = Te0[t3 >> 24] ^ Te1[(t0 >> & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; /* Vong 13: */ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; t1 = Te0[s1 >> 24] ^ Te1[(s2 >> & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; t2 = Te0[s2 >> 24] ^ Te1[(s3 >> & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; t3 = Te0[s3 >> 24] ^ Te1[(s0 >> & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; } 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te2[(s1 >> 8) & & 0xff] ^ Te2[(t2 >> 8) & & 0xff] ^ Te2[(t3 >> 8) & & 0xff] ^ Te2[(t0 >> 8) & & 0xff] ^ Te2[(t1 >> 8) & & 0xff] ^ Te2[(s2 >> 8) & & 0xff] ^ Te2[(s3 >> 8) & & 0xff] ^ Te2[(s0 >> 8) & & 0xff] ^ Te2[(s1 >> 8) & 16) & 0xff] ^ Te2[(t2 >> 8) 16) & 0xff] ^ Te2[(t3 >> 8) 16) & 0xff] ^ Te2[(t0 >> 8) 16) & 0xff] ^ Te2[(t1 >> 8) 16) & 0xff] ^ Te2[(s2 >> 8) 16) & 0xff] ^ Te2[(s3 >> 8) 16) & 0xff] ^ Te2[(s0 >> 8) 16) & 0xff] ^ Te2[(s1 >> 8) 124 } rk += Nr > 24) (Te4[(t1 >> 16) (Te4[(t2 >> 8) (Te4[(t3 ) rk[0]; PUTU32(ct , s0); s1 = (Te4[(t1 >> 24) (Te4[(t2 >> 16) (Te4[(t3 >> 8) (Te4[(t0 ) rk[1]; PUTU32(ct + 4, s1); s2 = (Te4[(t2 >> 24) (Te4[(t3 >> 16) (Te4[(t0 >> 8) (Te4[(t1 ) rk[2]; PUTU32(ct + 8, s2); s3 = (Te4[(t3 >> 24) (Te4[(t0 >> 16) (Te4[(t1 >> 8) (Te4[(t2 ) rk[3]; PUTU32(ct + 12, s3); bit cac byte: */ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ } void Decrypt(const u32 rk[/*4*(Nr + 1)*/], int Nr, const u8 ct[16], u8 pt[16]) { u32 s0, s1, s2, s3, t0, t1, t2, t3; ^ ^ ^ ^ ^ ^ /* Chuyen cac byte ban ma */ s0 = GETU32(ct ) ^ rk[0]; s1 = GETU32(ct + 4) ^ rk[1]; s2 = GETU32(ct + 8) ^ rk[2]; s3 = GETU32(ct + 12) ^ rk[3]; /* Vong 1: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> Td3[s1 & 0xff] ^ rk[ 4]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> Td3[s2 & 0xff] ^ rk[ 5]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> Td3[s3 & 0xff] ^ rk[ 6]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> Td3[s0 & 0xff] ^ rk[ 7]; /* Vong 2: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> Td3[t1 & 0xff] ^ rk[ 8]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> Td3[t2 & 0xff] ^ rk[ 9]; cac tu 32 bit Ap dung cong khoa dau: 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] 125 s2 = Td0[t2 >> ^ Td3[t3 & 0xff] ^ s3 = Td0[t3 >> ^ Td3[t0 & 0xff] ^ /* round 3: */ t0 = Td0[s0 >> ^ Td3[s1 & 0xff] ^ t1 = Td0[s1 >> ^ Td3[s2 & 0xff] ^ t2 = Td0[s2 >> ^ Td3[s3 & 0xff] ^ t3 = Td0[s3 >> ^ Td3[s0 & 0xff] ^ /* Vong 4: */ s0 = Td0[t0 >> ^ Td3[t1 & 0xff] ^ s1 = Td0[t1 >> ^ Td3[t2 & 0xff] ^ s2 = Td0[t2 >> ^ Td3[t3 & 0xff] ^ s3 = Td0[t3 >> ^ Td3[t0 & 0xff] ^ /* Vong 5: */ t0 = Td0[s0 >> ^ Td3[s1 & 0xff] ^ t1 = Td0[s1 >> ^ Td3[s2 & 0xff] ^ t2 = Td0[s2 >> ^ Td3[s3 & 0xff] ^ t3 = Td0[s3 >> ^ Td3[s0 & 0xff] ^ /* Vong 6: */ s0 = Td0[t0 >> ^ Td3[t1 & 0xff] ^ s1 = Td0[t1 >> ^ Td3[t2 & 0xff] ^ s2 = Td0[t2 >> ^ Td3[t3 & 0xff] ^ s3 = Td0[t3 >> ^ Td3[t0 & 0xff] ^ /* Vong 7: */ t0 = Td0[s0 >> ^ Td3[s1 & 0xff] ^ t1 = Td0[s1 >> ^ Td3[s2 & 0xff] ^ t2 = Td0[s2 >> ^ Td3[s3 & 0xff] ^ t3 = Td0[s3 >> ^ Td3[s0 & 0xff] ^ /* Vong 8: */ s0 = Td0[t0 >> ^ Td3[t1 & 0xff] ^ s1 = Td0[t1 >> ^ Td3[t2 & 0xff] ^ s2 = Td0[t2 >> ^ Td3[t3 & 0xff] ^ s3 = Td0[t3 >> ^ Td3[t0 & 0xff] ^ /* Vong 9: */ 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> rk[10]; 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> rk[11]; 8) & 0xff] 24] ^ Td1[(s3 rk[12]; 24] ^ Td1[(s0 rk[13]; 24] ^ Td1[(s1 rk[14]; 24] ^ Td1[(s2 rk[15]; >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] 24] ^ Td1[(t3 rk[16]; 24] ^ Td1[(t0 rk[17]; 24] ^ Td1[(t1 rk[18]; 24] ^ Td1[(t2 rk[19]; >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] 24] ^ Td1[(s3 rk[20]; 24] ^ Td1[(s0 rk[21]; 24] ^ Td1[(s1 rk[22]; 24] ^ Td1[(s2 rk[23]; >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] 24] ^ Td1[(t3 rk[24]; 24] ^ Td1[(t0 rk[25]; 24] ^ Td1[(t1 rk[26]; 24] ^ Td1[(t2 rk[27]; >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] 24] ^ Td1[(s3 rk[28]; 24] ^ Td1[(s0 rk[29]; 24] ^ Td1[(s1 rk[30]; 24] ^ Td1[(s2 rk[31]; >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] 24] ^ Td1[(t3 rk[32]; 24] ^ Td1[(t0 rk[33]; 24] ^ Td1[(t1 rk[34]; 24] ^ Td1[(t2 rk[35]; >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] 8) & 0xff] 126 t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; if (Nr > 10) { /* Vong 10: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; /* Vong 11: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; if (Nr > 12) { /* Vong 12: */ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; /* Vong 13: */ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; } } rk += Nr > 24) ] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1 ) & 0xff] & 0x000000ff) ^ rk[0]; PUTU32(pt , s0); s1 = (Td4[(t1 >> 24) ] & 0xff000000) ^ 127 (Td4[(t0 >> 16) (Td4[(t3 >> 8) (Td4[(t2 ) rk[1]; PUTU32(pt + 4, s1); s2 = (Td4[(t2 >> 24) (Td4[(t1 >> 16) (Td4[(t0 >> 8) (Td4[(t3 ) rk[2]; PUTU32(pt + 8, s2); s3 = (Td4[(t3 >> 24) (Td4[(t2 >> 16) (Td4[(t1 >> 8) (Td4[(t0 ) rk[3]; PUTU32(pt + 12, s3); & 0xff] & 0x00ff0000) ^ & 0xff] & 0x0000ff00) ^ & 0xff] & 0x000000ff) ^ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ ] & 0xff000000) & 0xff] & 0x00ff0000) & 0xff] & 0x0000ff00) & 0xff] & 0x000000ff) ^ ^ ^ ^ } Cài đặt thử nghiệm chương trình PMBM_VPN Cấu hình máy chủ cài đặt PMBM_VPN Server: - Intel® Core™ i3-4160 CPU @ 3.60GHz 3.59GHz - Hệ điều hành: Micrsoft Windows Server 2012, 64 bit - RAM 8G Cấu hình máy trạm cài đặt PMBM_VPN Client: - Intel® Core™ i7-4710HQ CPU @ 2.50GHz 2.50GHz - Hệ điều hành: Micrsoft Windows 8, 64 bit - RAM 8G Nhóm đề tài sử dụng cơng cụ Jperf 2.2 để đánh giá tốc độ phần mềm PMBM_VPN Dưới số kết thử nghiệm với thiết lập cấu hình phần mềm PMBM_VPN sử dụng thuật toán mã khối AES chế độ OFB Cấu hình máy VPN Server sử dụng mã pháp AES-256-OFB 128 Hình 1: Cấu hình cho VPN Server Cấu hình máy VPN Client sử dụng mã pháp AES-256-OFB Hình 2: Cấu hình cho VPN Client 129 Một số kết thử nghiệm Hình 3: Tốc độ phần mềm PMBM_VPN (01 luồng) Hình 4: Tốc độ phần mềm PMBM_VPN (4 luồng) 130