crytoppp库分析-base

本文深入分析了crytoppp库中的BaseN编码和解码实现,包括BaseN_Encoder和BaseN_Decoder类的初始化、编码过程和解码过程。文章详细解释了如何进行编码和解码操作,如位处理、缓冲区管理以及如何处理消息尾部的填充。通过对源代码的剖析,有助于理解加密库中BaseN编码的基础原理。

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

//BASE的编码、解码

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

#include "pch.h"

#ifndef CRYPTOPP_IMPORTS

#include "basecode.h"
#include "fltrimpl.h"
#include

NAMESPACE_BEGIN(CryptoPP)

//编码类的独立初始化,传入参数集

void BaseN_Encoder::IsolatedInitialize(constNameValuePairs ¶meters)
{
//参数集对象的初始化

//classCRYPTOPP_NO_VTABLE NameValuePairs

 parameters.GetRequiredParameter("BaseN_Encoder",Name::EncodingLookupArray(), m_alphabet);

 parameters.GetRequiredIntParameter("BaseN_Encoder",Name::Log2Base(), m_bitsPerChar);

//m_bitsPerChar为一次参与BASE编码的2进制位数,必须在1-7之间
 if (m_bitsPerChar <= 0 || m_bitsPerChar >=8)
  throwInvalidArgument("BaseN_Encoder: Log2Base must be between 1 and 7inclusive");

//填充符

 byte padding;
 bool pad;
 if (parameters.GetValue(Name::PaddingByte(),padding))
  pad =parameters.GetValueWithDefault(Name::Pad(), true);
 else
  pad = false;
 m_padding = pad ? padding : -1;

 m_bytePos = m_bitPos =0;

//计算输出缓冲区大小(BYTE为单位),并申请缓冲区

//因为以8位为单位,所以凑成能被BASE基数的位数m_bitsPerChar整除的最小数

 int i = 8;
 while (i%m_bitsPerChar != 0)
  i += 8;

//计算缓冲区大小,以字节为单位
 m_outputBlockSize = i/m_bitsPerChar;

//申请缓冲区

 m_outBuf.New(m_outputBlockSize);
}

 

//BASEN的编码函数(如BASE64、BASE32等等)

size_t BaseN_Encoder::Put2(const byte *begin,size_t length, int messageEnd, bool blocking)
{
 FILTER_BEGIN;
while (m_inputPosition < length)

//while (m_inputPosition< length)开始
{

   if (m_bytePos ==0)

 //初始化输出缓冲区全部置0,以开始新一轮
   memset(m_outBuf,0, m_outputBlockSize
 ); 

{

 

  //m_inputPosition移一个字节,取编码源流begin中的当前需要处理位置的字节b

 //开始新一轮处理,以将该字节处理后所余下位数不够处理或正好处理完毕为一轮

  //注意unsignedint在32位系统中,有32位大小,但m_inputPosition

 //以一个字节为单位移动

  unsignedint b = begin[m_inputPosition++], bitsLeftInSource = 8;

 //bitsLeftInSource为源本次需要处理的位数,初值为8

 

//在b中以BASE基数的位数为单位扩展后填充8位缓冲区=====begin

 //处理源和目标,将源以BASE基数要求的位数为单位拆开后,放入输出缓冲区

 //的每个字节内,如BASE64则把源二进制流以6位为单位,放入每个字节中,

 //一个字节还有2位暂时没用到,从源二进制流中每次取8位进行处理,这

 //是必要的,因为要以字节为单位访问内存

  while(true)

//  while(true)循环开始
  {

    //确保m_bitPos在BASE基数位数之内

   assert(m_bitPos < m_bitsPerChar);

 

  
  //m_bitPos为上次应处理但未处理只能移交本次处理的位数,因为上次位数

  //太少无法处理,如:BASE64,第一次顺利处理6位;第二次要处理2位,因为

   //每次必须处理6位,所以第二次将b中2位移至最左边;然后,将b右移8-6=2

 //位保存在m_outBuf[m_bytePos]中,然后进行判断发现无法完成处理,只能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值