crytoppp库分析-base64

来源:互联网 发布:百胜拆分 知乎 编辑:程序博客网 时间:2024/06/06 02:44

 

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

原创粉丝点击