前提:秘钥长度=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 私加公解

最新文章

  1. 帮初学者改代码——playerc之“练习:求完数问题”(下)
  2. JS(AS)中的原子操作
  3. 洛谷P2085 最小函数值(minval)
  4. Java并发编程:Java ConcurrentModificationException异常原因和解决方法
  5. Linux(Debian) vps安装gnome桌面+VNC
  6. BroadCastReceiver中耗时操作导致ANR
  7. Oracle中分页查询语句
  8. js私有化属性
  9. Struts2 一张图片引发的bug
  10. phpstudy本地搭建域名访问
  11. BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
  12. [C#]位运算符
  13. Angular 过滤器
  14. centos Install Docker
  15. BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心
  16. 简单Promise回顾
  17. http头之keep-alive
  18. ios的并发队列控制库
  19. jmeter分布式压力测试实践+登录为例
  20. RH318之域控服务器

热门文章

  1. Web开发——CSS基础
  2. [daily][qemu][libvirt] 使用libvirt管理qemu
  3. [qemu][cloud][centos][ovs][sdn] centos7安装高版本的qemu 以及 virtio/vhost/vhost-user咋回事
  4. 游戏引擎架构 && windows 核心编程
  5. Adobe Flex初记
  6. 【PyQt5-Qt Designer】QComboBox-下拉列表框
  7. Apache Spark支持三种分布式部署方式 standalone、spark on mesos和 spark on YARN区别
  8. Visual Studio使用Web Deploy远程发布网站及其配置
  9. Unity3D加密保护案例分享(一)
  10. 学习Shell(二)变量