利用OpenSSL 实现明文加解密

来源:互联网 发布:淘宝微店官网 编辑:程序博客网 时间:2024/05/22 06:44

RSA

1.密钥生成

void generateKey() {    /* 生成公钥 */    RSA* rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);    BIO *bp = BIO_new(BIO_s_file());    BIO_write_filename(bp, "public.pem");    PEM_write_bio_RSAPublicKey(bp, rsa);    BIO_free_all(bp);    /* 生成私钥 */    bp = BIO_new_file("private.pem", "w+");    PEM_write_bio_RSAPrivateKey(bp, rsa, NULL, NULL, 4, NULL, NULL);    BIO_free_all(bp);    RSA_free(rsa);}

2.公钥加密

string bio_read_publicKey(string data) {    OpenSSL_add_all_algorithms();    BIO* bp = BIO_new(BIO_s_file());    BIO_read_filename(bp, "public.pem");    RSA* rsaK = PEM_read_bio_RSAPublicKey(bp, NULL, NULL, NULL);    if (NULL == rsaK) {        perror("read key file fail!");    }    else {        printf("read success!");        int nLen = RSA_size(rsaK);        printf("len:%d\n", nLen);    }    int nLen = RSA_size(rsaK);    char *pEncode = new char[nLen + 1];    int ret = RSA_public_encrypt(data.length(), (const unsigned char*)data.c_str(),        (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING);    std::string strRet;    if (ret >= 0) {        strRet = std::string(pEncode, ret);      }    delete[] pEncode;    CRYPTO_cleanup_all_ex_data();    BIO_free_all(bp);    RSA_free(rsaK);    return strRet;}

3.私钥解密

string bio_read_privateKey(string data) {    OpenSSL_add_all_algorithms();    BIO* bp = BIO_new(BIO_s_file());    BIO_read_filename(bp, "private.pem");    RSA* rsaK = PEM_read_bio_RSAPrivateKey(bp, NULL, NULL, NULL);    if (NULL == rsaK) {        perror("read key file fail!");    }    else {        printf("read success!\n");    }    int nLen = RSA_size(rsaK);     char *pEncode = new char[nLen + 1];    int ret = RSA_private_decrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING);    string strRet;    if (ret >= 0) {        strRet = string(pEncode, ret);      }    delete[] pEncode;    CRYPTO_cleanup_all_ex_data();    BIO_free_all(bp);    RSA_free(rsaK);    return strRet;}

4.密文转为十进制实现

int len = strlen((const char*)pEncode);BIGNUM *a = BN_new();BN_bin2bn((const unsigned char *)pEncode, len,  a);b = BN_bn2dec((const BIGNUM *)a);这里的b就是十进制字符串

#5.完整代码

