• Mã hóa bất đối xứng
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);
• 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ố 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.
• Sơ đồ ký 6.2 Chữ ký số Dữ liệu Giá trị băm (MD) H ash (SH 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ố
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ố
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
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);
• Biểu diễn DER
– Ví dụ chuyển khóa từ dạng DER sang dạng khóa công khai RSA