cryptopp开源库的使用(二):base64加密
很多时候我只是优秀工具的使用者,优秀的工具用好了才能发挥作用
最近使用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加密的更多相关文章
- cryptopp开源库的使用(一):md5加密
项目总是各种新需求,最近遇到需要对字符串进行md5加密,确保传输字符串的有效性. 考虑到跨平台性和通用性,选择了cryptopp开源库,这里主要是用静态库调用. 1.引入头文件和lib库 #inclu ...
- cryptopp开源库的使用(零):windows下使用visual studio编译
编译相当简单:打开目录下的sln文件直接编译即可,官方支持到vc2012,我使用vs2013也没有错误,优秀的开源库总是便于使用. 编译的时候注意运行库得选择需要跟使用该库的保持一致,否则会出现重定义 ...
- android 使用开源库zxing生成二维码,扫描二维码【转】
转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...
- 二维码扫描开源库ZXing定制化【转】
转自:http://www.cnblogs.com/sickworm/p/4562081.html 最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. ...
- 二维码扫描开源库ZXing定制化
最近在用ZXing这个开源库做二维码的扫描模块,开发过程的一些代码修改和裁剪的经验和大家分享一下. 建议: 如果需要集成到自己的app上,而不是做一个demo,不推荐用ZXing的Android外围开 ...
- redis在游戏服务器中的使用初探(二) 客户端开源库选择
上文提到 搭建完成后 我们选择客户端的开源库进行连接 有以下三种选择 1 acl-redis 原因是支持VC 国产 作者博客 acl 框架库简介 用 acl 库编写高效的 C++ redis ...
- 17 win7 sp1 x64/VS2015下配置creo4.0二次开发环境——调用了众多开源库(ceres-solver,PCL1.8.0,office 2016COM接口,MySql数据库等)
0 引言 本次开发环境的配置是在综合考虑了开源库的版本.VS版本以及CREO4.0的版本,同时针对甲方需求选择了win7 sp1 x64系统. 配置的过程中遇到了形形色色的问题,但是一一解决了.通过这 ...
- Maven系列(二) -- 将开源库上传到maven仓库私服
前言 之前简单说了下Maven的搭建,现在跟大家说一下如何将自己的aar传到我们新搭建的maven仓库里面,接下来我们就从最基本的新建一个library开始讲述整个流程,话不多说,让我们把愉快的开始吧 ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
随机推荐
- std::bad_alloc
一个服务器程序,长时间运行报错了. ----------- terminate called after throwing an instance of 'std::bad_alloc' what() ...
- Core Foundation框架介绍
Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...
- 初学 Canvas <第一篇-基础篇>
本文摘自:兴趣部落大神(为你一生画眉)-讲一讲canvas究竟是个啥? HTML5 的标准已经出来好久了,但是似乎其中的 Canvas 现在并没有在太多的地方用到.一个很重要的原因是,Canvas 的 ...
- 1_Linux_目录简介
1. Linux中所以内容以文件形式保存,包括硬件,所以在用命令行配置文件时,该配置仅仅是临时生效. 2. Linux不靠扩展名区分类型,而是靠文件权限.之所以有扩展名是为了便于管理. .rpm二 ...
- codevs1051单词接龙(栈)
/* 看到n的范围就觉得这个不可能是DP啥的 因为这个接龙的规则十分的简单 只要前缀相同即可 所以先按字典序排一遍 这样保证符合规则的一定挨着 然后弄一个stack 每次拿栈顶元素看看待入栈的元素是否 ...
- android自定义listview实现圆角
在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...
- 关于uploadify 没有显示进度条!!!!
如果你也弄了很久不知道为什么不出现上传进度条!,那就一定要看这里了! 我注释了 queueID 属性后 就出现了!!!!! 就是这么简答! //添加界面的附件管理 $('#file_upload'). ...
- C#实现发送邮件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 编写利用Fragment创建新闻列表
编写利用Fragment创建新闻列表 1.创建新闻实体类News,代码如下: public class News { private String title; private String co ...
- ajax调试兼容性
<script type="text/javascript"> if(typeof ActiveXObject!= 'undefined'){ var x = new ...