#include "stdafx.h"#include <stdio.h>  #include <stdlib.h>  #include <windows.h>#include <openssl/rsa.h>  #include<openssl/pem.h>  #include<openssl/err.h>  #include <openssl/bio.h>  #include <fstream>  #include <iostream>  #include <string>  using namespace std;#pragma comment(lib, "libeay32.lib")  #pragma comment(lib, "ssleay32.lib")  char *b;void generateKey() {    /* 生成公钥 */    RSA* rsa = RSA_generate_key(1024, RSA_F4, NULL, NULL);    BIO *bp = BIO_new(BIO_s_file());    BIO_write_filename(bp, "public.pem");    PEM_write_bio_RSAPublicKey(bp, rsa);    BIO_free_all(bp);    /* 生成私钥 */    bp = BIO_new_file("private.pem", "w+");    PEM_write_bio_RSAPrivateKey(bp, rsa, NULL, NULL, 4, NULL, NULL);    BIO_free_all(bp);    RSA_free(rsa);}string bio_read_privateKey(string data) {    OpenSSL_add_all_algorithms();    BIO* bp = BIO_new(BIO_s_file());    BIO_read_filename(bp, "prikey.pem");    RSA* rsaK = PEM_read_bio_RSAPrivateKey(bp, NULL, NULL, NULL);    if (NULL == rsaK) {        perror("read key file fail!");    }    else {        printf("read success!\n");    }    int nLen = RSA_size(rsaK);     char *pEncode = new char[nLen + 1];    int ret = RSA_private_decrypt(data.length(), (const unsigned char*)data.c_str(), (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING);    string strRet;    if (ret >= 0) {        strRet = string(pEncode, ret);      }    delete[] pEncode;    CRYPTO_cleanup_all_ex_data();    BIO_free_all(bp);    RSA_free(rsaK);    return strRet;}string bio_read_publicKey(string data) {    OpenSSL_add_all_algorithms();    BIO* bp = BIO_new(BIO_s_file());    BIO_read_filename(bp, "pubkey.pem");    RSA* rsaK = PEM_read_bio_RSAPublicKey(bp, NULL, NULL, NULL);    if (NULL == rsaK) {        perror("read key file fail!");    }    else {        printf("read success!");        int nLen = RSA_size(rsaK);        printf("len:%d\n", nLen);    }    int nLen = RSA_size(rsaK);    char *pEncode = new char[nLen + 1];    int ret = RSA_public_encrypt(data.length(), (const unsigned char*)data.c_str(),        (unsigned char *)pEncode, rsaK, RSA_PKCS1_PADDING);    std::string strRet;    if (ret >= 0) {        strRet = std::string(pEncode, ret);      }    int len = strlen((const char*)pEncode);    BIGNUM *a = BN_new();    BN_bin2bn((const unsigned char *)pEncode, len,  a);    b = BN_bn2dec((const BIGNUM *)a);    delete[] pEncode;    CRYPTO_cleanup_all_ex_data();    BIO_free_all(bp);    RSA_free(rsaK);    return strRet;}int main() {//  generateKey();    char *str = "我爱密码";    printf("原文:%s\n", str);    string m = bio_read_publicKey(str);    printf("密文:\n------------%s--------------\n\n", m.c_str());    printf("十进制:\n-----------%s------------\n\n", b);    unsigned char *p =(unsigned char *) m.c_str();    int j = 0;    while (*(p+j) != NULL) { printf("%x", *(p + j)); j++; }    cout << endl;    string miwen = m;    string c = bio_read_privateKey(miwen);    printf("解密后:\n------------%s--------------\n\n", c.c_str());    system("pause");    return 0;}

AES

#include "stdafx.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <openssl/aes.h>#include <iostream>#define AES_BITS 128#define MSG_LEN 100000#pragma comment(lib, "libeay32.lib")#pragma comment(lib, "ssleay32.lib")  #pragma comment(lib, "ws2_32.lib")#define IP "127.0.0.1"#define PORT 8888using namespace std;int main(int argc, char *argv[]){    int len;    char key[AES_BLOCK_SIZE];    memcpy(key, "123412341234123", 16);    cout << key[0];    system("pause");    unsigned char  iv[AES_BLOCK_SIZE];    FILE *fp,*fp1;    fp = fopen("1.txt", "rb");    fp1 = fopen("2.txt","ab");    fseek(fp, 0L, SEEK_END);    len = ftell(fp);    fseek(fp, 0L, SEEK_SET);    char sourceStringTemp[MSG_LEN];    char dstStringTemp[MSG_LEN];    memset((char*)sourceStringTemp, 0, MSG_LEN);    memset((char*)dstStringTemp, 0, MSG_LEN);    fread(sourceStringTemp, 1, len, fp);    int i;    AES_KEY aes;    if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0)    {        return 0;    }    AES_cbc_encrypt((unsigned char*)sourceStringTemp, (unsigned char*)dstStringTemp, len, &aes, iv, AES_ENCRYPT);    /***************下面为解密*************/    printf("enc %d:", strlen((char*)dstStringTemp));    for (i = 0; dstStringTemp[i]; i += 1) {        printf("%x", (unsigned char)dstStringTemp[i]);    }    memset((char*)sourceStringTemp, 0, MSG_LEN);    if (AES_set_decrypt_key((unsigned char*)key, 128, &aes) < 0)    {        return 0;    }    AES_cbc_encrypt((unsigned char*)dstStringTemp, (unsigned char*)sourceStringTemp, len, &aes, iv, AES_DECRYPT);    fwrite(sourceStringTemp, 1, len, fp1);    printf("\n");    printf("dec %d:", strlen((char*)sourceStringTemp));    printf("%s\n", sourceStringTemp);    for (i = 0; sourceStringTemp[i]; i += 1) {        printf("%x", ( char)sourceStringTemp[i]);    }    printf("\n");    system("pause");    fclose(fp);    fclose(fp1);    return 0;}
0 0
原创粉丝点击