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("\n");
        }
    }
    printf("\n");
    Dec(szEnc, nEncLen, szDec, nDecLen);
    cout << "decode: " << szDec << endl;
    cin.get();
}


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

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

posted on 2020-03-06 16:08  thinkinc999  阅读(984)  评论(0编辑  收藏  举报

导航