/**
*@autho stardust
*@time 2013-10-10
*@param 实现AES五种加密模式的测试*/#include
using namespacestd;//加密编码过程函数,16位1和0
int dataLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int encTable[4] = {1,0,1,0}; //置换表
int data[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文//切片加密函数
void encode(intarr[])
{for(int i=0;i
{
arr[i]= arr[i] ^encTable[i];
}
}//电码本模式加密,4位分段
void ECB(intarr[])
{//数据明文切片
int a[4][4];int dataCount = 0; //位置变量
for(int k=0;k<4;k++)
{for(int t=0;t<4;t++)
{
a[k][t]=data[dataCount];
dataCount++;
}
}
dataCount= 0;//重置位置变量
for(int i=0;i
{int r = i/encLen;//行
int l = 0;//列
int encQue[4]; //编码片段
for(int j=0;j
{
encQue[j]=a[r][l];
l++;
}
encode(encQue);//切片加密//添加到密文表中
for(int p=0;p
{
ciphertext[dataCount]=encQue[p];
dataCount++;
}
}
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}//CBC//密码分组链接模式,4位分段
void CCB(intarr[])
{//数据明文切片
int a[4][4];int dataCount = 0; //位置变量
for(int k=0;k<4;k++)
{for(int t=0;t<4;t++)
{
a[k][t]=data[dataCount];
dataCount++;
}
}
dataCount= 0;//重置位置变量
int init[4] = {1,1,0,0}; //初始异或运算输入//初始异或运算
for(int i=0;i
{int r = i/encLen;//行
int l = 0;//列
int encQue[4]; //编码片段//初始化异或运算
for(int k=0;k
{
a[r][k]= a[r][k] ^init[k];
}//与Key加密的单切片
for(int j=0;j
{
encQue[j]=a[r][j];
}
encode(encQue);//切片加密//添加到密文表中
for(int p=0;p
{
ciphertext[dataCount]=encQue[p];
dataCount++;
}//变换初始输入
for(int t=0;t
{
init[t]=encQue[t];
}
}
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}//CTR//计算器模式,4位分段
void CTR(intarr[])
{//数据明文切片
int a[4][4];int dataCount = 0; //位置变量
for(int k=0;k<4;k++)
{for(int t=0;t<4;t++)
{
a[k][t]=data[dataCount];
dataCount++;
}
}
dataCount= 0;//重置位置变量
int init[4][4] = {{1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}}; //算子表
int l = 0; //明文切片表列//初始异或运算
for(int i=0;i
{int r = i/encLen;//行
int encQue[4]; //编码片段//将算子切片
for(int t=0;t
{
encQue[t]=init[r][t];
}
encode(encQue);//算子与key加密//最后的异或运算
for(int k=0;k
{
encQue[k]= encQue[k] ^a[l][k];
}
l++;//添加到密文表中
for(int p=0;p
{
ciphertext[dataCount]=encQue[p];
dataCount++;
}
}
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}//CFB//密码反馈模式,4位分段
void CFB(intarr[])
{//数据明文切片,切成2 * 8 片
int a[8][2];int dataCount = 0; //位置变量
for(int k=0;k<8;k++)
{for(int t=0;t<2;t++)
{
a[k][t]=data[dataCount];
dataCount++;
}
}
dataCount= 0; //恢复初始化设置
int lv[4] = {1,0,1,1}; //初始设置的位移变量
int encQue[2]; //K的高两位
int k[4]; //K
for(int i=0;i<2 * encLen;i++) //外层加密循环
{//产生K
for(int vk=0;vk
{
k[vk]=lv[vk];
}
encode(k);for(int k2=0;k2<2;k2++)
{
encQue[k2]=k[k2];
}//K与数据明文异或产生密文
for(int j=0;j<2;j++)
{
ciphertext[dataCount]= a[dataCount/2][j] ^encQue[j];
dataCount++;
}//lv左移变换
lv[0] = lv[2];
lv[1] = lv[3];
lv[2] = ciphertext[dataCount-2];
lv[3] = ciphertext[dataCount-1];
}
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}//OFB//输出反馈模式,4位分段
void OFB(intarr[])
{//数据明文切片,切成2 * 8 片
int a[8][2];int dataCount = 0; //位置变量
for(int k=0;k<8;k++)
{for(int t=0;t<2;t++)
{
a[k][t]=data[dataCount];
dataCount++;
}
}
dataCount= 0; //恢复初始化设置
int lv[4] = {1,0,1,1}; //初始设置的位移变量
int encQue[2]; //K的高两位
int k[4]; //K
for(int i=0;i<2 * encLen;i++) //外层加密循环
{//产生K
for(int vk=0;vk
{
k[vk]=lv[vk];
}
encode(k);for(int k2=0;k2<2;k2++)
{
encQue[k2]=k[k2];
}//K与数据明文异或产生密文
for(int j=0;j<2;j++)
{
ciphertext[dataCount]= a[dataCount/2][j] ^encQue[j];
dataCount++;
}//lv左移变换
lv[0] = lv[2];
lv[1] = lv[3];
lv[2] = encQue[0];
lv[3] = encQue[1];
}
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}voidprintData()
{
cout<
cout<
cout<
{if(t1!=0 && t1%4==0)
cout<
cout<
}
cout<
cout<
}intmain()
{
printData();
ECB(data);
CCB(data);
CTR(data);
CFB(data);
OFB(data);return 0;
}