📄 des.cpp
字号:
// Des.cpp: implementation of the CDes class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "sevr.h"
#include "Des.h"
#include<math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDes::CDes()
{
}
CDes::~CDes()
{
}
CString CDes::jiami()
{
CString str="";
int table1[65]={0},table2[65]={0};
int i=0,j=0,ch=0,k=0;
int L[33]={0};
int Lsave[33]={0};
int R[33]={0};
int RE[49]={0};
int s[9][7]={0};
int sboxout[9]={0};
int temp[5]={0},f[33]={0},frk[33]={0};
for(i=1;i<=64;i++)
table2[i]=yuanshishujuerjinzhi[IP[i-1]];//IP置换
for(i=1;i<=32;i++)
{ L[i]=table2[i];
R[i]=table2[i+32];
}//L0,R0
for(k=1;k<=16;k++)
{
for(j=1;j<=48;j++)
RE[j]=R[E[j-1]];//E扩展
for(j=1;j<=48;j++)//与Key[i]加密
{ RE[j]+=key16[k][j];//RE是过程性存放数据的变量
if(2==RE[j])
RE[j]=0;
}//mod2加
for(i=1;i<=8;i++)//48位分成8组
for(j=1;j<=6;j++)
s[i][j]=RE[6*(i-1)+j];
//下面经过S盒,得到8个数
int x=0,y=0;
for(i=1;i<=8;i++)
{ x=s[i][6]+2*s[i][1];
y=s[i][5]+2*s[i][4]+4*s[i][3]+8*s[i][2];
sboxout[i]=sbox[i-1][x][y];
}
for(i=1;i<=8;i++)//8个数变换输出四位二进制
{
for(j=1;j<=4;j++)
{
temp[5-j]=sboxout[i]%2;//
sboxout[i]/=2;
}
for(j=1;j<=4;j++)
f[4*(i-1)+j]=temp[j];//把8个四位二进制数转换位32位向量
}
for(i=1;i<33;i++)
frk[i]=f[P[i-1]];//p置换
for(i=1;i<33;i++)
{ Lsave[i]=L[i];
L[i]=R[i];
}
for(i=1;i<33;i++)
{ R[i]=Lsave[i]+frk[i];
if(2==R[i])
R[i]=0;
}
}//十六轮迭代加密
for(i=1;i<=32;i++)
{
table1[i]=R[i];
table1[i+32]=L[i];
}
for(i=1;i<=64;i++)
table2[i]=table1[IP_1[i-1]];//IP逆变换
str="";
for(i=1;i<=64;i++)
{
if(0==table2[i])
str+='0';
else
str+='1';
}
return str;
}//函数体
int CDes::subkey()
{
int table2[57]={0};//密钥二进制
int i=0,j=0,m=0;
int Csave[29];
int Dsave[29];
int D[29];
int C[29];
for(i=1;i<57;i++)
table2[i]=yushimiyaoerjinzhi[PC_1[i-1]];//56位压缩
for(i=1;i<=28;i++)
{ C[i]=table2[i];
D[i]=table2[i+28];
}//得到C0,D0
for(i=1;i<=16;i++)//十六次子密钥迭代
{ if(i==1||i==2||i==9||i==16)
{
for(j=1;j<28;j++)
{
Csave[j]=C[j+1];
Dsave[j]=D[j+1];
}//for
Csave[28]=C[1];
Dsave[28]=D[1];
}//if
else
{
for(j=1;j<27;j++)
{
Csave[j]=C[j+2];
Dsave[j]=D[j+2];//Csave,Dsave,用来做移位时的临时存放变量
}//for
Csave[27]=C[1];
Csave[28]=C[2];
Dsave[27]=D[1];
Csave[28]=D[2];
}//else
for(j=1;j<=28;j++)
{ C[j]=Csave[j];
D[j]=Dsave[j];
}
for(m=1;m<=28;m++)
{
table2[m]=C[m];
table2[m+28]=D[m];
}//
for(m=1;m<=48;m++)
key16[i][m]=table2[PC_2[m-1]];
}//for 密钥循环
return 0;
}//函数体
void CDes::changekey()
{
int temp[49]={0};
int k=0,i=0;
for(k=1;k<=8;k++)
{
for(i=1;i<=48;i++)
{ temp[i]=key16[k][i];
key16[k][i]=key16[17-k][i];
key16[17-k][i]=temp[i];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -