📄 cipher.h
字号:
#include "SubKeyProduce.h"
/**************************************/
void InitialPermu(int *TB);
void expanpermu(int *RPT,int *EXT);
void SBox(int *RPT,int *EXT);
void PBox(int *RPT);
void lastpermu(int *LPT,int *RPT);
void tochar(int *LPT,int *RPT);
void totext3(int *LPT,int *RPT);
/**************************************/
void cipher(int *textblk,int choice) //text是8个字节的块
{
/****初始置换****/
InitialPermu(textblk);
/****把块分成两半****/
int LPT[32];
int RPT[32];
int temp[32];
for(int m=0;m<32;m++)LPT[m]=textblk[m];
for(m=0;m<32;m++)RPT[m]=textblk[m+32];
for(m=0;m<32;m++)temp[m]=textblk[m+32];
/* for(m=0;m<32;m++)cout<<LPT[m]<<" "; 验证文本块对半分无误
cout<<endl;
for(m=0;m<32;m++)cout<<RPT[m]<<" ";
cout<<endl;
for(m=0;m<32;m++)cout<<temp[m]<<" ";
cout<<endl;
*/
/*************16轮加密*************/
int turn=1; //第几轮
while(turn<17){
/****扩展置换****/
int EXT[48];
expanpermu(RPT,EXT);
/****按位异或****/
switch(choice){
case 1:
for(m=0;m<48;m++)
EXT[m]=EXT[m]^SubKey[turn-1][m];
break;
case 2:
for(m=0;m<48;m++)
EXT[m]=EXT[m]^SubKey[16-turn][m];
break;
}
// for(i=0;i<48;i++)cout<<EXT[i]<<" "; 验证按位异或无误
// cout<<endl;
/****S盒替换****/
SBox(RPT,EXT);
/****P盒替换****/
PBox(RPT);
/****异或与交换****/
for(int n=0;n<32;n++)
RPT[n]=RPT[n]^LPT[n];
for(n=0;n<32;n++)
LPT[n]=temp[n];
for(n=0;n<32;n++)
temp[n]=RPT[n];
turn++;
}
for(m=0;m<32;m++)
temp[m]=RPT[m];
for(m=0;m<32;m++)
RPT[m]=LPT[m];
for(m=0;m<32;m++)
LPT[m]=temp[m];
/******************最终置换*******************/
lastpermu(LPT,RPT);
/******************转换为字符串***************/
if(choice==1)totext3(LPT,RPT);
tochar(LPT,RPT);
}
/***************************************函数实现********************************************/
void InitialPermu(int *TB)
{
int IPTable[]={57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,
56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6};
int tb[64];
for(int i=0;i<64;i++)tb[i]=TB[i];
for(i=0;i<64;i++)
TB[i]=tb[IPTable[i]];
// for(int m=0;m<64;m++)cout<<TB[m]<<" "; 验证初始置换是否无误
// cout<<endl;
}
void expanpermu(int *RPT,int *EXT)
{
int EPTable[]={31,0,1,2,3,4,3,4,5,6,7,8,
7,8,9,10,11,12,11,12,13,14,15,16,
15,16,17,18,19,20,19,20,21,22,23,24,
23,24,25,26,27,28,27,28,29,30,31,0};
for(int i=0;i<48;i++)
EXT[i]=RPT[EPTable[i]];
// for(i=0;i<48;i++)cout<<EXT[i]<<" "; 验证扩展置换无误
// cout<<endl;
}
void SBox(int *RPT,int *EXT)
{
/****8个替换盒****/
int S1[4][16]={{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}};
int S2[4][16]={{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},
{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},
{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},
{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}};
int S3[4][16]={{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},
{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},
{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},
{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}};
int S4[4][16]={{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},
{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},
{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}};
int S5[4][16]={{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},
{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},
{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},
{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}};
int S6[4][16]={{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},
{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},
{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},
{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}};
int S7[4][16]={{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},
{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},
{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},
{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}};
int S8[4][16]={{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},
{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},
{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},
{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}};
int bk=0;
while(bk<8){
int tem[6];
for(int i=0;i<6;i++)tem[i]=EXT[bk*6+i];
int row=tem[0]*2+tem[5];
int column=tem[1]*8+tem[2]*4+tem[3]*2+tem[4];
int num;
switch(bk){
case 0:
num=S1[row][column];
break;
case 1:
num=S2[row][column];
break;
case 2:
num=S3[row][column];
break;
case 3:
num=S4[row][column];
break;
case 4:
num=S5[row][column];
break;
case 5:
num=S6[row][column];
break;
case 6:
num=S7[row][column];
break;
case 7:
num=S8[row][column];
break;
}
int times=3;
while(times>=0){
RPT[bk*4+times]=num%2;
times--;
num=num/2;
}
bk++;
}
// for(int i=0;i<32;i++)cout<<RPT[i]<<" "; 验证S盒替换无误
// cout<<endl;
}
void PBox(int *RPT)
{
int tem[32];
for(int i=0;i<32;i++)tem[i]=RPT[i];
int PTable[]={15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,
1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24};
for(i=0;i<32;i++)
RPT[i]=tem[PTable[i]];
}
void lastpermu(int *LPT,int *RPT)
{
int LPTable[]={39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25,32,0,40,8,48,16,56,24};
int tt[64];
for(int i=0;i<32;i++)
tt[i]=LPT[i];
for(i=0;i<32;i++)
tt[i+32]=RPT[i];
for (i=0;i<64;i++){
if(i<32)LPT[i]=tt[LPTable[i]];
else RPT[i-32]=tt[LPTable[i]];
}
}
void tochar(int *LPT,int *RPT)
{
int t=0;
char value;
while(t<8){
if(t<4){
value=(char)(LPT[t*8]*128+LPT[t*8+1]*64+LPT[t*8+2]*32+LPT[t*8+3]*16+LPT[t*8+4]*8
+LPT[t*8+5]*4+LPT[t*8+6]*2+LPT[t*8+7]);
}
else{
value=(char)(RPT[(t-4)*8]*128+RPT[(t-4)*8+1]*64+RPT[(t-4)*8+2]*32+RPT[(t-4)*8+3]*16
+RPT[(t-4)*8+4]*8+RPT[(t-4)*8+5]*4+RPT[(t-4)*8+6]*2+RPT[(t-4)*8+7]);
}
int k=strlen(text2);
text2[k]=value; //一个一个字符地转换
// cout<<value<<endl; 验证转换为字符型并且添加到text2是否成功
// cout<<text2<<endl;
t++;
}
}
void totext3(int *LPT,int *RPT)
{
for(int x=0;x<32;x++)
text3[text3_index++]=LPT[x];
for(x=0;x<32;x++)
text3[text3_index++]=RPT[x];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -