# PBox **Repository Path**: chengp2020/pbox ## Basic Information - **Project Name**: PBox - **Description**: No description available - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-23 - **Last Updated**: 2021-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 1 简介 PBox是一个C++软件实现的分组加密算法。同时包括基于PBox的Hash算法和随机数算法。 PBox通过较大的置换盒(16k),达到快速混淆置换的效果。代码中实现了多种分组长度的加密和Hash算法(64bit、128bit、192bit、256bit、384bit、512bit、768bit、1024bit)。 测试程序使用Visual Studio 2019及MFC实现。 以下简要说明代码的使用方式,具体实现见测试代码。 ## 2 文件说明 pbox.h -- PBox算法代码头文件; pbox.cpp -- PBox算法代码实现文件; 其他文件为测试程序使用。 ## 3 代码说明 ### 3.1 pbox64, pbox128, pbox192, pbox256, pbox384, pbox512, pbox768, pbox1024 加密算法实现类,数值对应不同分组长度。 #### 3.1.1 密钥扩展函数 ```C++ void setKey(const unsigned char *k,int len);//设置密钥 ``` 可接受任意长度的密钥用于初始化轮密钥。 #### 3.1.2 IV函数 ```C++ void setIV(unsigned long long iv)//设置IV及初始CTR void getIV(unsigned long long& iv)//获得IV及初始CTR ``` 设置加解密过程中使用的初始化向量,向量长度等于其分组长度。此加解密方法使用CTR模式,因此IV即计数器的初始值。 #### 3.1.3 加密和解密函数 ```C++ //加密解密序列中的一份数据,data数据的输入输出,len数据的长度 void encrypt(unsigned char* data,int len); void decrypt(unsigned char* data,int len); ``` 加密或者解密一组数据,在设置IV之后,以上函数可连续多次调用,加密或解密一序列的数据。 #### 3.1.4 hash函数 ```C++ //h为输入输出参数,给定初值并返回计算结果,函数可反复调用计算多组数据合成的hash值 static void hash(unsigned long long h[4], const unsigned char* data, int len); ``` 基于PBox的hash算法静态函数,输入输出对应其分组长度。 ### 3.2 PBoxRandom 基于PBox的随机数算法类。 每次初始化后可生成264组(每组128×8字节)不重复随机数。最大循环组数2128×64。 ### 3.3 PBoxSafeRandom 基于PBox的密码安全的随机数算法类。 每次初始化后可生成264组(每组128×8字节)不重复随机数。最大循环组数2128×64。 ## 4 使用方法 以下使用方法说明均以pbox256为例。 ### 4.1 加密 ```C++ unsigned long long iv[4]; //使用随机数初始化iv,rand_box为可用的随机数生成器 for (int i = 0; i < pbox256::IVSize(); ++i) iv[i] = rand_box.uint64(); pbox256 p256; p256.setKey("1234567890", 10);//设置密钥(密钥扩展) p256.setIV(iv);//设置IV //加密一组数据,pdata和length分别为数据指针和长度 p256.encrypt(pdata, length); //...重复调用p256.encrypt可加密更多数据 ``` ### 4.2 解密 ```C++ unsigned long long *iv = (unsigned long long*) p;//从输入中读取iv pbox256 p256; p256.setKey("1234567890", 10);//设置密钥(密钥扩展) p256.setIV(iv);//设置IV //加密一组数据,pdata和length分别为数据指针和长度 p256.decrypt(pdata, length); //...重复调用p256.decrypt解密序列中其余数据 ``` ### 4.3 hash ```C++ unsigned long long h[4] = { 0,0,0,0 } ;//hash初始值 //计算hash值,pdata和length分别为数据指针和长度,h输出hash结果 pbox256::hash(h, pdata, length); //...重复调用pbox256::hash继续计算 ``` ### 4.4 随机数 以PBoxSafeRandom为例,PBoxRandom使用方法相同 ```C++ PBoxSafeRandom rand_box; //初始化随机数生成器,使用较长的初始化串,安全性会更好 rand_box.init("1234567890abcdef", 15); int r1 = rand_box.uint();//获得32bit随机数 unsigned long long r2 = rand_box.uint64();//获得64bit随机数 double r = rand_box.number();//获得 0~1.0 随机数 char buffer[1000]; rand_box.fill(buffer,1000);//用随机数填充一个数组 ```