`
deepfuture
  • 浏览: 4334904 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79435
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68412
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101532
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281270
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14619
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65612
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31336
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45222
社区版块
存档分类
最新评论

crytoppp库分析-base64

 
阅读更多

 

BASE64的意思就是说从二进制流(所有的无论是中文还是英文都可表示为二进制流,因为存储的是ASCII嘛,还有非文本字符都可以表示为二进制流)中取6个二进制位,因为2的6次方是64,然后,给0-64的每个数字一个字母、数字或者符号做为代表,原因在于这些可以用ASCII码表示,并没有其它任何含义,如果愿意,你也可以制作自己独特的BASE64标准,比如说26-51为大写的A-Z,然后写自己的解码程序,来解码,这可以实现最简单的加密,但是经不起频率分析法的功击,因为毕竟一个6位的二进制永远固定于一个ASCII码,不过双方可以每次生成密文的标准都不一样,比如说:25这次对应于Z,下次对应于X
具体如下:
0-25:A-Z

26-51:a-z

52-61:0-9

62:+

63:/

64:=(填充符)

//BASE64密码编码

// base64.cpp - written and placed in thepublic domain by Wei Dai

#include "pch.h"
#include "base64.h"

NAMESPACE_BEGIN(CryptoPP)

//定义字母表

static const byte s_vec[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const byte s_padding = '=';

//编码初始化,初始化ProxyFilter代理过滤类的member_ptr<B

//ufferedTransformation>m_filter;缓冲区传送信息

void Base64Encoder::IsolatedInitialize(constNameValuePairs &parameters)
{

//换行符,行长度
bool insertLineBreaks =parameters.GetValueWithDefault(Name::InsertLineBreaks(),true);
int maxLineLength =parameters.GetIntValueWithDefault(Name::MaxLineLength(),72);

const char *lineBreak =insertLineBreaks ? "\n" : "";
//MakeParameters的参数依次为:字母表、填充符、分隔符、终结符、

//LONGTOBASE以6位二进制为基数
m_filter->Initialize(CombinedNameValuePairs(
parameters,
MakeParameters(Name::EncodingLookupArray(),&s_vec[0], false)
(Name::PaddingByte(),s_padding)
(Name::GroupSize(),insertLineBreaks ? maxLineLength : 0)
(Name::Separator(),ConstByteArrayParameter(lineBreak))
(Name::Terminator(),ConstByteArrayParameter(lineBreak))
(Name::Log2Base(),6, true)));
}

//得到解码数组

const int*Base64Decoder::GetDecodingLookupArray()
{
static bool s_initialized = false;
static int s_array[256];

if(!s_initialized)

{

//如果需要初始化,则初始化解码s_array,

//指明是64位的编码
InitializeDecodingLookupArray(s_array,s_vec, 64, false);
s_initialized = true;
}
return s_array;
}

NAMESPACE_END

//BASE64密码编码头文件

#ifndef CRYPTOPP_BASE64_H
#define CRYPTOPP_BASE64_H

#include "basecode.h"

NAMESPACE_BEGIN(CryptoPP)

//! Base64 Encoder Class

//类继承情况

//SimpleProxyFilter->Base64Encoder

//BaseN_Decoder->Base64Decoder
class Base64Encoder : public SimpleProxyFilter
{//编码类继承了SimpleProxyFilter简单代理类
public:

//使用换行符、行长度、缓冲区传输信息变量为参数构造
Base64Encoder(BufferedTransformation *attachment= NULL, bool insertLineBreaks = true, int maxLineLength = 72)
: SimpleProxyFilter(newBaseN_Encoder(new Grouper), attachment)
{
IsolatedInitialize(MakeParameters(Name::InsertLineBreaks(),insertLineBreaks)(Name::MaxLineLength(), maxLineLength));
}

voidIsolatedInitialize(const NameValuePairs &parameters);
};

//! Base64 Decoder Class
class Base64Decoder : public BaseN_Decoder
{//解码类继承了BaseN_Decoder类
public:
Base64Decoder(BufferedTransformation *attachment= NULL)
:BaseN_Decoder(GetDecodingLookupArray(), 6, attachment){}

voidIsolatedInitialize(const NameValuePairs &parameters){}

private:
static const int * CRYPTOPP_APIGetDecodingLookupArray();
};

NAMESPACE_END

#endif

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics