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.

 

docx 17 trang kimcuc 6180
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

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:

  • docxbai_giang_lap_trinh_an_toan_chuong_6_ma_hoa_cong_khai_luong.docx
  • pdfsecureprogramming_6_853_505053.pdf