准備工作
1、在項目名稱上單機右鍵,點擊屬性。在“配置屬性”中選擇“VC++目錄”,填寫openssl中的頭文件位置和庫文件位置。
2、在“連接器”選項中的“輸入”中填寫庫的名稱,libssl.lib和libcrypto.lib
3、將OpenSSL文件中bin目錄下的libcrpto-1_1.dll和libssl-1_1.dll兩個文件拷貝到當前項目的文件下
使用OpenSSL進行單項散列函數計算,以MD5為例
#define _CRT_SECURE_NO_WARNINGS #include<openssl/md5.h> #include <stdio.h> #include <string.h> #include <stdlib.h> void getMD5(const char* str, char* result) { MD5_CTX ctx; MD5_Init(&ctx); MD5_Update(&ctx, str, strlen(str)); unsigned char md[MD5_DIGEST_LENGTH] = { 0 }; MD5_Final(md, &ctx); //轉變為16進制 for (int i = 0; i < MD5_DIGEST_LENGTH; ++i) { sprintf(&result[i * 2], "%02x", md[i]); } } int main() { char result[33] = { 0 }; getMD5("hello, md5", result); printf("md5 value: %s\n", result); system("pause"); return 0; }
使用OpenSSL完成消息認證碼。消息認證碼是為了保障信息沒有被篡改,前提是雙方要約定好相同的密鑰和哈希算法。
以生成消息認證碼為例
#define _CRT_SECURE_NO_WARNINGS #include<openssl/hmac.h> #include<openssl/sha.h> #include<iostream> using namespace std; int main() { /*unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len, const unsigned char *d, size_t n, unsigned char *md, unsigned int *md_len);*/ //約定好的密鑰 char key[] = "ad12ni12"; //原始數據 char data[] = "hello world how are you"; unsigned char md[SHA256_DIGEST_LENGTH] = { 0 }; //存放16進制的消息認證碼 char mdbuf[2 * SHA256_DIGEST_LENGTH + 1] = { 0 }; unsigned int len = 0; //參數1:約定好的算法;參數2:密鑰;參數3:密鑰長度;參數4:原始數據;參數5:原始數據的長度 //參數6:傳出的認證碼,參數7:傳出參數,認證碼的長度 HMAC(EVP_sha256(), key, strlen(key),(unsigned char *) data, strlen(data), md, &len); //將消息認證碼轉換成16進制 for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { sprintf(&mdbuf[2 * i], "%02x", md[i]); } cout << "得到的散列值:" << mdbuf << endl; }
使用OpenSSL完成對稱加密。以AES算法CBC模式為例。CBC模式需要約定好初始化向量
#include<openssl/aes.h> #include<iostream> using namespace std; //對稱加密的密鑰 const char* mykey = "0123456789abcdef"; //原始明文 const char *mystr = "hello world, how are you, i am fine, think you hahah"; void decrypto(const char *ciphertext, const unsigned char *key, unsigned char *iv, unsigned char **outText) { AES_KEY aes; AES_set_decrypt_key(key, 128, &aes); int datalen = strlen(mystr) + 1; unsigned char *decrypt = (unsigned char*)calloc(datalen, 1); AES_cbc_encrypt((unsigned char*)ciphertext, decrypt, datalen, &aes, iv, AES_DECRYPT); *outText = decrypt; } void encryptoText(const char *plainText,const unsigned char *key, unsigned char *iv,unsigned char **outText) { AES_KEY aes; AES_set_encrypt_key(key, 128, &aes); //參數2為比特位 //向上調整為16的倍數 int datalen; if ((strlen(plainText) + 1) % 16 == 0) { datalen = strlen(plainText) + 1; } else { datalen = ((strlen(plainText) + 1) / 16 + 1) * 16; } unsigned char *cipherText = (unsigned char *)calloc(datalen, 1); AES_cbc_encrypt((unsigned char *)plainText, cipherText, datalen, &aes, iv, AES_ENCRYPT); *outText = cipherText; } int main() { //初始化向量,長度和密鑰一致 unsigned char iv[16]; memset(iv, 'a', sizeof(iv)); unsigned char *cipher = NULL; //加密 encryptoText(mystr, (unsigned char*)mykey, iv, &cipher); cout << "密文:" << cipher << endl; cout << "------------" << endl; //解密 unsigned char *text = NULL; memset(iv, 'a', sizeof(iv)); decrypto((char*)cipher, (unsigned char*)mykey, iv, &text); cout << "明文:" << text << endl;
free(cipher);
free(text);
}