Mã hóa với OpenSSL RSA

Một phần của tài liệu slike bài giảng lập trình an toàn lương ánh hoàng (Trang 103 - 113)

• 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    

Một phần của tài liệu slike bài giảng lập trình an toàn lương ánh hoàng (Trang 103 - 113)

Tải bản đầy đủ (PDF)

(131 trang)