📄 desdenew.cpp
字号:
s=s+16;
}
if(in[i+2]=='1')
{
s=s+32;
}
if(in[i+1]=='1')
{
s=s+64;
}
out[i/8]=s;
}
s=0;
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void DES(char Ptxt[], char Ctxt[]) // DES加密函数定义
{
char LStr[32];
char RStr[32];
char in[64];
char out[64];
char TempStr[32];
char RoundK[16][48];
void IPF(char [],char []); // IP置换函数
void InvIPF(char [],char []); // 逆IP置换函数
void CipherF(char [],char []); // Cipher函数
void XOR32(char [], char[]); // 32bit异或函数
void KeyEx(char [], char [][48]); // 密钥生成函数
IPF(Ptxt,in);
for(int i=0;i<32;i++) // 64bit被分成左右两组
{
LStr[i]=in[i];
}
for(i=32;i<64;i++)
{
RStr[i-32]=in[i];
}
KeyEx(KEY,RoundK); // 利用密钥生成函数得到16轮密钥
for(int r=1;r<=16;r++) //DES核心算法开始
{
for(i=0;i<32;i++)
{
TempStr[i]=RStr[i];
}
CipherF(RStr,RoundK[16-r]); // 利用Cipher函数进行密钥混合
XOR32(LStr,RStr);
for(i=0;i<32;i++)
{
LStr[i]=TempStr[i];
}
}//DES核心算法结束
for(i=0;i<32;i++) // 输出密文,左右两组交换位置
{
out[i]=RStr[i];
}
for(i=32;i<64;i++)
{
out[i]=LStr[i-32];
}
InvIPF(out,Ctxt);
}
/*---------------------------------------------------------------------------------------------------------------*/
void CipherF(char in[], char key[]) // Cipher函数定义
{
char Str48[48];
char Str32[32];
void XOR48(char [], char[]); // 48bit异或函数
void SboxP(char [], char[]); // DES的S盒
int n=0;
int temp;
for(int i=0;i<48;i++) // 32->48bit扩展
{
n=ex[i];
temp=in[n-1];
Str48[i]=temp;
}
XOR48(key,Str48); // 48bit异或函数
SboxP(Str48,Str32); // 使用S盒
for(i=0;i<32;i++) // P置换
{
n=p32[i];
temp=Str32[n-1];
in[i]=temp;
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void SboxP(char in[],char out[]) // S盒定义
{
char box[8][6];
int j;
int n=0;
for(int i=0;i<8;i++)
for(j=0;j<6;j++)
{
box[i][j]=in[n];
n=n+1;
}
char x=0;
char y=0; // S盒内的行列坐标(x,y)
n=0;
for(int s=1;s<=8;s++)
{
if(box[s-1][0]=='1')
{
x=x+2;
}
if(box[s-1][5]=='1')
{
x=x+1;
} // 确定行坐标x
if(box[s-1][1]=='1')
{
y=y+8;
}
if(box[s-1][2]=='1')
{
y=y+4;
}
if(box[s-1][3]=='1')
{
y=y+2;
}
if(box[s-1][4]=='1')
{
y=y+1;
} // 确定列坐标y
switch(sbox[s-1][x][y]) // 0至15的整数转化为4bit二进制串
{
case 0 :
out[n]='0'; out[n+1]='0'; out[n+2]='0'; out[n+3]='0';
break;
case 1 :
out[n]='0'; out[n+1]='0'; out[n+2]='0'; out[n+3]='1';
break;
case 2 :
out[n]='0'; out[n+1]='0'; out[n+2]='1'; out[n+3]='0';
break;
case 3 :
out[n]='0'; out[n+1]='0'; out[n+2]='1'; out[n+3]='1';
break;
case 4 :
out[n]='0'; out[n+1]='1'; out[n+2]='0'; out[n+3]='0';
break;
case 5 :
out[n]='0'; out[n+1]='1'; out[n+2]='0'; out[n+3]='1';
break;
case 6 :
out[n]='0'; out[n+1]='1'; out[n+2]='1'; out[n+3]='0';
break;
case 7 :
out[n]='0'; out[n+1]='1'; out[n+2]='1'; out[n+3]='1';
break;
case 8 :
out[n]='1'; out[n+1]='0'; out[n+2]='0'; out[n+3]='0';
break;
case 9 :
out[n]='1'; out[n+1]='0'; out[n+2]='0'; out[n+3]='1';
break;
case 10 :
out[n]='1'; out[n+1]='0'; out[n+2]='1'; out[n+3]='0';
break;
case 11 :
out[n]='1'; out[n+1]='0'; out[n+2]='1'; out[n+3]='1';
break;
case 12 :
out[n]='1'; out[n+1]='1'; out[n+2]='0'; out[n+3]='0';
break;
case 13 :
out[n]='1'; out[n+1]='1'; out[n+2]='0'; out[n+3]='1';
break;
case 14 :
out[n]='1'; out[n+1]='1'; out[n+2]='1'; out[n+3]='0';
break;
case 15 :
out[n]='1'; out[n+1]='1'; out[n+2]='1'; out[n+3]='1';
break;
}
n=n+4;
x=0;
y=0;
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void XOR32(char Str1[], char Str2[]) // 32bit异或函数定义
{
for(int i=0;i<32;i++)
{
if((Str1[i]=='1')&&(Str2[i]=='1'))
{
Str2[i]='0';
continue;
}
if((Str1[i]=='1')&&(Str2[i]=='0'))
{
Str2[i]='1';
continue;
}
if((Str1[i]=='0')&&(Str2[i]=='1'))
{
Str2[i]='1';
continue;
}
if((Str1[i]=='0')&&(Str2[i]=='0'))
{
Str2[i]='0';
continue;
}
}
}
void XOR48(char Str1[], char Str2[]) // 48bit异或函数定义
{
for(int i=0;i<48;i++)
{
if((Str1[i]=='1')&&(Str2[i]=='1'))
{
Str2[i]='0';
continue;
}
if((Str1[i]=='1')&&(Str2[i]=='0'))
{
Str2[i]='1';
continue;
}
if((Str1[i]=='0')&&(Str2[i]=='1'))
{
Str2[i]='1';
continue;
}
if((Str1[i]=='0')&&(Str2[i]=='0'))
{
Str2[i]='0';
continue;
}
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void KeyEx(char initalK[], char RoundK[][48])// DES密钥生成函数定义
{
int s=0; // 校验初始密钥initalK的正确性
int j=0;
for(int i=0;i<64;i=i+8)
{
for(j=0;j<8;j++)
{
if(initalK[i+j]=='1')
s=s+1;
}
if(s%2)
{
s=0;
}
else
{
printf("\n KEY error! \n");
exit(1);
}
} // 完成对初始密钥initalK的校验
int n=0;
int temp;
char key56[56];
for(i=0;i<56;i++)
{
n=pc1[i]; // 选择置换1,同时除去校验位
temp=initalK[n-1];
key56[i]=temp;
}
for(int r=1;r<=16;r++)
{
for(i=1;i<=recycle[r-1];i++) // 确定循环左移的次数
{
temp=key56[0]; // 左半部分循环左移开始
for(j=0;j<27;j++)
{
key56[j]=key56[j+1];
}
key56[27]=temp; //左半部分循环左移结束
temp=key56[28]; // 右半部分循环左移开始
for(j=28;j<55;j++)
{
key56[j]=key56[j+1];
}
key56[55]=temp; //左半部分循环左移结束
} // 全部循环左移结束
for(i=0;i<48;i++) // 选择置换2
{
n=pc2[i];
temp=key56[n-1];
RoundK[r-1][i]=temp;
} // 得到第r轮密钥
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void IPF(char in[],char out[]) // IP置换函数定义
{
int temp;
int n;
for(int i=0;i<64;i++)
{
n=IP[i];
temp=in[n-1];
out[i]=temp;
}
}
void InvIPF(char in[],char out[]) // 逆IP置换函数定义
{
int temp;
int n;
for(int i=0;i<64;i++)
{
n=InvIP[i];
temp=in[n-1];
out[i]=temp;
}
}
/*---------------------------------------------------------------------------------------------------------------*/
void output(char in[],FILE * out) // 输出函数定义
{
for(int i=0;i<8;i++)
fputc(in[i],out);
}
/*---------------------------------------------------------------------------------------------------------------*/
void output(char in[],FILE * out,int n) // 向文件输出加密结果
{
fwrite(in,1,n,out);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -