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
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);
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.
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
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 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 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 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); 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. 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 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. 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ự 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. Chữ ký số Sơ đồ ký Dữ liệu + Chữ ký 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 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 unsigned unsigned RSA *r); int dlen, char *sig, int siglen, // kích thước message digest // Chữ ký // Chiều dài chữ ký // Khóa công khai Thực hiện bằng OpenSSL DSA - Xem thêm trong sách (phần 7.15) 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 o 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; } 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); } 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/NBdEIMdHNuh0h11GQCXAQXOSL6Fx2hRdcicm6j1CPd3AFrTt,9EATmd4Hj+D4 91jDYXElALfdSbiO0A9Mz6USUepTXwlfVV/cbBpLRz5Rqnyg2EwI2tZRU+E+CuSb / b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w== -----END RSA PRIVATE KEY-— 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 rwflag, 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); 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. index.html#ibm-pcon OpenSSL common commands - NSA Cyber Security 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 -
File đính kèm:
- bai_giang_lap_trinh_an_toan_chuong_6_ma_hoa_cong_khai_luong.docx
- secureprogramming_6_853_505053.pdf