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ữ

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  đề       •  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

•  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