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 để
103
• 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
• 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…
104
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
• Mã hóa với khóa công khai
• Sử dụng hàm RSA_public_encrypt:
105
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, int p); Kết quả trả về: chiều dài xâu mã được. // Cấu trúc RSA // Kiểu padding
6.1 Mã hóa với OpenSSL RSA
• Giải mã với khóa bí mật
106
• 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
• Bài tập
– Viết chương trình chat console client-‐server sử dụng giải thuật
107
RSA. Chỉ chia sẻ public key trên đường truyền.
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ự
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
108
gửi.
6.2 Chữ ký số
• Sơ đồ ký
Dữ liệu
Dữ liệu + Chữ ký
) 1 A H S (
h s a H
Mã hóa
Chữ ký
Giá trị băm (MD)
Khóa bí mật
109
6.2 Chữ ký số
– 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
• Thực hiện bằng OpenSSL RSA
6.2 Chữ ký số
– 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 RSA
– Xem thêm trong sách (phần 7.15)
111
• Thực hiện bằng OpenSSL DSA
6.3 Biểu diễn khóa
– DER (Binary) – PEM (Plaintext)
• Biểu diễn khóa và chứng thực
– 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
• Biểu diễn DER
6.3 Biểu diễn khóa công khai
– 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
• Biểu diễn DER
6.3 Biểu diễn khóa công khai
– 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
• Biểu diễn PEM (Privacy Enhanced Mail)
6.3 Biểu diễn khóa công khai
– Các hàm OpenSSL:
• Tệp
tiêu
đề
– Ví dụ ghi ra bộ nhớ khóa bí mật RSA được mã hóa dưới dạng PEM – AES256-‐CBC
• Biểu diễn PEM (Privacy Enhanced Mail)
#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
116
• OpenSSL common commands – NSA Cyber Security
6.5 Hạ tầng khóa công khai
– http://security.ncsa.illinois.edu/research/grid-‐howtos/usefulopenssl.html
117
• 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