本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找。

背景:公司的一个需求,要求对接客户的一个平台,通信方式为MQTT,数据包含Token及json内容,在通信过程中发送的MQTT信息必须带上Token,这个Token是要从客户平台获取,通过http协议,POST方法。

然后POST方法的body信息需要进行RSA加密(提供了公钥和私钥,公钥加密私钥解密),然后再Base64加密。Base64公司代码里已经有了,但RSA加密却没有,只能自己网上搜索。在使用RSA加密过程中遇到了以下几个问题:

1,用RSA加密时,如果密文长度是1024位(128字节)的话,其要加密的明文只能是117字节长度。我的POST方法数据不止117字节,无法满足我目前的需求。

2,Base64编码问题

3,公钥及私钥是客户提供的,但不是标准格式。

关于问题1、问题2:

找了很多网上的例子,实现的都是简单的几个字符的加密及解密,那些长串字符加密的直接拿过来又无法通过编译。最后找到一些拿过来修修改改,终于可以用,记录如下:

/**
** @brief 用公钥进行加密,明文长于117字节时需要进行分段处理
*/
std::string CRSAEnCrypt::rsaPublicKeyEncryptSplit(const std::string &clearText)
{std::string result;std::string input;result.clear();for(int i = 0 ; i< clearText.length() / SPLIT_LEN; i++){  input.clear();input.assign(clearText.begin() + i * SPLIT_LEN, clearText.begin() + i * SPLIT_LEN + SPLIT_LEN);result = result + rsaPublicKeyEncrypt(input);}if(clearText.length() % SPLIT_LEN != 0){int32_t tmp = clearText.length() / SPLIT_LEN * SPLIT_LEN;input.clear();input.assign(clearText.begin() + tmp, clearText.end());result = result + rsaPublicKeyEncrypt(input);}printf("before base64 len: %lu\n", result.length());std::string encode_str = base64Encode((uint8_t*)result.c_str(), result.length());printf("after base64 len: %lu\n", encode_str.length());return encode_str;
}

网上有些说,分段RSA加密后即进行Base64编码,但我这里是RSA加密完成后再整体进行Base64编码,在进行RSA解码时先Base64解码。

/**
** @brief 用私钥进行解密,分段处理
*/
std::string CRSAEnCrypt::rsaPrivateKeyDecryptSplit(const std::string &Text)
{printf("before base64Decode len: %lu\n", Text.length());std::string clearText = base64Decode(Text);printf("after base64Decode len: %lu\n", clearText.length());//printf("BaseDecode len: %lu\n", clearText.length());std::string result;std::string input;result.clear();for(int i = 0 ; i< clearText.length() / 128; i++){input.clear();input.assign(clearText.begin() + i * 128, clearText.begin() + i * 128 + 128);result = result + rsaPrivateKeyDecrypt(input);}if(clearText.length() % 128 != 0){int tem1 = clearText.length()/128 * 128;input.clear();input.assign(clearText.begin()+ tem1, clearText.end());result = result + rsaPrivateKeyDecrypt(input);}return result;
}

使用例子:


int main()
{Json::Value postMsg;postMsg["userName"] = "zgdxgzt";postMsg["password"] = "xcq123456";postMsg["tenantId"] = "5fca019cb091f5b7e44c0eec";postMsg["client_id"] = "5cf600563f4c000053007383";postMsg["client_secret"] = "U2FsdGVkX1+oesjvWS3Z8q7ziFCu+p4tU7OQjl+5m21l7XMbBBJtof4fAL1S8/tJNrGpqIAqtTwXOeiZJFFtHw==";postMsg["scope"] = "read";  //固定值postMsg["grant_type"] = "password"; //固定值CRSAEnCrypt::getInstance()->initkey(privateKey, publicKey);std::string sourceStr = jsonToString(postMsg);printf("string of json: %s\n", sourceStr.c_str());//单独测试base64加密、解密// std::string encodeStr = base64Encode((uint8_t *)sourceStr.c_str(), sourceStr.length());// printf("decodeStr len: %lu\n", encodeStr.length());// std::string decodeStr = base64Decode(encodeStr);// printf("decodeStr len: %lu, %s\n", decodeStr.length(), decodeStr.c_str());//公钥加密std::string rsaEncryptStr = CRSAEnCrypt::getInstance()->rsaPublicKeyEncryptSplit(sourceStr);printf("after rsaEncryptStr len: %lu\n", rsaEncryptStr.length());//私钥解密std::string rsaDecryptStr = CRSAEnCrypt::getInstance()->rsaPrivateKeyDecryptSplit(rsaEncryptStr);printf("after rsaDecryptStr: %lu, %s\n", rsaDecryptStr.length(), rsaDecryptStr.c_str());return 0;
}

