C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解
之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台。 java平台会根据用户序列号,生成一个授权码,授权码是用rsa 私加公解的模式加密的,加密后为二进制,然后转为safeBase64格式。授权码拿来在C++的软件上授权,C++首先将safeBase64格式转为base64格式,再转为二进制,然后rsa解密出来得到明文。
现在回头整理那段时间的工作。小吐槽一下,想想碰到的坑,脑瓜疼。看了我碰到的坑,你们也能理清楚不少疑惑。
先说DES加解密。java告诉用des,自己没接触过,网上找了一段代码,调用openssl库实现的des加解密,ecb模式的,折腾一番,实现了加密解密。跟java一碰,发现完全对不上。java查看代码,发现库函数有cbc的字样,用的cbc模式。ok嘛,接着实现cbc模式。头疼的是找遍了百度和谷歌,都没有找到有实现cbc模式的C++代码。怎么办呢,我就对照着ecb的实现,和cbc模式加密的理论,自己做。幸运的是,做出来了。来实现cbc模式的加解密, 在调用openssl库的接口时,需要传入密匙和IV向量。网上的代码有的IV向量是随意的,有的是全零。然后我发现,IV向量的值并非随心所欲就能实现加密解密。然后我用了网上的一个数组值,自己可以加密解密了。然后我把密匙设置为跟java一致,结果却不美好,加密的结果跟java不相同,也不能把java的密文解密出来。然后呢,java调用的库函数,只需要提供一个密匙KEY,因此java也不清楚问题出在哪。跟java反复的讨论中,java同事廷谋哥说,把IV向量设置为密匙KEY试试,一试便成功了。需要注意的是java默认加密的填充方式为pkcs5padding,C++需要自己实现。
再说说RSA加解密。java告诉用rsa, 也是自己没接触过。网上找代码,copy了一份,公钥解密私钥解密, 随机生成密匙的代码。整理下来,可以加解密了。问题是如果明文过长,加解密的结果是不对了,表面看能加密,解密为空,实际上加密的结果是不完整的。好嘛,辛辛苦苦实现了,尽管不完美,但是能简单用,赶紧把随机生成秘钥的代码注释掉,换上java的秘钥。~~~呵呵呵,又不行了。一步步刨坑,rsa生成的秘钥有长度得区别,不同的长度能实现加密的明文是不同的。rsa加解密是分“公钥加密私钥解密”、“私钥加密公钥解密”的。并且,公加私解的密文是变动的,私加公解密文是固定的, rsa加解密是需要分片的。另外呢,java默认生成的密匙,公钥和私钥都是pkcs#8, 而C++调用openssl生成的密匙,公钥和私钥都是pkcs#1格式。脑瓜疼吧,再疼一下。java把生成的秘钥和加密后的密文是转为safaBase64格式的。这些在C++这边都是需要自己实现的。需要注意的是java默认加密的填充方式为pkcs1padding,openssl在这一点跟java是一致的。最后一个小关注点是所有采用UTF8编码。
==============================================================
进入正题
==============================================================
一、openssl库
I)库下载
百度下载OpenSSL-Win32软件,安装后,安装目录有 lib文件夹 include文件夹
II)库使用__我的环境是VS2010
项目属性中,按照 ../openssl/include/openssl;的路径配置; cpp文件中,按照#include "openssl/rsa.h"的方式调用
二、DES加密 cbc模式
三、RSA加密
附1:RSA密匙格式在线转换工具 DES/RSA加解密系列在线工具
附2:C++二进制字符串转十六进制字符串 C++十六进制字符串转二进制字符串
附3:C++二进制字符串转Base64字符串 C++Base64字符串转二进制字符串 C++base64格式和nonSafeBase64格式转换
未完待续...
C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解的更多相关文章
- 使用openssl库实现des,3des加密
原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
原文:AES加密CBC模式兼容互通四种编程语言平台[PHP.Javascript.Java.C#] 由于本人小菜,开始对AES加密并不了解,在网络上花了比较多时间查阅资料整理: 先简单从百度找来介绍: ...
- Des 加密cbc模式 padding
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using Syst ...
- 使用Crypto++库的CBC模式实现加密(二)
前面已经有一篇介绍使用Crypto++库实现的加密的文章了,但是代码中考虑的不完全,所以就重新发了个二 C++封装: #include "zyaes.h" #include < ...
- 使用Crypto++库的CBC模式实现加密
//***************************************************************************** //@File Name : scsae ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项
DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...
随机推荐
- [No000017B]改善C#程序的建议4:C#中标准Dispose模式的实现
需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...
- React组件的State
React组件的State 1.正确定义State React把组件看成一个状态机.通过与用户的交互,实现不同状态,然后渲染UI,让用户界面和数据保持一致.组件的任何UI改变,都可以从State的变化 ...
- ionic中数据进行操作后,需要直接显示改变后的数据,数据刷新
数据分页是通过使用下拉加载,查询sqlite本地数据的数据 <ion-refresher (ionRefresh)="doTest($event)"> <ion- ...
- AutoMapper介绍(未完待续、部分没实现)
实体间转换工具.其实也可以用Json来实现同名属性.异名属性(用JsonProperty指明)的自动转换 最新版本6.11 需要使用vs2013以上.vs2012下载新版 nuget会遇到问题.只能旧 ...
- Java 输入/输出——Java虚拟机读写其它进程的数据
使用 Runtime对象的exec()方法可以运行平台上的其它程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程.Process类提供了如下三个方法,用于让程序 ...
- [developmemt][dpdk] dpdk优化(转)
转发:https://software.intel.com/en-us/articles/dpdk-performance-optimization-guidelines-white-paper 转发 ...
- Flink – SlotSharingGroup
SlotSharingGroup 表示不同的task可以共享slot,但是这是soft的约束,即也可以不在一个slot 默认情况下,整个StreamGraph都会用一个默认的"defau ...
- java JDBC (六) org.apache.commons.dbutils 增删改
dbutils是apache封装了JDBC的工具类,比mysql-connector更方便些 下载地址:http://commons.apache.org/proper/commons-dbutils ...
- python全栈开发day10
day10知识点总结 while循环补充: continue,终止当前循环,开始下一次循环 break,终止所有循环 pycharm 技巧1.setting 中搜索 mouse 设置鼠标滚轮 改变字体 ...
- mysql 5.7.12 新增 X plugin x 协议 详解
mysql 5.7.12 新增 X plugin x 协议 详解http://xiaozhong991.blog.51cto.com/2354914/1763792 x 协议 操作nosql数据库 ...