在VS中使用OpenSSL庫


准備工作

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

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM