Mã hóa đối xứng với OpenSSL

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 64 - 72)

Chương 4 Mã hóa đối xứng

4.5  Mã hóa đối xứng với OpenSSL

•  Giao  diện  OpenSSL  EVP  

•  Là  API  mức  cao  của  OpenSSL,  cho  phép  truy  nhập  đến  các  thuật  toán  ở  mức   thấp  một  cách  tập  trung,  dễ  dàng.  

•  Tệp  tiêu  đề  <openssl/evp.h>.  

•  Tệp  thư  viện:  libeay32.lib,  ssleay32.lib  

•  Mã  hóa  AES  với  OpenSSL  EVP.  

•  Khởi  tạo  khóa,  vector  khởi  tạo,  salt  với  EVP_BytesToKey  hoặc  tự  chọn  một   bộ  Key,  IV  nào  đó.  

•  Khởi  tạo  ngữ  cảnh  mã  hóa  với  hàm  EVP_EncryptInit_ex.  

•  Khởi  tạo  ngữ  cảnh  giải  mã  với  hàm  EVP_DecryptInit_ex.  

•  Mã  hóa  dữ  liệu  bằng  việc  liên  tục  gọi  hàm  EVP_EncryptUpdate,  kết  thúc   quá  trình  mã  hóa  bằng  hàm  EVP_EncryptFinal_ex.  

•  Giải  mã  dữ  liệu  bằng  việc  liên  tục  gọi  hàm  EVP_DecryptUpdate,  kết  thúc   quá  trình  giải  mã  bằng  hàm  EVP_DecryptFinal_ex.  

•  VD  

•  Sinh  key  và  iv  bằng  hàm  EVP_BytesToKey  

char          key[32];  

char          iv[32];      

char  *  key_data  =  “nopass”;     unsigned  int  salt[]  =  {12345,  54321};  

EVP_BytesToKey(EVP_aes_256_cbc(),  EVP_sha1(),  salt,  key_data,  6,  1,  key,   iv);  

•  Khởi  tạo  ngữ  cảnh  mã  hóa  với  key  và  iv  đã  chọn  

EVP_CIPHER_CTX  e_ctx;  

EVP_CIPHER_CTX_init(&e_ctx);  

EVP_EncryptInit_ex(&e_ctx,  EVP_aes_256_cbc(),NULL,  key,  iv);  

•  Khởi  tạo  ngữ  cảnh  giải  mã  với  key  và  iv  đã  chọn  

EVP_CIPHER_CTX  d_ctx;  

•  VD  (tiếp)  

•  Mã  hóa  với  ngữ  cảnh  đã  được  khởi  tạo   char  *    plaintext=“Hello”;  

int  len  =  strlen(plaintext);   char  ciphertext[1024];  

int    c_len  =  0,  f_len  =  0;  

/*  Gọi  lại  hàm  này  để  cho  phép  OpenSSL  sử  dụng  lại  ngữ  cảnh  phiên  mã     hóa  trước  */  

EVP_EncryptInit_ex(e,  NULL,  NULL,  NULL,  NULL);   …  

//  Mỗi  chu  kỳ  Update,  c_len  sẽ  chứa  số  byte  của  xâu  mã  được   EVP_EncryptUpdate(e,  ciphertext,  &c_len,  plaintext,  len);   …  

//  Cuối  chu  kỳ  Update,  f_len  sẽ  chưa  số  byte  còn  lại  của  xâu  mã   EVP_EncryptFinal_ex(e,  ciphertext+c_len,  &f_len);  

…  

•  VD  (tiếp)  

•  Giải  mã  với  ngữ  cảnh  đã  được  khởi  tạo  

 

char  plaintext[1024];   int  p_len  =  0;  

/*  Gọi  lại  hàm  này  để  cho  phép  OpenSSL  sử  dụng  lại  ngữ  cảnh  phiên  giãi   mã    hóa  trước  */  

EVP_DecryptInit_ex(e,  NULL,  NULL,  NULL,  NULL);   …  

//  Giải  mã  với  ciphertext  và  len  được  cung  cấp  trước  

EVP_DecryptUpdate(e,  plaintext,  &p_len,  ciphertext,  *len);   …  

//  Kết  thúc  quá  trình  giải  mã,  cập  nhật  dữ  liệu  còn  lại  vào  plaintext.   EVP_DecryptFinal_ex(e,  plaintext+p_len,  &f_len);  

•  Thư  viện  CryptoAPI  

•  Cung  cấp  các  hàm  mật  mã  học  cơ  bản  thông  qua  các  Cryptographic  Service   Providers  (CSP).    

•  Microsoft  Base  Cryptographic  Service  Provider:  RC2,  RC4,  DES  

•  Microsoft  Enhanced  Cryptographic  Service  Provider:  Triple-­‐DES  

•  Microsoft  AES  Cryptographic  Service  Provider:  AES  

•  …  

•  Cung  cấp  các  hàm  mã  hóa  và  giải  mã  chứng  thư  số,  và  đồng  thời  bổ  sung   các  hàm  băm.  

•  Cung  cấp  các  hàm  quản  lý  và  lưu  trữ  chứng  thư  số.  

•  Các  hàm  mã  thông  điệp  hóa  mức  cao  (Simpli}ied  Message  Functions).  

•  Các  hàm  mã  hóa  thông  điệp  mức  thấp  (Low-­‐Level  Message  Functions).  

 

•  Thư  viện  CryptoAPI  

 

•  Sử  dụng  thư  viện  CryptoAPI  để  thực  hiện  mã  hóa  đối  xứng  thông  điệp   với  thuật  toán  AES.  

•  Tệp  tiêu  đề  wincript.h  

•  Thư  viện  Crypt32.lib  

•  Trình  tự  sử  dụng  

 

       

4.6  Microsoft  Crypto  API  

Khởi  tạo   Provider   Tạo  khóa   • Ngẫu  nhiên   • Từ  mật  khẩu   • Từ  bên  ngoài   Đặt  chế  độ  mã   • CBC   • ECB   • …   Thiết  lập  vector   khởi  tạo   Thực  hiện  Mã   hóa/Giải  mã  

•  Sử  dụng  thư  viện  CryptoAPI  để  thực  hiện  mã  hóa  đối  xứng  thông  điệp   với  thuật  toán  AES.  

•  Khởi  tạo  ngữ  cảnh  Provider  thông  qua  hàm  CryptAcquireContext  

 BOOL  WINAPI  CryptAcquireContext(__out  HCRYPTPROV*  phProv,    

       __in  LPCTSTR  pszContainer,    

       __in  LPCTSTR  pszProvider,    

       __in  DWORD  dwProvType,    

       __in  DWORD  dwFlags  );  

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 64 - 72)

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

(131 trang)