欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

程序员文章站 2022-05-02 23:45:57
之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台。 java平台会根据用户序列号,生成一个授权码,授权码是用rsa 私加公解的模式加密的,加密后为二进制,然后转为safeBase64格式。授权码拿来在C++的软 ......

  之前工作上需要用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模式

       i)简单说明[原理][秘钥][iv向量][填充方式]

       ii)代码例子

 

三、rsa加密

  i)简单说明[秘钥]

  ii)生成秘钥对代码例子

  iii)公钥加密私钥解密代码例子

  iiii)私钥加密公钥解密代码例子

 

附1: rsa密匙格式在线转换工具         des/rsa加解密系列在线工具

附2:c++二进制字符串转十六进制字符串  c++十六进制字符串转二进制字符串

附3:c++二进制字符串转base64字符串    c++base64字符串转二进制字符串        c++base64格式和nonsafebase64格式转换

 

 

未完待续...