运行结果如:

关于第3个问题,公钥和私钥有固定格式,要注意,因客户只提供两个字符串,里面并没有包含固定的头和尾字符,这样可能会导致RSA 读取密钥时出错。正确格式如下:

不同的头尾标识,调用的openssl的库函数可能不同,可自行baidu。

最后一点网上一些例子只贴出部分代码,很多时候下载后根本不能直接用,这不是要流氓吗。。。。

源码下载:

git clone git@github.com:tianyexing2008/c_cpp.git

下载后cd encrypt 目录下make 即可。因代码中用到的json,如果你电脑上已经有json库,可能可以直接编译过,如果没有,这个git里也有json源码,目录json,可cd json后进行make编译libjson.a库,再修改encrypt里的Makefile里指定的头文件目录

及json库目录即可。

RSA 加密解密使用实例(c++实现)相关推荐

  1. php java openssl ras_php基于openssl的rsa加密解密示例

    本文实例讲述了php基于openssl的rsa加密解密.分享给大家供大家参考,具体如下: $config = array( //"config" =>"D:/php ...

  2. Android RSA加密解密的 工具类的使用

    RSA 比较特殊,我们首先要生成私钥和公钥,然后在加密的时候,使用私钥加密,在解密的时候使用公钥解密. //RSA 的初始化,获得私钥和密钥public void rsaInit(){try {Key ...

  3. python加密解密 sha256_Python下实现的RSA加密/解密及签名/验证功能示例

    本文实例讲述了Python下实现的RSA加密/解密及签名/验证功能.分享给大家供大家参考,具体如下: 原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() ...

  4. java rsa 解密_Java中RSA加密解密的实现方法分析

    本文实例讲述了Java中RSA加密解密的实现方法.分享给大家供大家参考,具体如下: public static void main(String[] args) throws Exception { ...

  5. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  6. ios php rsa加密解密,php rsa加密解密使用详解

    第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem 从上面看出通 ...

  7. genrsa out php,PHP进行RSA加密解密

    最近在着手写一个服务端安全接口规范,需要用到RSA加密解密.所以小试牛刀一下,并且做个记录. 环境: Win7 64位 PHP 5.6.12 需要原型工具: 一.安装OpenSSL 随意安装到哪里 二 ...

  8. C# Java间进行RSA加密解密交互

    C# Java间进行RSA加密解密交互 原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益, ...

  9. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

最新文章

  1. myeclipse-pro-2014-GA-offline-installer-windows 安装步骤 与安装效果预览
  2. SendKeys中特殊字符的键代码
  3. 嵌入式研究杂记(1)-RISC-V开源CPU
  4. vue 子组件 调用、触发父组件中的方法
  5. hive开启kerberos-beeline连接
  6. 关于code footprint-reduction-techniques
  7. android课程表设计报告,制作课程表教案设计
  8. matlab面向对象多态性,MATLAB面向对象程序设计10版.pptx
  9. Unity文件操作路径
  10. 关于ListCtrol自绘的技巧
  11. 【券后价16.80元】【海蓝蓝】夹心海苔脆芝麻海苔即食罐装海苔宝宝辅食儿童零食40克...
  12. 433M、2.4G无线模块
  13. 魑、魅、魍、魉、妖、精、鬼、怪的区别
  14. php imp,Imp_在线英语听力室
  15. UPC-5572 - Lifeguards - 动态规划
  16. windows环境下用python PyFtdi控制ftdi芯片生成方波信号
  17. 代谢组学——最接近生物表型的组学
  18. 【Todo】【读书笔记】机器学习实战(Python版)
  19. 随机森林模型进行递归特征消除的python实现
  20. 【日本动漫新番尝鲜】机动战士高达OO 第二季

热门文章

  1. 美团2021笔试题(第十场)-公司食堂
  2. CPU后面字母究竟是啥?
  3. 无法打开到主机的连接。 在端口 23: 连接失败
  4. 09. 路由器单臂路由配置
  5. 《大型网站技术架构》——第一章 大型网站架构演化
  6. html合并单元格怎么把字竖着,电脑excel单元格中文字如何在合并单元格后竖排显示...
  7. 如何在 GitLab CI 管道中构建 Docker 映像
  8. 当前主流的python 微服务框架有哪些
  9. Heap的讲解 - 介绍
  10. boot.scr生成