Bài giảng Lập trình an toàn - Chương 6: Mã hóa công khai cung cấp cho người học các kiến thức: Mã hóa với OpenSSL RSA, chữ ký số, biểu diễn khóa, kết nối SSL, hạ tầng khóa công khai. Hi vọng đây là một tài liệu hữu ích dành cho các bạn sinh viên Công nghệ thông tin dùng làm tài liệu học tập và nghiên cứu.
Chương 6 Mã hóa cơng khai Public Key Cryptography Lương Ánh Hoàng hoangla@soict.hut.edu.vn Nội dung 6.1 Mã hóa với OpenSSL RSA 6.2 Chữ ký số 6.3 Biểu diễn khóa 6.4 Kết nối SSL 6.5 Hạ tầng khóa cơng khai 102 6.1 Mã hóa với OpenSSL RSA • Mã hóa bất đối xứng • Là các giải thuật sử dụng một cặp khóa cho việc mã hóa và giải mã • Dữ liệu được mã hóa bằng khóa cơng khai sẽ được giải mã bằng khóa bí mật và ngược lại • Các giải thuật thông dụng: RSA, DSA, Dif}ie-‐Hellman • Khơng sử dụng trực tiếp để mã hóa dữ liệu vì tốc độ rất chậm • Thường được sử dụng để • Trao đổi khóa đối xứng trong phiên truyền mật • Chữ ký số • Xác nhận danh tính • … 103 6.1 Mã hóa với OpenSSL RSA • OpenSSL RSA • Thường được sử dụng trao đổi khóa • Lưu trữ tất cả thơng tin về một khóa dưới cấu trúc RSA • Tệp tiêu đề rsa.h • Sinh cặp khóa đối xứng bằng hàm RSA *RSA_generate_key(int bits, // Kích thước khóa: 1024,2048… unsigned long exp,// Số mũ: 3, 17, 65537 void (*cb)(int, int, void), // Callback void *cb_arg); 104 6.1 Mã hóa với OpenSSL RSA • Mã hóa với khóa cơng khai • Sử dụng hàm RSA_public_encrypt: int RSA_public_encrypt(int l, // Chiều dài dữ liệu unsigned char *pt, // Xâu/số cần mã unsigned char *ct, // Kết quả RSA *r, // Cấu trúc RSA int p); // Kiểu padding Kết quả trả về: chiều dài xâu mã được 105 6.1 Mã hóa với OpenSSL RSA • Giải mã với khóa bí mật • Sử dụng hàm RSA_private_decrypt: int RSA_private_decrypt(int l, unsigned char *ct, unsigned char *pt, RSA *r, int p); Kết quả trả về: chiều dài xâu giải mã được 106 6.1 Mã hóa với OpenSSL RSA • Bài tập – Viết chương trình chat console client-‐server sử dụng giải thuật RSA Chỉ chia sẻ public key trên đường truyền 107 6.2 Chữ ký số • Chữ ký số dữ liệu nhằm xác thực danh tính của người gửi, tương tự HMAC nhưng sử dụng giải thuật RSA • Quá trình ký số dữ liệu nhận đầu vào là giá trị băm của thơng điệp, khóa bí mật của người gửi, đầu ra là giá trị hàm băm đã được mã hóa • Bên nhận thực hiện q trình ngược lại: tính giá trị băm của thơng điệp, giải mã giá trị băm đã mã hóa của bên gửi bằng khóa cơng khai và so sánh hai giá trị băm này • Hacker khơng thể giả mạo giá trị băm vì khơng có khóa bí mật của bên gửi 108 6.2 Chữ ký số • Sơ đồ ký Hash (SHA1) Dữ liệu Giá trị băm (MD) Dữ liệu + Chữ ký Mã hóa Chữ ký Khóa bí mật 109 6.2 Chữ ký số • Thực hiện bằng OpenSSL RSA – Hàm RSA_sign là hàm mức thấp của OpenSSL thực hiện ký số dữ liệu int RSA_sign(int md_type, // Loại Message Digest: SHA1, MD5… unsigned char *dgst, // Bản thân dữ liệu (Message Digest) unsigned int dlen, // Kích thước unsigned char *sig, // Chữ ký unsigned int *siglen, // Chiều dài chữ ký RSA *r); // Khóa bí mật 110 6.2 Chữ ký số • Thực hiện bằng OpenSSL RSA – Hàm RSA_verify thực hiện cơng việc ngược lại: kiểm tra tính hợp lệ của chữ ký int RSA_verify(int md_type, //Loại message digest: md5,sha1,… unsigned char *dgst, // message digest unsigned int dlen, // kích thước message digest unsigned char *sig, // Chữ ký unsigned int siglen, // Chiều dài chữ ký RSA *r); // Khóa cơng khai • Thực hiện bằng OpenSSL DSA – Xem thêm trong sách (phần 7.15) 111 6.3 Biểu diễn khóa • Biểu diễn khóa và chứng thực – DER (Binary) – PEM (Plaintext) • Biểu diễn DER – Chuẩn quốc tế thông dụng – Các hàm OpenSSL tương ứng: i2d và d2i (internal representation ó DER) – Ví dụ chuyển khóa cơng khai RSA sang lưu trữ dưới dạng DER unsigned char *DER_encode_RSA_public(RSA *rsa, int *len) { unsigned char *buf, *next; *len = i2d_RSAPublicKey(rsa, 0); if (!(buf = next = (unsigned char *)malloc(*len))) return 0; i2d_RSAPublicKey(rsa, &next); /* If we use buf here, return buf; becomes wrong */ return buf; } 112 6.3 Biểu diễn khóa cơng khai • Biểu diễn DER – Ví dụ chuyển khóa từ dạng DER sang dạng khóa cơng khai RSA RSA *DER_decode_RSA_public(unsigned char *buf, long len) { return d2i_RSAPublicKey(0, &buf, len); } 113 6.3 Biểu diễn khóa cơng khai • Biểu diễn PEM (Privacy Enhanced Mail) – Thực chất là biểu diễn DER dưới dạng Base64 và có thêm phần header, footer và có thể mã hóa – Ví dụ -‐-‐-‐-‐-‐BEGIN RSA PRIVATE KEY-‐-‐-‐-‐-‐ Proc-‐Type: 4,ENCRYPTED DEK-‐Info: DES-‐EDE3-‐CBC,F2D4E6438DBD4EA8 LjKQ2r1Yt9foxbHdLKZeClqZuzN7PoEmy+b+dKq9qibaH4pRcwATuWt4/Jzl6y85 NHM6CM4bOV1MHkyD01tFsT4kJ0GwRPg4tKAiTNjE4Yrz9V3rESiQKridtXMOToEp Mj2nSvVKRSNEeG33GNIYUeMfSSc3oTmZVOlHNp9f8LEYWNmIjfzlHExvgJaPrixX QiPGJ6K05kV5FJWRPET9vI+kyouAm6DBcyAhmR80NYRvaBbXGM/MxBgQ7koFVaI5 zoJ/NBdEIMdHNUh0h11GQCXAQXOSL6Fx2hRdcicm6j1CPd3AFrTt9EATmd4Hj+D4 91jDYXElALfdSbiO0A9Mz6USUepTXwlfVV/cbBpLRz5Rqnyg2EwI2tZRU+E+Cusb / b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w== -‐-‐-‐-‐-‐END RSA PRIVATE KEY-‐-‐-‐-‐-‐ 114 6.3 Biểu diễn khóa cơng khai • Biểu diễn PEM (Privacy Enhanced Mail) – Các hàm OpenSSL: • Tệp tiêu đề • PEM_read_*** • PEM_write_*** – Ví dụ ghi ra bộ nhớ khóa bí mật RSA được mã hóa dưới dạng PEM – AES256-‐CBC #include #include int password_cb(char *buf, int len, int rwqlag, void *cb_arg) { strcpy(buf,"hello"); return strlen(buf); } BIO * mem = BIO_new(BIO_s_mem()); BUF_MEM * bp; BIO_get_mem_ptr(mem,&bp); PEM_write_bio_RSAPrivateKey(mem,key,EVP_aes_256_cbc(), 0,0,password_cb,0); 115 6.4 Kết nối SSL • Secure Socket Layer (SSL) là giao thức ở tầng ứng dụng cung cấp dịch vụ kết nối an toàn giữa hai ứng dụng trên cơ sở hạ tầng khóa cơng khai • OpenSSL cung cấp SSL API để có thể viết ứng dụng SSL nhanh chóng • http://www.ibm.com/developerworks/linux/library/l-‐openssl/ index.html#ibm-‐pcon • OpenSSL common commands – NSA Cyber Security 116 6.5 Hạ tầng khóa cơng khai • Sử dụng bên thứ ba để chứng thực danh tính các bên • Chống được hình thức tấn cơng Man-‐In-‐The Middle • Một số lệnh thơng dụng với OpenSSL – http://security.ncsa.illinois.edu/research/grid-‐howtos/usefulopenssl.html 117 ... và có thể mã hóa – Ví dụ -? ?? ?-? ?? ?-? ?? ?-? ?? ?-? ?‐BEGIN RSA PRIVATE KEY-? ?-? ?? ?-? ?? ?-? ?? ?-? ?‐ Proc-‐Type: 4,ENCRYPTED DEK-‐Info: DES-‐EDE 3-? ?‐CBC,F2D4E6438DBD4EA8 LjKQ2r1Yt9foxbHdLKZeClqZuzN7PoEmy+b+dKq9qibaH4pRcwATuWt4/Jzl6y85... zoJ/NBdEIMdHNUh0h11GQCXAQXOSL6Fx2hRdcicm6j1CPd3AFrTt9EATmd4Hj+D4 91jDYXElALfdSbiO0A9Mz6USUepTXwlfVV/cbBpLRz5Rqnyg2EwI2tZRU+E+Cusb / b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w== -? ?? ?-? ?? ?-? ?? ?-? ?? ?-? ?‐END... b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w== -? ?? ?-? ?? ?-? ?? ?-? ?? ?-? ?‐END RSA PRIVATE KEY-? ?-? ?? ?-? ?? ?-? ?? ?-? ?‐ 114 6. 3 Biểu diễn khóa cơng khai • Biểu diễn PEM (Privacy Enhanced Mail) – Các hàm OpenSSL: • Tệp tiêu