crytoppp库分析-base64

本文介绍了BASE64编码的基本原理,包括如何将二进制数据转换为可打印的ASCII字符,以及具体的编码和解码过程。同时展示了用C++实现的BASE64编码和解码的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值