zoukankan      html  css  js  c++  java
  • RSA密钥对的使用C++


    // RsaEncDec.cpp : This file contains the 'main' function. Program execution begins and ends there.
    //
    #include <openssl/rsa.h>
    #include <openssl/pem.h>
    //#include <unistd.h>
    #include <iostream>
    #include <io.h>
    
    #pragma comment(lib, "libssl.lib")
    #pragma comment(lib, "libcrypto.lib")
    #pragma comment(lib, "crypt32.lib")
    #pragma comment(lib, "ws2_32.lib")  
    
    
    const char *g_pPubFile = "public.pem";
    const char *g_pPriFile = "private.pem";
    
    //maxCodeByte = g_nBits/8-11
    const int g_nBits = 1024;
    
    using namespace std;
    
    int MakeKey()
    {
        /*if (access(g_pPubFile,0) != 0 || access(g_pPriFile,0) != 0)
        {
         return 0;
        }*/
        //生成key,这里设置了1024,意味着最多可以编解码1024/8-11=117个字节,
         //RSA_F4为公钥指数,一般情况下使用RSA_F4即可,
         //其它两个参数可以设置为NULL
        RSA *pRsa = RSA_generate_key(g_nBits, RSA_F4, NULL, NULL);
        if (pRsa == NULL)
        {
            cout << "rsa_generate_key error" << endl;
            return -1;
        }
        BIO *pBio = BIO_new_file(g_pPubFile, "wb");
    
        if (pBio == NULL)
        {
            cout << "BIO_new_file " << g_pPubFile << " error" << endl;
            return -2;
        }
        if (PEM_write_bio_RSAPublicKey(pBio, pRsa) == 0)
        {
            cout << "write public key error" << endl;
            return -3;
        }
        BIO_free_all(pBio);
    
    
        pBio = BIO_new_file(g_pPriFile, "w");
        if (pBio == NULL)
        {
            cout << "BIO_new_file " << g_pPriFile << " error" << endl;
            return -4;
        }
        if (PEM_write_bio_RSAPrivateKey(pBio, pRsa, NULL, NULL, 0, NULL, NULL) == 0)
        {
            cout << "write private key error" << endl;
            return -5;
        }
        BIO_free_all(pBio);
        RSA_free(pRsa);
        return 0;
    }
    
    
    int Enc(char *in, int inLen, char *out, int &outLen)
    {
        BIO *pBio = BIO_new_file(g_pPubFile, "r");
        RSA *pRsa = PEM_read_bio_RSAPublicKey(pBio, NULL, NULL, NULL);
        BIO_free_all(pBio);
        outLen = RSA_public_encrypt(
            (RSA_size(pRsa) - 11) > inLen ? inLen : RSA_size(pRsa) - 11,
            reinterpret_cast<unsigned char*>(in),
            reinterpret_cast<unsigned char*>(out),
            pRsa,
            RSA_PKCS1_PADDING);
        //RSA_free(pRsa);
        if (outLen >= 0)
            return 0;
        return -1;
    }
    
    
    int Dec(char *in, int inLen, char *out, int &outLen)
    {
        BIO *pBio = BIO_new_file(g_pPriFile, "r");
        RSA *pRsa = PEM_read_bio_RSAPrivateKey(pBio, NULL, NULL, NULL);
        BIO_free_all(pBio);
        outLen = RSA_private_decrypt(
            inLen,
            reinterpret_cast<unsigned char*>(in),
            reinterpret_cast<unsigned char*>(out),
            pRsa,
            RSA_PKCS1_PADDING);
        //RSA_free(pRsa);
        if (outLen >= 0)
            return 0;
        return -1;
    }
    #include <windows.h>
    int main()
    {
        MakeKey();
        char pOld[100] = "for test";
        char szEnc[1024] = { 0 };
        int nEncLen = 0;
        char szDec[1024] = { 0 };
        int nDecLen = 0;
        Enc(pOld, strlen(pOld), szEnc, nEncLen);
        cout << "decode: " << "len:" << nEncLen << endl;
    
        for (int i = 0; i < nEncLen; i++) {
            printf("%02X ", *((BYTE*)szEnc + i));
            if ((i + 1) % 32 == 0) {
                printf("
    ");
            }
        }
        printf("
    ");
        Dec(szEnc, nEncLen, szDec, nDecLen);
        cout << "decode: " << szDec << endl;
        cin.get();
    }


    今天来兴趣搞了一个RSA密钥对的使用,抄来的代码,顺手整理了一下,然后放在这上面。

    另外,在 Windows 平台 编译了一下 openssl, 编译下一下篇。

    PS:会笑的人,运气通常都会比别人好。
  • 相关阅读:
    视频解析小技巧
    linux系统路由设置
    tracert路由跟踪命令
    php+nginx
    docker快速拉取镜像
    linux命令
    添加docker命令
    linux模糊查询文件名
    查看日志
    模板函数与模板类
  • 原文地址:https://www.cnblogs.com/thinkinc999/p/12427128.html
Copyright © 2011-2022 走看看