RSA加解密 公钥加密私钥解密 公加私解 && C++ 调用openssl库 的代码实例
2024-10-17 22:04:10
前提:秘钥长度=1024
==============================================
对一片(117字节)明文加密
==============================================
// 公钥加密
std::string rsa_pub_encrypt(const std::string &clearText, std::string &pubKey)
{
std::string strRet;
BIO *keybio = BIO_new_mem_buf((unsigned char *)pubKey.c_str(), -);
//keybio = BIO_new_mem_buf((unsigned char *)strPublicKey.c_str(), -1);
// 此处有三种方法
// 1, 读取内存里生成的密钥对,再从内存生成rsa
// 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
// 3,直接从读取文件指针生成rsa
//RSA* pRSAPublicKey = RSA_new();
RSA* rsa = RSA_new();
rsa = PEM_read_bio_RSAPublicKey(keybio, &rsa, NULL, NULL);
if (!rsa)
{
BIO_free_all(keybio);
return std::string("");
} int len = RSA_size(rsa);
//int len = 1028;
char *encryptedText = (char *)malloc(len + );
memset(encryptedText, , len + ); // 加密函数
int ret = RSA_public_encrypt(clearText.length(), (const unsigned char*)clearText.c_str(), (unsigned char*)encryptedText, rsa, RSA_PKCS1_PADDING);
if (ret >= )
strRet = std::string(encryptedText, ret); // 释放内存
free(encryptedText);
BIO_free_all(keybio);
RSA_free(rsa); return strRet;
}
==============================================
对一片(128字节)密文解密
==============================================
// 私钥解密
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, 读取内存里生成的密钥对,再从内存生成rsa
// 2, 读取磁盘里生成的密钥对文本文件,在从内存生成rsa
// 3,直接从读取文件指针生成rsa
rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL); int len = RSA_size(rsa);
char *decryptedText = (char *)malloc(len + );
memset(decryptedText, , len + ); // 解密函数
int ret = RSA_private_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;
}
注:工作中只用到了 rsa私加公解,因此没有 针对全部明文的公加私解的代码实现,请参考附录。
附:rsa 私加公解
最新文章
- 帮初学者改代码——playerc之“练习:求完数问题”(下)
- JS(AS)中的原子操作
- 洛谷P2085 最小函数值(minval)
- Java并发编程:Java ConcurrentModificationException异常原因和解决方法
- Linux(Debian) vps安装gnome桌面+VNC
- BroadCastReceiver中耗时操作导致ANR
- Oracle中分页查询语句
- js私有化属性
- Struts2 一张图片引发的bug
- phpstudy本地搭建域名访问
- BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
- [C#]位运算符
- Angular 过滤器
- centos Install Docker
- BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心
- 简单Promise回顾
- http头之keep-alive
- ios的并发队列控制库
- jmeter分布式压力测试实践+登录为例
- RH318之域控服务器
热门文章
- Web开发——CSS基础
- [daily][qemu][libvirt] 使用libvirt管理qemu
- [qemu][cloud][centos][ovs][sdn] centos7安装高版本的qemu 以及 virtio/vhost/vhost-user咋回事
- 游戏引擎架构 && windows 核心编程
- Adobe Flex初记
- 【PyQt5-Qt Designer】QComboBox-下拉列表框
- Apache Spark支持三种分布式部署方式 standalone、spark on mesos和 spark on YARN区别
- Visual Studio使用Web Deploy远程发布网站及其配置
- Unity3D加密保护案例分享(一)
- 学习Shell(二)变量