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

最近使用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. TCP的封包与拆包

    对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就是封包和拆包. 一.为什么基于TCP的通讯程序需要进行封包和拆包. TCP是个"流"协议,所谓流,就是没有界限的一串数据. ...

  2. TCP/IP协议原理与应用笔记06:OSI参考模型全称

    1. ISO是一个组织,OSI是一个模型. 2. OSI不是协议,是网络体系结构的概念模型 3. OSI参考模型全称为: Open System Interconnection Reference M ...

  3. jquery ajax 提交表单(file && input)

    用到的插件 jquery.js jquery.form.js[http://malsup.github.io/jquery.form.js] 提交页面 <form enctype="m ...

  4. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  5. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

  6. Linq101-Projection

    using System; using System.Linq; namespace Linq101 { class Projection { /// <summary> /// This ...

  7. Js数学函数1

    1.取模求余数 //1.JS取模求余 //输出 for (var i = 0; i < 20; i++) { if (i % 3 == 0) { documentHelper.WriteText ...

  8. Android onConfigurationChanged(Configuration cfg) 无法触发问题

     1.android:configChanges="orientation|keyboardHidden"的使用  当在activity加上android:configChange ...

  9. Android开发手记(19) 数据存储四 ContentProvider

    转载自:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html Android为数据存储提供了五种方式: 1.SharedP ...

  10. get the text value of a selected option.

    <select id="myselect"> <option value="1">Mr</option> <optio ...