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