Giáo trình Lập trình An toàn - Chương 6: Mã hóa công khai - Lương Ánh Hoàng

#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)

pdf17 trang | Chia sẻ: huongthu9 | Lượt xem: 364 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Giáo trình 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 về máy bạn click vào nút DOWNLOAD ở trên
Lương  Ánh  Hoàng   hoangla@soict.hut.edu.vn   Chương  6.  Mã  hóa  công  khai   Public  Key  Cryptography   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     Nội  dung   102   •  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  để   •  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     103   •  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);       6.1  Mã  hóa  với  OpenSSL  RSA     104   •  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.     6.1  Mã  hóa  với  OpenSSL  RSA     105   •  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   6.1  Mã  hóa  với  OpenSSL  RSA     106   •  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.   6.1  Mã  hóa  với  OpenSSL  RSA     107   •  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.   6.2  Chữ  ký  số     108   •  Sơ  đồ  ký   6.2  Chữ  ký  số     109   Dữ  liệu   Giá  trị  băm   (MD)   H as h   (S H 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ố     110   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ố     111   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   112   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  DER  –  Ví  dụ  chuyển  khóa  từ  dạng  DER  sang  dạng  khóa  công  khai  RSA     6.3  Biểu  diễn  khóa  công  khai     113   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/NBdEIMdHNUh0h11GQCXAQXOSL6Fx2hRdcicm6j1CPd3AFrTt9EATmd4Hj+D4  91jDYXElALfdSbiO0A9Mz6USUepTXwlfVV/cbBpLRz5Rqnyg2EwI2tZRU+E+Cusb  /b6hcuWyzva895YMUCSyDaLgSsIqRWmXxQV1W2bAgRbs8jD8VF+G9w==    -­‐-­‐-­‐-­‐-­‐END  RSA  PRIVATE  KEY-­‐-­‐-­‐-­‐-­‐   6.3  Biểu  diễn  khóa  công  khai     114   •  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   6.3  Biểu  diễn  khóa  công  khai     115   #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);   •  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.  •  ­‐openssl/index.html#ibm-­‐pcon  •  OpenSSL  common  commands  –  NSA  Cyber  Security   6.4  Kết  nối  SSL   116   •  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  –  ­‐howtos/usefulopenssl.html   6.5  Hạ  tầng  khóa  công  khai     117  

Các file đính kèm theo tài liệu này:

  • pdfgiao_trinh_lap_trinh_an_toan_chuong_6_ma_hoa_cong_khai_luong.pdf