// 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, 编译下一下篇。