• openssl md5 sha256 rsa des


    原文地址找不到了

    #include <windows.h>
    #include <iostream>
    #include <cassert>
    #include <string>
    #include <vector>
    #include "openssl/md5.h"
    #include "openssl/sha.h"
    #include "openssl/des.h"
    #include "openssl/rsa.h"
    #include "openssl/pem.h"

    #include "utils.h"
    #include<string.h>


    #ifdef WIN32
    #pragma comment(lib, "libcrypto.lib")
    #pragma comment(lib, "libssl.lib")
    #endif

    // ---- md5摘要哈希 ---- //
    void md5(const std::string &srcStr, std::string &encodedStr, std::string &encodedHexStr)
    {
    // 调用md5哈希
    unsigned char mdStr[33] = {0};
    MD5((const unsigned char *)srcStr.c_str(), srcStr.length(), mdStr);

    // 哈希后的字符串
    encodedStr = std::string((const char *)mdStr);
    // 哈希后的十六进制串 32字节
    char buf[65] = {0};
    char tmp[3] = {0};
    for (int i = 0; i < 32; i++)
    {
    sprintf(tmp, "%02x", mdStr[i]);
    strcat(buf, tmp);
    }
    buf[32] = ''; // 后面都是0,从32字节截断
    encodedHexStr = std::string(buf);
    }

    // ---- sha256摘要哈希 ---- //
    void sha256(const std::string &srcStr, std::string &encodedStr, std::string &encodedHexStr)
    {
    // 调用sha256哈希
    unsigned char mdStr[33] = {0};
    SHA256((const unsigned char *)srcStr.c_str(), srcStr.length(), mdStr);

    // 哈希后的字符串
    encodedStr = std::string((const char *)mdStr);
    // 哈希后的十六进制串 32字节
    char buf[65] = {0};
    char tmp[3] = {0};
    for (int i = 0; i < 32; i++)
    {
    sprintf(tmp, "%02x", mdStr[i]);
    strcat(buf, tmp);
    }
    buf[32] = ''; // 后面都是0,从32字节截断
    encodedHexStr = std::string(buf);
    }

    // ---- des对称加解密 ---- //
    // 加密 ecb模式
    std::string des_encrypt(const std::string &clearText, const std::string &key)
    {
    std::string cipherText; // 密文

    DES_cblock keyEncrypt;
    memset(keyEncrypt, 0, 8);

    // 构造补齐后的密钥
    if (key.length() <= 8)
    memcpy(keyEncrypt, key.c_str(), key.length());
    else
    memcpy(keyEncrypt, key.c_str(), 8);

    // 密钥置换
    DES_key_schedule keySchedule;
    DES_set_key_unchecked(&keyEncrypt, &keySchedule);

    // 循环加密,每8字节一次
    const_DES_cblock inputText;
    DES_cblock outputText;
    std::vector<unsigned char> vecCiphertext;
    unsigned char tmp[8];

    for (int i = 0; i < clearText.length() / 8; i++)
    {
    memcpy(inputText, clearText.c_str() + i * 8, 8);
    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);
    memcpy(tmp, outputText, 8);

    for (int j = 0; j < 8; j++)
    vecCiphertext.push_back(tmp[j]);
    }

    if (clearText.length() % 8 != 0)
    {
    int tmp1 = clearText.length() / 8 * 8;
    int tmp2 = clearText.length() - tmp1;
    memset(inputText, 0, 8);
    memcpy(inputText, clearText.c_str() + tmp1, tmp2);
    // 加密函数
    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);
    memcpy(tmp, outputText, 8);

    for (int j = 0; j < 8; j++)
    vecCiphertext.push_back(tmp[j]);
    }

    cipherText.clear();
    cipherText.assign(vecCiphertext.begin(), vecCiphertext.end());

    return cipherText;
    }

    // 解密 ecb模式
    std::string des_decrypt(const std::string &cipherText, const std::string &key)
    {
    std::string clearText; // 明文

    DES_cblock keyEncrypt;
    memset(keyEncrypt, 0, 8);

    if (key.length() <= 8)
    memcpy(keyEncrypt, key.c_str(), key.length());
    else
    memcpy(keyEncrypt, key.c_str(), 8);

    DES_key_schedule keySchedule;
    DES_set_key_unchecked(&keyEncrypt, &keySchedule);

    const_DES_cblock inputText;
    DES_cblock outputText;
    std::vector<unsigned char> vecCleartext;
    unsigned char tmp[8];

    for (int i = 0; i < cipherText.length() / 8; i++)
    {
    memcpy(inputText, cipherText.c_str() + i * 8, 8);
    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_DECRYPT);
    memcpy(tmp, outputText, 8);

    for (int j = 0; j < 8; j++)
    vecCleartext.push_back(tmp[j]);
    }

    if (cipherText.length() % 8 != 0)
    {
    int tmp1 = cipherText.length() / 8 * 8;
    int tmp2 = cipherText.length() - tmp1;
    memset(inputText, 0, 8);
    memcpy(inputText, cipherText.c_str() + tmp1, tmp2);
    // 解密函数
    DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_DECRYPT);
    memcpy(tmp, outputText, 8);

    for (int j = 0; j < 8; j++)
    vecCleartext.push_back(tmp[j]);
    }

    clearText.clear();
    clearText.assign(vecCleartext.begin(), vecCleartext.end());

    return clearText;
    }


    // ---- rsa非对称加解密 ---- //
    #define KEY_LENGTH 2048 // 密钥长度
    #define PUB_KEY_FILE "pubkey.pem" // 公钥路径
    #define PRI_KEY_FILE "prikey.pem" // 私钥路径
    #define MAXPATH 1024

    // 函数方法生成密钥对
    void generateRSAKey(std::string strKey[2], char * key_pri_path)
    {
    // 公私密钥对
    size_t pri_len;
    size_t pub_len;
    char *pri_key = NULL;
    char *pub_key = NULL;
    char path[MAXPATH] = {0};
    char pub_path[MAXPATH] = {0};
    char *p = NULL;

    p = strrchr(key_pri_path, '/');
    if(p){
    memcpy(path, key_pri_path, (p - key_pri_path));
    }else{
    strcpy(path, ".");
    }

    //printf("path == %s ", path);
    CreateDirEx(path);

    sprintf(pub_path, "%s/pub_%s", path, p+1);

    // 生成密钥对
    RSA *keypair = RSA_generate_key(KEY_LENGTH, RSA_3, NULL, NULL);

    BIO *pri = BIO_new(BIO_s_mem());
    BIO *pub = BIO_new(BIO_s_mem());

    PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
    PEM_write_bio_RSAPublicKey(pub, keypair);

    // 获取长度
    pri_len = BIO_pending(pri);
    pub_len = BIO_pending(pub);

    // 密钥对读取到字符串
    pri_key = (char *)malloc(pri_len + 1);
    pub_key = (char *)malloc(pub_len + 1);

    BIO_read(pri, pri_key, pri_len);
    BIO_read(pub, pub_key, pub_len);

    pri_key[pri_len] = '';
    pub_key[pub_len] = '';

    // 存储密钥对
    strKey[0] = pub_key;
    strKey[1] = pri_key;

    // 存储到磁盘(这种方式存储的是begin rsa public key/ begin rsa private key开头的)
    FILE *pubFile = fopen(pub_path, "w");
    if (pubFile == NULL)
    {
    assert(false);
    return;
    }
    fputs(pub_key, pubFile);
    fclose(pubFile);

    FILE *priFile = fopen(key_pri_path, "w");
    if (priFile == NULL)
    {
    assert(false);
    return;
    }
    fputs(pri_key, priFile);
    fclose(priFile);

    // 内存释放
    RSA_free(keypair);
    BIO_free_all(pub);
    BIO_free_all(pri);

    free(pri_key);
    free(pub_key);
    }

    // 命令行方法生成公私钥对(begin public key/ begin private key)
    // 找到openssl命令行工具,运行以下
    // openssl genrsa -out prikey.pem 1024
    // openssl rsa - in privkey.pem - pubout - out pubkey.pem

    // 公钥加密
    std::string rsa_pub_encrypt(const std::string &clearText, const std::string &pubKey)
    {
    std::string strRet;
    RSA *rsa = NULL;
    BIO *keybio = BIO_new_mem_buf((unsigned char *)pubKey.c_str(), -1);
    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    //RSA* pRSAPublicKey = RSA_new();
    rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);

    int len = RSA_size(rsa);
    char *encryptedText = (char *)malloc(len + 1);
    memset(encryptedText, 0, len + 1);

    // 加密函数
    int ret = RSA_public_encrypt(clearText.length(), (const unsigned char*)clearText.c_str(), (unsigned char*)encryptedText, rsa, RSA_PKCS1_PADDING);
    if (ret >= 0)
    strRet = std::string(encryptedText, ret);

    // 释放内存
    free(encryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);

    return strRet;
    }

    // 私钥加密
    char * rsa_pri_encrypt(const unsigned char* clearText, int str_leng, unsigned char * priKey)
    {
    RSA *rsa = NULL;
    BIO *keybio = BIO_new_mem_buf(priKey, -1);
    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    //RSA* pRSAPrivateKey = RSA_new();
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);

    int len = RSA_size(rsa);
    char *encryptedText = (char *)malloc(len + 1);
    memset(encryptedText, 0, len + 1);

    // 加密函数
    int ret = RSA_private_encrypt(str_leng, (const unsigned char*)clearText, (unsigned char*)encryptedText, rsa, RSA_PKCS1_PADDING);
    /* if (ret >= 0)
    printf("success ");*/

    // 释放内存
    //free(encryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);

    return encryptedText;
    }

    // 公钥解密
    char * rsa_pub_decrypt(const unsigned char* cipherText, int str_leng, unsigned char * pubKey)
    {
    RSA *rsa = RSA_new();

    BIO *keybio;
    keybio = BIO_new_mem_buf(pubKey, -1);

    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);

    int len = RSA_size(rsa);
    char *decryptedText = (char *)malloc(len + 1);
    memset(decryptedText, 0, len + 1);

    // 解密函数
    int ret = RSA_public_decrypt(str_leng, (const unsigned char*)cipherText, (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
    // if (ret >= 0)
    // strRet = std::string(decryptedText, ret);

    // 释放内存
    // free(decryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);

    return decryptedText;
    }

    // 私钥解密
    std::string rsa_pri_decrypt(const std::string &cipherText, const std::string &priKey)
    {
    std::string strRet;
    RSA *rsa = RSA_new();
    BIO *keybio;
    keybio = BIO_new_mem_buf((unsigned char *)priKey.c_str(), -1);

    // 此处有三种方法
    // 1, 读取内存里生成的密钥对,再从内存生成rsa
    // 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
    // 3,直接从读取文件指针生成rsa
    rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);

    int len = RSA_size(rsa);
    char *decryptedText = (char *)malloc(len + 1);
    memset(decryptedText, 0, len + 1);

    // 解密函数
    int ret = RSA_private_decrypt(cipherText.length(), (const unsigned char*)cipherText.c_str(), (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
    if (ret >= 0)
    strRet = std::string(decryptedText, ret);

    // 释放内存
    free(decryptedText);
    BIO_free_all(keybio);
    RSA_free(rsa);

    return strRet;
    }

    int main111(int argc, char **argv)
    {
    // 原始明文
    std::string srcText = "this is an example";
    /* HMODULE hDllLib = LoadLibraryA("libssl-1_1.dll");
    //HMODULE hDllLib = LoadLibraryA("mp110502.dll");

    if (hDllLib)
    {
    std::cout << "=== 333333333333 ===" << std::endl;
    }

    */
    std::string encryptText;
    std::string encryptHexText;
    std::string decryptText;

    std::cout << "=== 原始明文 ===" << std::endl;
    std::cout << srcText << std::endl;

    // md5
    std::cout << "=== md5哈希 ===" << std::endl;
    md5(srcText, encryptText, encryptHexText);
    std::cout << "摘要字符: " << encryptText << std::endl;
    std::cout << "摘要串: " << encryptHexText << std::endl;

    // sha256
    std::cout << "=== sha256哈希 ===" << std::endl;
    sha256(srcText, encryptText, encryptHexText);
    std::cout << "摘要字符: " << encryptText << std::endl;
    std::cout << "摘要串: " << encryptHexText << std::endl;

    // des
    std::cout << "=== des加解密 ===" << std::endl;
    std::string desKey = "12345";
    encryptText = des_encrypt(srcText, desKey);
    std::cout << "加密字符: " << std::endl;
    std::cout << encryptText << std::endl;
    decryptText = des_decrypt(encryptText, desKey);
    std::cout << "解密字符: " << std::endl;
    std::cout << decryptText << std::endl;

    // rsa
    std::cout << "=== rsa加解密 ===" << std::endl;
    std::string key[2];
    generateRSAKey(key,"./");
    std::cout << "公钥: " << std::endl;
    std::cout << key[0] << std::endl;
    std::cout << "私钥: " << std::endl;
    std::cout << key[1] << std::endl;
    encryptText = rsa_pub_encrypt(srcText, key[0]);
    std::cout << "加密字符: " << std::endl;
    std::cout << encryptText << std::endl;
    decryptText = rsa_pri_decrypt(encryptText, key[1]);
    std::cout << "解密字符: " << std::endl;
    std::cout << decryptText << std::endl;

    system("pause");
    return 0;
    }

  • 相关阅读:
    rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)
    opencart配置mail服务
    dedecms mysql连接错误:#1040
    自动获取访客QQ
    apache虚拟目录设置
    在XAMPP上建立多个域名的站点
    QQ互联不能使用的通用解决方法
    织梦系统与discuz论坛整合方法
    DEDECMS整站复制
    DEDECMS模板中dede标签使用php和if判断语句的方法
  • 原文地址:https://www.cnblogs.com/hei-hei-hei/p/7814032.html
Copyright © 2020-2023  润新知