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

 

pdf 17 trang yennguyen 5560
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
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	
  

File đính kèm:

  • pdfbai_giang_lap_trinhantoan_chuong_6_ma_hoa_cong_khai_luong_an.pdf