# 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);//用随机数填充一个数组
```