很多时候我只是优秀工具的使用者,优秀的工具用好了才能发挥作用

最近使用cryptopp的base64对压缩后的zip文件内容进行加密遇到了问题。

首先zip压缩没问题,可是最后得到的base64字符串不对:

1、长度不对(问题应该是源字符串的问题)

2、使用现成的工具解密得不到zip文件内容(问题没有头绪)

3、计算得出的MD5无效

既然没法从问题的表现来推理解决,那就从正常逻辑往后判断问题的根源点

1、先检查zip的读取,利用fread读出后再fwrite写入,以确定fread的内容是有效的

此过程中发现fwrite写入的zip文件异常,对比文件的十六进制数据后发现在每一个0x0A前面都多了一个0x0D,对比ascii码就知道是换行符的问题;

但fread不会有问题,一个意外收获,至此确定fread读出的内容没问题。

2、检查base64的输出内容,首先来看base64的调用代码:

string getBase64(const byte* src, const int len)
{
Base64Encoder encoder;
encoder.Put(src, len);
encoder.MessageEnd();
lword size = encoder.MaxRetrievable(); byte* encodestr = new byte[size + ];
encodestr[size] = '\0'; encoder.Get(encodestr, size); ostringstream osstr;
osstr << encodestr; delete []encodestr; return osstr.str();
}

上面代码能正常输出base64的加密结果,可是对这个结果进行md5得到的校验码无效。

3、md5经过上篇文章的使用已经确定是正确的,那就是base64的输出(md5的输入)有异常。

可能有人在步骤2中就感觉到了问题,也就是0XOD 0X0A。有跨平台开发经验的朋友会想到这个换行符会出问题。

4、base64编码后的数据依旧出现了0x0A(\n),把base64的输出字符串使用现成的工具进行md5,然后对比自己md5代码出来的结果发现异常。

5、此时应该反应到\n上,如果字符串需要输出\n就需要这样表示"\\n",也就是转义字符,至此问题找到。2次md5的输入不一样自然不一样,那么在代码里面的字符串使用"\\n"测试,md5结果就能对上了.

6、问题找到了就要找解决办法了,最直接的办法,对base64的输出进行替换,"\n"替换成"\\n",到此似乎问题就解决了,可是这样的办法总是不尽人意。

7、为什么在base64加密后会产生0x0A了,首先想到是输入的引入,可是对比0x0A的数量后断定不是输入引入,此时把base64的输入放入记事本会发现0x0A的位置相当固定,莫非是base64增加的?

8、因为是第一次使用base64,经验自然就没用,那就度娘,google同时来,直接搜索“base64 转义字符”。

9、搜索结果表明:base64加密默认会在固定长度位置加入换行符(0x0A)。那剩下就是看看cryptopp的base64如何更改这个默认设置,让其不加入换行符了,看了cryptopp的base64.h文件后修改代码如下即可。

Base64Encoder encoder(nullptr, false);

10、至此问题解决,base64的加密使用也算初步了解。深入原理研究待以后需要再进行,毕竟项目时间不允许。

cryptopp开源库的使用(二):base64加密的更多相关文章

  1. cryptopp开源库的使用(一):md5加密

    项目总是各种新需求,最近遇到需要对字符串进行md5加密,确保传输字符串的有效性. 考虑到跨平台性和通用性,选择了cryptopp开源库,这里主要是用静态库调用. 1.引入头文件和lib库 #inclu ...

  2. cryptopp开源库的使用(零):windows下使用visual studio编译

    编译相当简单:打开目录下的sln文件直接编译即可,官方支持到vc2012,我使用vs2013也没有错误,优秀的开源库总是便于使用. 编译的时候注意运行库得选择需要跟使用该库的保持一致,否则会出现重定义 ...

  3. android 使用开源库zxing生成二维码,扫描二维码【转】

    转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...

  4. 二维码扫描开源库ZXing定制化【转】

    转自:http://www.cnblogs.com/sickworm/p/4562081.html 最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. ...

  5. 二维码扫描开源库ZXing定制化

    最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. 建议: 如果需要集成到自己的app上,而不是做一个demo,不推荐用ZXing的Android外围开 ...

  6. redis在游戏服务器中的使用初探(二) 客户端开源库选择

    上文提到 搭建完成后 我们选择客户端的开源库进行连接 有以下三种选择 1 acl-redis 原因是支持VC 国产  作者博客   acl 框架库简介  用 acl 库编写高效的 C++ redis ...

  7. 17 win7 sp1 x64/VS2015下配置creo4.0二次开发环境——调用了众多开源库(ceres-solver,PCL1.8.0,office 2016COM接口,MySql数据库等)

    0 引言 本次开发环境的配置是在综合考虑了开源库的版本.VS版本以及CREO4.0的版本,同时针对甲方需求选择了win7 sp1 x64系统. 配置的过程中遇到了形形色色的问题,但是一一解决了.通过这 ...

  8. Maven系列(二) -- 将开源库上传到maven仓库私服

    前言 之前简单说了下Maven的搭建,现在跟大家说一下如何将自己的aar传到我们新搭建的maven仓库里面,接下来我们就从最基本的新建一个library开始讲述整个流程,话不多说,让我们把愉快的开始吧 ...

  9. C/C++ 开源库及示例代码

    C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...

随机推荐

  1. Android 模仿QQ空间风格的 UI(转)

    本文内容 环境 演示模仿QQ空间风格的UI 虽然这个 UI 跟现在的QQ空间有点差别,但是也能学到很多东西. 下载 Demo 环境 Windows 7 64 位 Eclipse ADT V22.6.2 ...

  2. Template Method 模板方法

      简介 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的细节 抽象模板AbstractClass的方法分为两类: 基本 ...

  3. access的时间相关的查询

    string sql = "select * from CONCURRENCY WHERE CONCURRENCY.DATE_FLAG BETWEEN  cdate('2013-11-1', ...

  4. jquery.placeholder.js的使用

    最近做东西用到placeholder这个属性,可是这个属性在低版本的IE或者QQ浏览器等这些浏览器上这个属性不能生效,后来在网上查了下,发现了jquery的一个插件jquery.placeholder ...

  5. Linux下登陆mysql服务器不需要输入账号密码信息

    linux下登录mysql服务器一般都是在命令行手动输入链接信息 [root@localhost ~]# mysql -hlocalhost -uroot -p11111 而在mysql 5.6之后版 ...

  6. tableView创建方法调用的研究

    当两个section的cell数量都为5的时候,方法的调用顺序: -[ViewController numberOfSectionsInTableView:] -[ViewController tab ...

  7. 《C# 并发编程 · 经典实例》读书笔记

    前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...

  8. JavaScript--Date函数

    1. Date函数 var now = new Date(); 获取当前日期对象 now对象->Date.prototype->Object.prototype 将一个字符串转换为Date ...

  9. 疯狂学习java web4(jsp)

    JSP与PHP.ASP.ASP.NET等语言类似,运行在服务端的语言. JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开 ...

  10. C++11中int,float,double与string的转化

    在C++11中可以使用std::to_string()函数将数值转换为string格式,十分方便. 以下部分来选自cplusplus.com. std::to_string string to_str ...