C++利用openssl进行公钥解密
私钥加密的部分内容,需要用公钥解密下面的实例代码,由于私钥加密后的字符串有不可打印字符,所以程序里面进行了base64,要用的时候先解dec base64
再传递给函数 进行解密
#include <stdio.h>
#include <stdlib.h>
#ifdef WIN32
#include <windows.h>
#endif
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "Base64.h"
#ifdef WIN32
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Gdi32.lib")
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"ssleay32.lib")
#endif
// 私钥解密
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;
}
// 公钥解密
std::string rsa_pub_decrypt(const std::string &cipherText, const std::string &pubKey)
{
std::string strRet;
RSA *rsa = RSA_new();
BIO *keybio= BIO_new_mem_buf((unsigned char *)pubKey.c_str(), -);
rsa=PEM_read_bio_RSA_PUBKEY(keybio,&rsa,NULL,NULL); int len = RSA_size(rsa);
char *decryptedText = (char *)malloc(len + );
memset(decryptedText, , len + ); // 解密函数
int ret = RSA_public_decrypt(cipherText.length(), (const unsigned char*)cipherText.c_str(), (unsigned char*)decryptedText, rsa, RSA_PKCS1_PADDING);
if (ret >= )
strRet = std::string(decryptedText, ret); // 释放内存
free(decryptedText);
BIO_free_all(keybio);
RSA_free(rsa); return strRet;
} int main(int narg,char** args)
{
string pubKey="\
-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAptoreKuW1O+Bb1u+O0LQ\n\
NAiaj5i0gbqi5uHCfcTxPIScoeidR/FaPFWpG3mHUCd7SfPKlSQ4H4FGwqkPrAJ8\n\
tb6vfNAY7UPlStaWwCASBBBeHRIFySDIFQnIeXTcZqKgvCAkM3kudyKGMGfZyU6v\n\
SUCMUJbvtIKrSBpPFOaPF1EjfsTpcRjRwNUxjInvxyOmegdLSgg/NNV9AxUSpGX4\n\
Fs5j3W4u4bfgoH6WiI7QLeVWpw+ZcynndtihPa2Y5rKgTDq1IYnniaYy+bTlWMPC\n\
us9AjL0qaM0oXKzUByIeA8cWQR99ewSLsEaa7mhpUZ1jg+fDQEqYfgvenfcOe5bn\n\
NQIDAQAB\n\
-----END PUBLIC KEY-----\n";
string encStr="TgaNSiG6yPkKql3pIW9310IsRpcppl4SIt12kdP3ZwR0wWj65P3I3YCaSrb7+lmJ9N\
mpTmHHzwgvTQN3zM+IRpjQr1iAJZ0C/+2uM0WkPwbZhvlzcr4iZFOfhe6CbPGibu1\
+pRYdkkxgvXT3/0D4hrtzOxMXVYzBLjfd7xXRfVTXGI7FlBGfq6/W+bg3DE3BQbdS\
07eBBRKQ1Jbl/LPIQP40FK5qdvTDeWTG0m/mLRfpavbIw4pMKnc7845xU9ZZVmxcv\
14O7AJYmJat72mGzDVpafx+65aanLMIydSY+dly62XeSRd5ghd1fSaTHlVN4h59YY\
qNPXGxFKTrMvPUDg==";
Base64 base;
string encStr2=base.Decode(encStr.c_str(),encStr.length());
string decStr=rsa_pub_decrypt(encStr2,pubKey);
printf("---%s---\n",decStr.c_str());
system("pause");
return ;
}
下面的私钥和公钥 以及加密字符串
秘钥位数2048 秘钥格式PKCD# -----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAptoreKuW1O+Bb1u+O0LQ
NAiaj5i0gbqi5uHCfcTxPIScoeidR/FaPFWpG3mHUCd7SfPKlSQ4H4FGwqkPrAJ8
tb6vfNAY7UPlStaWwCASBBBeHRIFySDIFQnIeXTcZqKgvCAkM3kudyKGMGfZyU6v
SUCMUJbvtIKrSBpPFOaPF1EjfsTpcRjRwNUxjInvxyOmegdLSgg/NNV9AxUSpGX4
Fs5j3W4u4bfgoH6WiI7QLeVWpw+ZcynndtihPa2Y5rKgTDq1IYnniaYy+bTlWMPC
us9AjL0qaM0oXKzUByIeA8cWQR99ewSLsEaa7mhpUZ1jg+fDQEqYfgvenfcOe5bn
NQIDAQAB
-----END PUBLIC KEY----- -----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCm2it4q5bU74Fv
W747QtA0CJqPmLSBuqLm4cJ9xPE8hJyh6J1H8Vo8VakbeYdQJ3tJ88qVJDgfgUbC
qQ+sAny1vq980BjtQ+VK1pbAIBIEEF4dEgXJIMgVCch5dNxmoqC8ICQzeS53IoYw
Z9nJTq9JQIxQlu+0gqtIGk8U5o8XUSN+xOlxGNHA1TGMie/HI6Z6B0tKCD801X0D
FRKkZfgWzmPdbi7ht+CgfpaIjtAt5VanD5lzKed22KE9rZjmsqBMOrUhieeJpjL5
tOVYw8K6z0CMvSpozShcrNQHIh4DxxZBH317BIuwRpruaGlRnWOD58NASph+C96d
9w57luc1AgMBAAECggEAQu9U7yTO7n9iinzgdL+Z7LXi42ZcS4rG3R6GOpQuPpvo
hh9eMUVGcNvgalA3k1UzZXhytaABD8p5y4+s5NFenD5yAf0tcsmBC6PIeCylbZHv
X3QidAw9mAsDrI3P+TCWkMHIJAoiNNLZyENxIAv7z8QgRhg281BUTCmZvgW8M5rI
S8/8MqLi1DPFIJ/AbOLS9MXHinsNKk0sn5KN01I4hwfM0b+E95+heWZV8xxrWoNP
ssMf9XFnddjPvHIkHG9zNdjvmbgyuj4puzB3tBKtd8pZlzQj4A7uSOWRVkr9/kFZ
CLMG7W6B3XCtnutAF16pGQxwgqjkLH73RSqTvJVdZQKBgQDXv8qeDRROPRxmU6u+
Zz+wK32iyocd+eBwhuc/TnEOBqlzF/HySVSqPIEzIXs48qmMSYGI8Ab/Qy1hB4Hl
DZqglx4aQ3K31QCIzzINulDxj/msYNRp+hFV2UCrZN/ScNYymdj+kdIt8brM1RRl
hZjVcWwH1Iv8MZ12ALaEclkjtwKBgQDF+w2m4oWsPApq1vs4Cc+61gh2W9xP6Cij
FShyXU7Ms/qQ2F9C+0DC6ssGNC0+YV4aK6xSE6vhexGpJYf08fT/RrDW3JLTGdFC
HvX8QTEf9LoCV5y7mdoNirKV3eVcYMCUkVFEyQfXUDz2bKt+VU36ep395UUzCTRZ
IYD9kOsEcwKBgENZIXzZBF+v/++JavFS9bSevudUZX1cBU3bLtC6QdxpA/hjnylM
7tr9bC9z4i1Sws6CG6eNlgGVDNNfLpM7/erngYQdTfBI05PhafSTFrVxhjTjPSuf
3k14NhHKuXvNsW+2SuCc0Il7Dh7m3Skb3Suz7k87cD9XlZnCezc5Is5dAoGAAVde
FE9ckHonp+mk8hA+9AkXLZYZvADapaAzEfNH4WMmw2xz2MRS//8POQ+Jbu7B8HNz
S2sOswxeZkL21NX+zuvvrsT3ya5XGJeVGwxmBM1npTRqv2qfa5AQ/arvLt0I8Pi7
EDg8cVz9zL2Xu9dgG95Qy7ON8HaTgDcV5KHitbkCgYEA1a/mgASIJRP38FUcl1OB
CebYFOMicyjw0LbxfGZSThpHnSxPCI93iw6XbOrwrcsDe67GPbkT/mknNKGWXiof
goLgLkVS5TXSxVO786YqNwWE2pB8+phhcFtb1wYyTnMXIo8a+KsZ0tWTO4pvlIsz
/4e1njkFYpOoRHjczHhA1Ag=
-----END PRIVATE KEY----- 加密前字符串
73a90acaae2b1ccc0e969709665bc62f
加密后字符串
TgaNSiG6yPkKql3pIW9310IsRpcppl4SIt12kdP3ZwR0wWj65P3I3YCaSrb7+lmJ9NmpTmHHzwgvTQN3zM+IRpjQr1iAJZ0C/+2uM0WkPwbZhvlzcr4iZFOfhe6CbPGibu1+pRYdkkxgvXT3/0D4hrtzOxMXVYzBLjfd7xXRfVTXGI7FlBGfq6/W+bg3DE3BQbdS07eBBRKQ1Jbl/LPIQP40FK5qdvTDeWTG0m/mLRfpavbIw4pMKnc7845xU9ZZVmxcv14O7AJYmJat72mGzDVpafx+65aanLMIydSY+dly62XeSRd5ghd1fSaTHlVN4h59YYqNPXGxFKTrMvPUDg==
C++利用openssl进行公钥解密的更多相关文章
- 利用openssl进行RSA加密解密
openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是 ...
- .net core中使用openssl的公钥私钥进行加解密
这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...
- 利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例
前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密 私加 ===================== ...
- linux以下C 利用openssl的AES库加密,解密
OpenSSL提供了AES加解密算法的API const char *AES_options(void); AES算法状态,是所有支持或者是部分支持. 返回值:"aes(full)" ...
- Java中使用OpenSSL生成公钥私钥进行数据加解密
当前使用的是Linux系统,已经安装OpenSSL软件包. 一.使用OpenSSL来生成私钥和公钥1.执行命令openssl version -a 验证机器上已经安装openssl $ openssl ...
- openssl rsa 加解密
<h4>1.openssl进行rsa加密解密</h4>首先介绍下命令台下openssl工具的简单使用:生成一个密钥:<pre lang="c" esc ...
- linux下利用openssl来实现证书的颁发(详细步骤)--转载和修改
原文地址:http://www.cnblogs.com/firtree/p/4028354.html linux下利用openssl来实现证书的颁发(详细步骤) 1.首先需要安装openssl,一个开 ...
- NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密
using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...
随机推荐
- lumen路由配置nginx
nginx配置文件中添加: set $root_path '/data/www/m.domain.com/public'; root $root_path; location / { ...
- Vue动画操作
概述 Vue 在插入.更新或者移除 DOM 时,提供多种不同方式的应用过渡效果.包括以下工具: 在 CSS 过渡和动画中自动应用 class 可以配合使用第三方 CSS 动画库,如 Animate.c ...
- 解决mysql登录警告问题
一.前言 我们在登录mysql的时候经常会看到一句警告: Warning: Using a password on the command line interface can be insecure ...
- Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息
先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest; import android.app.Activity; import and ...
- mysql安装和遇到的问题处理
遇到需要在新系统上安装MySQL的事情,简单记录一下过程. 声明:最好的文档是官方文档,我也是看的官方文档,只是中间遇到点问题,记录一下出现的问题和处理方式.贴一些官方文档地址. 用tar包的安装方式 ...
- kubernetes集群初始化(二)
参考地址:https://github.com/unixhot/salt-kubernetes 一.系统初始化 1.1.安装docker 所有节点都安装docker,设置docker国内yum源 [r ...
- Redis未授权访问漏洞复现及修复方案
首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...
- 0022SpringMVC解决post请求中文乱码的问题
我们在页面难免提交一些中文数据给后台处理,但是发现后台拿到的数据乱码,可以在每一个controller中都设置编码,但是太过于麻烦, 正确的解决办法应该是在web.xml中配置解决中文乱码的过滤器: ...
- Nginx反爬虫: 禁止某些User Agent抓取网站
问题 之前客户能够正常访问的一个网站这几天访问很慢,甚至有时候还拒绝访问.通过Nginx访问日志排查,发现有大量的请求指向同一个页面,而且访问的客户端IP地址在不断变化且没有太多规律,很难通过限制IP ...
- SQlAlchemy的增删改查
一.创建数据表 # ORM中的数据表是什么呢? # Object Relation Mapping # Object - Table 通过 Object 去操纵数据表 # 从而引出了我们的第一步创建数 ...