TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL (Luận Văn Thạc Sĩ) Sự phát triển mạnh mẽ của công nghệ thông tin và viễn thông đã tạo ra nhiều bước đột phá về khoa học công nghệ với việc truyền tải thông tin ở các loại hình khác nhau. Đặc biệt là sự phát triển mạnh mẽ của Internet làm cho việc trao đổi và truyền tải thông tin vô cùng tiện lợi. Tuy nhiên việc truyền tải thông tin qua mạng công cộng như vậy đã đặt ra yêu cầu xác thực, bảo mật và toàn vẹn dữ liệu. Giải pháp được sử dụng đó là sử dụng kỹ thuật mật mã để mã hóa bảo vệ thông tin. Việc tùy biến các nguyên thủy mật mã trong đó có thuật toán mã khối cho bộ thư viện OpenSSL là cần thiết để nâng cao độ an toàn cho bộ thư viện. Nội dụng của đồ án được chia làm 3 chương: Chương 1: Tổng quan về OpenSSL Chương này tr ình bày khái quát về OpenSSL bao gồm: lịch sử phát triển, những ứng dụng và một số lỗ hổng bảo mật của OpenSSL. 2 Chương 2: Cấu trúc thư viện mật mã và phương pháp tùy biến thuật toán mã khối cho bộ thư viện OpenSSL Chương này trình bày cấu trúc thư viện mật mã của OpenSSL từ đó đưa ra phương pháp tùy biến thuật toán mã khối cho thư viện. Chương 3: Thực hiện tùy biến thuật toán mã khối cho bộ thư viện OpenSSL Trong chương này trình bày cụ thể các thay đổi mã nguồn của OpenSSL để thêm một thuật toán mã khối INDECT vào thư viện sau đó mã hóa/giải mã thử bằng mã khối INDECT.
i Viện Công Nghệ Thông Tin Và Truyền Thông ĐẠI HỌC BÁCH KHOA HÀ NỘI Luận Văn Thạc Sĩ TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL Nguyen Thanh Long Ha Noi, 2023 ii MỤC LỤC LỜI CẢM ƠN i LỜI CAM ĐOAN ii MỤC LỤC iii CÁC KÝ HIỆU, CHỮ VIẾT TẮT vi MỞ ĐẦU CHƯƠNG 1: TỔNG QUAN VỀ OPENSSL 1.1 Lịch sử phát triển 1.2 Các thành phần OpenSSL 1.2.1 Tính mã hóa 1.2.2 Truyền thông an toàn 1.3 Một số ứng dụng OpenSSL 1.3.1 Tạo kết nối SSL/TLS 1.3.2 Mã hóa/giải mã liệu 1.3.3 Kiểm tra tính tồn vẹn liệu 1.3.4 Các thao tác với chứng số 1.3.5 Một số ứng dụng khác OpenSSL 12 1.4 Lỗ hổng bảo mật OpenSSL 14 1.4.1 Một số công lên giao thức SSL/TLS 14 1.4.2 Một số lỗ hổng bảo mật OpenSSL 15 1.4.3 Lỗ hổng Heartbleed 20 1.5 Kết luận chương 22 iii CHƯƠNG 2: CẤU TRÚC THƯ VIỆN MẬT MÃ VÀ PHƯƠNG PHÁP TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL 23 2.1 Cấu trúc thư viện mật mã OpenSSL 23 2.1.1 Thư viện CRYPTO 23 2.1.2 Thư viện EVP 24 2.1.3 Thư viện ERR 29 2.1.4 Thư viện BIO 33 2.1.5 Thư viện RAND 37 2.1.6 Thư viện SSL 38 2.2 Phương pháp tùy biến thuật toán mã khối cho thư viện OpenSSL 45 2.2.1 Tùy chọn thuật toán mã khối sử dụng tiện ích /config 45 2.2.2 Thêm thuật toán mã khối cách chỉnh sửa mã nguồn 48 2.3 Kết luận chương 49 CHƯƠNG 3: THỰC HIỆN TÙY BIẾN THUẬT TOÁN MÃ KHỐI CHO BỘ THƯ VIỆN OPENSSL 50 3.1 Sửa đổi thư mục crypto 50 3.2 Thay đổi file cấu hình 52 3.2.1 Thêm indect vào file config 52 3.2.2 Thêm indect vào file Configure 52 3.3 Tích hợp giao diện EVP 53 3.3.1 Cấu trúc khóa (Key Structure) 54 3.3.2 Cấu trúc EVP_CIPHER 54 iv 3.3.3 Đặt tên cho EVP_CIPHER 54 3.3.4 Hàm khởi tạo khóa 55 3.3.5 Hàm khởi tạo mã hóa 56 3.4 Sửa đổi với Crypto Objects 58 3.5 Cập nhật evp.h 59 3.6 Tích hợp mã khối indect vào giao thức TLS 59 3.6.1 Sửa đổi tls1.h 59 3.6.2 Sửa đổi ssl.h 60 3.6.3 Sửa đổi s3_lib.c 60 3.6.4 Sửa đổi ssl_ciph.c 61 3.6.5 Sửa đổi ssl/ssl_init.c 63 3.6.6 Sửa đổi ssl/ssl_locl.h 63 3.7 Biên dịch cài đặt 63 3.8 Thử nghiệm mã hóa/giải mã file 63 3.9 Kết luận chương 65 KẾT LUẬN 66 TÀI LIỆU THAM KHẢO 67 v CÁC KÝ HIỆU, CHỮ VIẾT TẮT Viết tắt Tiếng Anh Tiếng Việt Giao diện lập trình ứng dụng API Application Programming Interface CVE Common Vulnerabilities Lỗ hổng tiếp xúc and Exposures thường gặp MAC Message Authentication Code Mã xác thực thông báo SSL Secure Sockets Layer Giao thức bảo mật Web TLS Transport Security Bảo mật tầng truyền tải Layer MỞ ĐẦU Sự phát triển mạnh mẽ công nghệ thông tin viễn thông tạo nhiều bước đột phá khoa học công nghệ với việc truyền tải thông tin loại hình khác Đặc biệt phát triển mạnh mẽ Internet làm cho việc trao đổi truyền tải thông tin vô tiện lợi Tuy nhiên việc truyền tải thông tin qua mạng công cộng đặt yêu cầu xác thực, bảo mật toàn vẹn liệu Giải pháp sử dụng sử dụng kỹ thuật mật mã để mã hóa bảo vệ thơng tin Việc tùy biến nguyên thủy mật mã có thuật toán mã khối cho thư viện OpenSSL cần thiết để nâng cao độ an toàn cho thư viện Nội dụng đồ án chia làm chương: Chương 1: Tổng quan OpenSSL Chương tr ình bày khái quát OpenSSL bao gồm: lịch sử phát triển, ứng dụng số lỗ hổng bảo mật OpenSSL Chương 2: Cấu trúc thư viện mật mã phương pháp tùy biến thuật toán mã khối cho thư viện OpenSSL Chương trình bày cấu trúc thư viện mật mã OpenSSL từ đưa phương pháp tùy biến thuật tốn mã khối cho thư viện Chương 3: Thực tùy biến thuật toán mã khối cho thư viện OpenSSL Trong chương trình bày cụ thể thay đổi mã nguồn OpenSSL để thêm thuật toán mã khối INDECT vào thư viện sau mã hóa/giải mã thử mã khối INDECT CHƯƠNG 1: TỔNG QUAN VỀ OPENSSL 1.1 Lịch sử phát triển OpenSSL công cụ mã nguồn mở, thực giao thức SSL TLS, thuật toán mã hóa quan trọng thường sử dụng chương trình ngày OpenSSL viết ngơn ngữ lập trình C phát triển dựa SSLeay SSLeay ban đầu viết Eric A Young Tim J Hudson bắt đầu vào năm 1995 Vào tháng 12 năm 1998, phát triển SSLeay dừng lại, phiên OpenSSL phát hành 0.9.1c, sử dụng SSLeay 0.9.1b (chưa phát hành) điểm khởi đầu Đến OpenSSL phát hành nhiều phiên bản, với mục đích để hoàn thiện phiên OpenSSL nhà phát triển vá lỗ hổng phiên trước tích hợp thêm chức năng, thuật tốn mật mã mạnh chưa tích hợp phiên cũ Hầu hết phân phối OpenSSL có sẵn cho hầu hết hệ điều hành, bao gồm hệ điều hành Unix, Windows MacOS tải xuống dạng nguồn từ https://www.openssl.org/ Thư viện chia sẻ OpenSSL cài đặt sẵn nhiều phân phối Linux Một số phiên phát hành: Phiên 1.0.0 1.0.1 1.0.2 1.1.0 1.1.0g 1.1.1-pre6 Ngày phát hành 29/03/2010 14/03/2012 22/01/2015 25/08/2016 02/10/2017 01/05/2018 1.2 Các thành phần OpenSSL OpenSSL bao gồm ba thành phần chính: thư viện (libcrypto libssl) cơng cụ dòng lệnh (openssl) Thư viện mật mã cung cấp thuật toán phổ biến cho mật mã đối xứng mật mã khố cơng khai, thuật tốn hàm băm mã xác thực thơng báo Nó cung cấp máy phát số giả ngẫu nhiên hỗ trợ thao tác định dạng chứng thông thường quản lý khóa Thư viện SSL cung cấp triển khai tất phiên giao thức SSL, bao gồm TLSv1 Cơng cụ dịng lệnh để thực loạt nhiệm vụ mã hóa, chẳng hạn tạo, xử lý chứng tệp liên quan 1.2.1 Tính mã hóa Thư viện crypto thực loạt hàm liên quan đến mật mã, bao gồm: mật mã đối xứng, mật mã khóa cơng khai, xử lý chứng hàm băm OpenSSL hỗ trợ nhiều thuật toán mật mã đối xứng Tất nhiên, mã có sẵn để sử dụng với cơng cụ dịng lệnh Nhiều số nhiều mật mã biến thể mật mã sở Các mật mã hỗ trợ cơng cụ dịng lệnh Blowfish, CAST5, DES, 3DES (Triple DES), IDEA, RC2, RC4 RC5 Các phiên OpenSSL bổ sung hỗ trợ cho AES, CAMELLIA, ARIA, Hầu hết thuật toán mã đối xứng hỗ trợ hỗ trợ nhiều chế độ khác nhau, bao gồm CBC, CFB, ECB OFB Đối với mật mã, chế độ mặc định CBC chế độ không định rõ ràng Thư viện crypto cung cấp API cho phép mật mã sử dụng để mã hóa giải mã liệu ứng dụng cách sử dụng thư viện Hơn nữa, cơng cụ dịng lệnh openssl mã hóa giải mã tệp tin có trọng số, sử dụng khóa khóa cung cấp dựa mật 1.2.2 Truyền thông an tồn Bộ cơng cụ OpenSSL cung cấp số tính hữu ích việc cung cấp giao tiếp an toàn qua Internet Thư viện ssl thực giao thức Secure Sockets Layer (SSL v2/v3) Transport Layer Security (TLS v1) Thư viện sử dụng nhà phát triển để đảm bảo ứng dụng bên thứ ba Một ứng dụng OpenVPN SSL (Secure Sockets Layer) người kế nhiệm nó, TLS (Transport Layer Security) giao thức mạng cung cấp giao tiếp an toàn qua Internet SSL/TLS tích hợp chức mã hóa liệu, cho phép ứng dụng máy khách/máy chủ bảo vệ chống lại nghe giả mạo SSL/TLS thường triển khai số giao thức truyền tải, ví dụ: Giao thức điều khiển truyền dẫn (TCP) Nó đóng gói liệu ứng dụng Một lợi lớn SSL/TLS giao thức ứng dụng độc lập Giao thức cấp cao xếp chồng lên giao thức SSL/TLS cách minh bạch SSL TLS sử dụng mật mã đối xứng (ví dụ: AES) để mã hóa liệu Các khóa cho mật mã tạo cho kết nối dựa bí mật thương lượng Giao thức bắt tay SSL/TLS hỗ trợ kết hợp nhiều mật mã, chế xác thực thuật toán băm Các kết hợp gọi „Ciphersuites‟ Ciphersuites chọn trình đàm phán Thư viện ssl thực xử lý giao thức SSL TLS Thư viện ứng dụng bên thứ ba sử dụng để bảo mật kết nối giao thức SSL/TLS Libssl cung cấp API phong phú Nhà phát triển tạo ứng dụng máy chủ ứng dụng khách chức thư viện 53 Thêm INDECT vào bảng vơ hiệu hóa muốn có tùy chọn vơ hiệu hóa mã khối INDECT biên dịch: my @disablables = ( "autoload-config", "bf", "blake2", "camellia", "indect", "capieng", Nếu muốn INDECT bị tắt theo mặc định: # All of the following are disabled by default: our %disabled = ( # "what" => "comment" "fuzz-afl" => "default", "heartbeats" => "default", "md2" => "default", "indect" 3.3 => "default", Tích hợp giao diện EVP EVP cung cấp giao diện mức cao để dễ dàng tương tác với hàm mã hóa OpenSSL mức thấp Tệp crypto/evp/e_indect.c phải tạo để phân nhánh khoảng cách EVP mức cao mật mã INDECT tạo Tạo tệp e_indect.c bao gồm: 54 • Cấu trúc khóa • Cấu trúc EVP_CIPHER (định nghĩa tệp evp_int.h) • Đặt tên cho EVP_CIPHER • Hàm khởi tạo khóa • Hàm khởi tạo mã hóa 3.3.1 Cấu trúc khóa (Key Structure) Cấu trúc bao gồm tất liệu quan trọng cần thiết cho chức mã hóa giải mã Cũng bao gồm trỏ hàm cấu trúc để kiểm sốt xem khóa có sử dụng để mã hóa hay giải mã hay khơng /* INDECT subkey Structure */ typedef struct { INDECT_KEY ks; } EVP_INDECT_KEY; 3.3.2 Cấu trúc EVP_CIPHER Định nghĩa cấu trúc EVP_CIPHER viết tệp crypto/crypto/include/internal/evp_int.h (không cần sửa đổi) Cấu trúc INDECT EVP_CIPHER sử dụng kỹ thuật tiền xử lý C để tự động tạo cấu trúc EVP_CIPHER Đặt tên cho EVP_CIPHER (Naming the EVP_CIPHER) 3.3.3 Đặt tên cho EVP_CIPHER INDECT sử dụng kỹ thuật tiền xử lý C để tự động tạo tên phương thức hoạt động 55 const EVP_CIPHER *EVP_indect_##keylen##_##mode(void) \ { return &indect_##keylen##_##mode; } const EVP_CIPHER *EVP_indect_##keylen##_##mode(void) \ { return (EVP_CIPHER*)&indect_##keylen##_##mode; } 3.3.4 Hàm khởi tạo khóa Dưới khởi tạo khóa cho INDECT tùy thuộc vào chế độ người dùng yêu cầu thông qua giao diện EVP /* The subkey for INDECT is generated */ static int indect_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,const unsigned char *iv, int enc) { int ret; int mode = EVP_CIPHER_CTX_mode(ctx); if (enc || (mode != EVP_CIPH_ECB_MODE && mode != EVP_CIPH_CBC_MODE)) EVP_CIPHER_CTX_get_cipher_data(ctx)); if (ret < 0) { EVPerr(EVP_F_INDECT_INIT_KEY,EVP_R_INDECT_KEY_SETUP_ FAILED); return 0; } return 1; } 56 Cách tiếp cận khác sử dụng tham số mã hóa để xác định xem khóa có sử dụng để mã hóa hay giải mã hay khơng Giá trị cho enc mã hóa để giải mã 3.3.5 Hàm khởi tạo mã hóa Một khoá tạo EVP gọi hàm khởi tạo mã hoá gán cấu trúc EVP_CIPHER Chức vượt qua tham số để thực mức thấp INDECT static void indect_cbc_encrypt(const unsigned char *in, unsigned char *out,size_t len, const INDECT_KEY *key, unsigned char *ivec, const int enc) { if (enc) CRYPTO_cbc128_encrypt(in, out, len, key, ivec, (block128_f) indect_encrypt); else CRYPTO_cbc128_decrypt(in, out, len, key, ivec, (block128_f) indect_encrypt); } Sau hoàn thành tệp e_indect.c thêm vào tệp build.info crypto/evp LIBS= / /libcrypto SOURCE[ / /libcrypto]=\ encode.c digest.c evp_enc.c evp_key.c evp_cnf.c \ e_des.c e_bf.c e_indect.c \ e_idea.c e_des3.c e_camellia.c 57 Khi xây dựng xong e_indect, phải đăng ký với hệ thống EVP Sửa đổi crypto/evp/c_allc.c để đăng ký INDECT #ifndef OPENSSL_NO_INDECT EVP_add_cipher(EVP_indect_128_ecb()); EVP_add_cipher(EVP_indect_128_cbc()); EVP_add_cipher(EVP_indect_128_cfb()); EVP_add_cipher(EVP_indect_128_cfb1()); EVP_add_cipher(EVP_indect_256_ecb()); EVP_add_cipher(EVP_indect_256_cbc()); EVP_add_cipher(EVP_indect_256_cfb()); EVP_add_cipher(EVP_indect_256_cfb1()); EVP_add_cipher(EVP_indect_256_cfb8()); EVP_add_cipher(EVP_indect_256_ctr()); EVP_add_cipher(EVP_indect_256_ofb()); EVP_add_cipher(EVP_indect_256_gcm()); EVP_add_cipher(EVP_indect_256_ccm()); EVP_add_cipher_alias(SN_indect_256_cbc, "INDECT256"); EVP_add_cipher_alias(SN_indect_256_cbc, "indect256"); #endif 58 3.4 Sửa đổi với Crypto Objects Crypto object IDs sử dụng để ánh xạ tên tới chế độ mã hóa INDECT cho Để thêm ID đối tượng cho INDECT suite, phải sửa đổi tệp crypto/objects/objects.txt: # Definitions for INDECT cipher !Alias indect 410 200046 1 indect : INDECT-128-ECB : indect-128-ecb indect : INDECT-128-CBC : indect-128-cbc !Cname indect-128-cfb128 indect : INDECT-128-CFB : indect-128-cfb !Cname indect-128-ofb128 indect indect : INDECT-128-OFB : INDECT-128-CTR : indect-128-ofb : indect-128-ctr indect : INDECT-192-ECB : indect-192-ecb indect : INDECT-192-CBC : indect-192-cbc !Cname indect-192-cfb128 indect : INDECT-192-CFB : indect-192-cfb !Cname indect-192-ofb128 indect : INDECT-192-OFB : indect-192-ofb Sau thêm INDECT vào tệp objects.txt phải chạy cập nhật để tự động tạo crypto/objects/obj_dat.h crypto/objects/obj_mac.num (khi hoàn thành tất sửa đổi chạy lệnh make update) 59 3.5 Cập nhật evp.h Tệp tiêu đề include/openssl/evp.h yêu cầu chế độ INDECT phải thêm vào Đây tên EVP_CIPHER tạo e_indect.c # ifndef OPENSSL_NO_INDECT const EVP_CIPHER *EVP_indect_128_ecb(void); const EVP_CIPHER *EVP_indect_128_cbc(void); const EVP_CIPHER *EVP_indect_128_cfb1(void); const EVP_CIPHER *EVP_indect_128_cfb8(void); const EVP_CIPHER *EVP_indect_128_cfb128(void); 3.6 Tích hợp mã khối indect vào giao thức TLS 3.6.1 Sửa đổi tls1.h /include/openssl/tls1.h nơi chữ ký mật mã INDECT xác định #define TLS1_CK_RSA_WITH_INDECT_128_GCM_SHA256 0x0300FF70 #define TLS1_CK_RSA_WITH_INDECT_256_GCM_SHA384 0x0300FF71 #define TLS1_CK_DHE_RSA_WITH_INDECT_128_GCM_SHA256 0x0300FF72 #define TLS1_CK_DHE_RSA_WITH_INDECT_256_GCM_SHA384 0x0300FF73 #define TLS1_CK_ECDHE_ECDSA_WITH_INDECT_128_GCM_SHA256 0x0300FF7C Điều quan trọng cần lưu ý là nơi thuật toán trao đổi khóa, xác thực thuật tốn MAC chọn theo tên sau thực s3_lib.c Một chữ ký xác định, tên đại diện cho cần xác định: 60 /* INDECT ciphersuites */ # define TLS1_TXT_RSA_WITH_INDECT_128_GCM_SHA256 "INDECT128-GCM-SHA256" # define TLS1_TXT_RSA_WITH_INDECT_256_GCM_SHA384 "INDECT256-GCM-SHA384" # define TLS1_TXT_DHE_RSA_WITH_INDECT_128_GCM_SHA256 "DHE-RSA-INDECT128-GCM-SHA256" # define TLS1_TXT_DHE_RSA_WITH_INDECT_256_GCM_SHA384 "DHE-RSA-INDECT256-GCM-SHA384" # define TLS1_TXT_ECDHE_ECDSA_WITH_INDECT_128_GCM_SHA256 "ECDHE-ECDSA-INDECT128-GCM-SHA256" # define TLS1_TXT_ECDHE_ECDSA_WITH_INDECT_256_GCM_SHA384 "ECDHE-ECDSA-INDECT256-GCM-SHA384" 3.6.2 Sửa đổi ssl.h /include/openssl/ssl.h cần khai báo tên chuỗi sử dụng mật mã INDECT # define SSL_TXT_INDECT "INDECT" # define SSL_TXT_INDECT_GCM "INDECTGCM" # define SSL_TXT_INDECT128 "INDECT128" # define SSL_TXT_INDECT256 "INDECT256" 3.6.3 Sửa đổi s3_lib.c Để sử dụng INDECT với TLS cần xác định kết hợp hợp lý theo tiêu chuẩn khác Chúng định nghĩa tập tin ssl/s3_lib.c 61 { 1, TLS1_TXT_ECDHE_ECDSA_WITH_INDECT_256_GCM_SHA384, TLS1_RFC_ECDHE_ECDSA_WITH_INDECT_256_GCM_SHA384, TLS1_CK_ECDHE_ECDSA_WITH_INDECT_256_GCM_SHA384, SSL_kECDHE, SSL_aECDSA, SSL_INDECT256GCM, SSL_AEAD, TLS1_2_VERSION, TLS1_2_VERSION, DTLS1_2_VERSION, DTLS1_2_VERSION, SSL_HIGH | SSL_FIPS, SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384, 256, 256, }, 3.6.4 Sửa đổi ssl_ciph.c Tệp ssl/ssl_ciph.c cần số cho mã khối INDECT có sẵn từ TLS Trong bảng ban đầu #define: #define SSL_ENC_INDECT128GCM_IDX 22 #define SSL_ENC_INDECT256GCM_IDX 23 #define SSL_ENC_NUM_IDX 24 62 Trong bảng ssl_cipher_table_cipher NID cho mật mã thêm INDECT vào: {SSL_INDECT128GCM, NID_indect_128_gcm}, /*SSL_ENC_INDECT128GCM_IDX 22 */ {SSL_INDECT256GCM, NID_indect_256_gcm}, /*SSL_ENC_INDECT256GCM_IDX 23 */ Bản đồ lập đồ yêu cầu ARIBI INDECT tới giá trị NID tương ứng INDECT, sau xem xét để lồng vào thực INDECT libcrypto Điều coi bắc cầu khoảng cách libssl libcrypto Tiếp tục bí danh phải tạo cho mã khối: {0, SSL_TXT_INDECT, NULL, 0, 0, 0, SSL_INDECT}, {0, SSL_TXT_INDECT_GCM, NULL, 0, 0, 0, SSL_INDECT128GCM | SSL_INDECT256GCM}, {0, SSL_TXT_INDECT128, NULL, 0, 0, 0, SSL_INDECT128GCM}, {0, SSL_TXT_INDECT256, NULL, 0, 0, 0, SSL_INDECT256GCM}, Cuối thêm mô tả INDECT vào câu lệnh chuyển đổi hàm SSL_CIPHER_description: case SSL_INDECT128GCM: /* sua */ enc = "INDECTGCM(128)"; break; case SSL_INDECT256GCM: enc = "INDECTGCM(256)"; /* sua */ break; 63 3.6.5 Sửa đổi ssl/ssl_init.c Hàm ssl/ssl_init.c cần phải đăng ký có điều kiện mật mã INDECT chèn với mật mã khác: #ifndef OPENSSL_NO_INDECT EVP_add_cipher(EVP_indect_128_gcm()); EVP_add_cipher(EVP_indect_256_gcm()); #endif 3.6.6 Sửa đổi ssl/ssl_locl.h Tệp chứa bit cho SSL_INDECT định nghĩa nhóm: # define SSL_INDECT128GCM 0x00400000U # define SSL_INDECT256GCM 0x00800000U # define SSL_INDECTGCM (SSL_INDECT128GCM | SSL_INDECT256GCM) # define SSL_INDECT 3.7 (SSL_INDECTGCM) Biên dịch cài đặt Sau hoàn thành sửa đổi thư viện, biên dịch cài đặt OpenSSL Sử dụng lệnh sau: [root@localhost openssl-1.1.1-pre6]# /config make && make update && make install 3.8 Thử nghiệm mã hóa/giải mã file Sau cài đặt thành công OpenSSL sử dụng số lệnh giao diện dòng lệnh openssl: && 64 Để kiểm tra phiên sử dụng lệnh openssl version: [root@localhost openssl-1.1.1-pre6]# openssl version OpenSSL 1.1.1-pre6 (beta) May 2018 + Ma khoi INDECDT Để xem lệnh openssl, mật mã có để mã hóa/giải mã (lệnh enc) hàm băm hỗ trợ, sử dụng lệnh openssl help: [root@localhost openssl-1.1.1-pre6]# openssl help Standard commands enc engine errstr Message Digest commands (see the `dgst' command for more details) sha3-384 sha3-512 sha384 Cipher commands (see the `enc' command for more details) indect-128-cfb8 indect-128-ctr indect-128-ecb Ta thấy mã khối INDECT thêm vào thư viện OpenSSL Mã hóa file test.txt với mã khối INDECT: [root@localhost openssl-1.1.1-pre6]# openssl enc –e -indect-256-cbc -in /root/Desktop/test.txt -out /root/Desktop/test.enc.txt enter indect-256-cbc encryption password: Verifying - enter indect-256-cbc encryption password: 65 Giải mã file test.enc.txt: [root@localhost Desktop]# openssl enc -d -indect256-cbc -in /root/Desktop/test.enc.txt -out /root/Desktop/giaima.txt enter indect-256-cbc decryption password: Kiểm tra ciphersuite INDECT có hỗ trợ khơng sử dụng lệnh #openssl ciphers: [root@localhost Desktop]# openssl ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:D HE-RSA-CHACHA20-POLY1305:DHE-RSA-INDECT256-GCMSHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSAINDECT128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHERSA-AES256-SHA384:DHE-RSA-AES256-SHA256:DHE-PSKCHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:RSA-PSKINDECT256-GCM-SHA384:RSA-PSK-INDECT256-GCMSHA384:DHE-PSK-INDECT256-GCM-SHA384:DHE-PSKINDECT256-GCM-SHA384:AES256-GCM-SHA384:INDECT256-GCMSHA384:PSK-AES256-GCM-SHA384:RSA-PSK-AES128-GCM-SHA256 Các ciphersuite INDECT hỗ trợ 3.9 Kết luận chương Dựa vào kiến thức tìm hiểu chương 2, chương thực việc thêm mã khối INDECT vào thư viện OpenSSL cách chỉnh sửa mã nguồn Từ mã nguồn sửa đổi thực biên dịch, cài đặt OpenSSL mã hóa/giải mã file với mã khối thêm vào 66 KẾT LUẬN ✓ Tìm hiểu lịch sử phát triển, số ứng dụng lỗ hổng bảo mật OpenSSL ✓ Tìm hiểu, nghiên cứu cấu trúc thư viện mật mã OpenSSL ✓ Tìm hiểu số phương pháp tùy biến thuật toán mã khối thư viện OpenSSL ✓ Đã thực thành công việc thêm thuật toán mã khối vào thư viện OpenSSL ✓ Sử dụng mã khối thêm vào thư viện để mã hóa/ giải mã file ✓ Tìm hiểu, nghiên cứu phương pháp tùy biến thuật toán sinh số ngẫu nhiên ✓ Tìm hiểu, nghiên cứu phương pháp tùy biến thuật tốn hàm băm ✓ Tìm hiểu, nghiên cứu phương pháp tùy biến thuật tốn dẫn xuất khóa ✓ Tìm hiểu, nghiên cứu phương pháp tùy biến thuật tốn mã hóa khóa cơng khai ✓ Tìm hiểu, nghiên cứu phương pháp tùy biến giao thức trao đổi khóa TÀI LIỆU THAM KHẢO [1] O‟Reilly & Asociates, Network Security with OpenSSL, 2002 [2] William Stallings, Cryptography and network security: Principles and practice, 2005 [3] Syngress, Hack Proofing Your Web Applications, 2001 [4] Openssl Cryptography and SST/TLS Toolkit https://openssl.org [5] CVE Detai