Bài giảng Lập trình an toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng
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, Diffie-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
Bạn đang xem tài liệu "Bài giảng Lập trình an toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình an toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng
Lương Ánh Hoàng hoangla@soict.hut.edu.vn Chương 6. Mã hóa công khai Public Key Cryptography 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 Nội dung 102 • 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 • 6.1 Mã hóa với OpenSSL RSA 103 • 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); 6.1 Mã hóa với OpenSSL RSA 104 • 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. 6.1 Mã hóa với OpenSSL RSA 105 • 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 6.1 Mã hóa với OpenSSL RSA 106 • 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. 6.1 Mã hóa với OpenSSL RSA 107 • Chữ ký số dữ liệu nhằm xác thực danh tính của người gửi, tương tự như 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 quá 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. 6.2 Chữ ký số 108 • Sơ đồ ký 6.2 Chữ ký số 109 Dữ liệu Giá trị băm (MD) H as h (S H A1 ) Chữ ký Khóa bí mật Mã hóa Dữ liệu + Chữ ký • 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 6.2 Chữ ký số 110 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 • 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ý • Thực hiện bằng OpenSSL DSA – Xem thêm trong sách (phần 7.15) 6.2 Chữ ký số 111 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 • 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 6.3 Biểu diễn khóa 112 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; } • Biểu diễn DER – Ví dụ chuyển khóa từ dạng DER sang dạng khóa công khai RSA 6.3 Biểu diễn khóa công khai 113 RSA *DER_decode_RSA_public(unsigned char *buf, long len) { return d2i_RSAPublicKey(0, &buf, len); } • 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-‐-‐-‐-‐-‐ 6.3 Biểu diễn khóa công khai 114 • 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 6.3 Biểu diễn khóa công khai 115 #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); • 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. • ‐openssl/index.html#ibm-‐pcon • OpenSSL common commands – NSA Cyber Security 6.4 Kết nối SSL 116 • 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 – ‐howtos/usefulopenssl.html 6.5 Hạ tầng khóa công khai 117
File đính kèm:
- bai_giang_lap_trinhantoan_chuong_6_ma_hoa_cong_khai_luong_an.pdf