📄 desdlg.cpp
字号:
r=m_miwenstring.GetBuffer(0);
flag1=m_miwenstring.GetLength();
suijixing(r,flag1);
}
void CDESDlg::OnButton2()
{
// TODO: Add your control notification handler code here
int flag1,flag2,temp,i,j;
char *p,*q,*r;
char duankuai[64];/*存放倒数64位密文*/
char tempchar[64];/*存放每轮解密64位明文*/
char buf[65];/*由数组转换至CString中转空间*/
char miwen[64];/*存放每轮解密64位密文*/
char c[2];
char temp1[8];
CString str;
UpdateData();
if(m_miwenstring.GetLength()==0)
MessageBox("请输入密文","提示",MB_OK);
else
{
if(m_miyaostring.GetLength()==0)
MessageBox("请输入密钥","提示",MB_OK);
else
{
if(m_miyaostring.GetLength()!=8)
MessageBox("密钥长度错误,请重新输入8位密钥","提示",MB_OK);
else
{
p=m_miyaostring.GetBuffer(0);
key_creat(p);
q=m_miwenstring.GetBuffer(0);
flag1=m_miwenstring.GetLength();
temp=flag1%64;
flag1-=temp;/*计数不需短块处理的密文位数*/
flag2=0;/*计数不需短块处理的解密次数*/
str="";
if(temp!=0)
{
MessageBox("需要进行短块处理","提示",MB_OK);
for(i=0;i<64;i++)
duankuai[i]=q[flag1-64+i];
DES(duankuai,tempchar,0);
for(i=0;i<64;i++)
buf[i]=tempchar[i];
buf[64]='\0';
m_miwenstring.Delete(flag1-64,64);
m_miwenstring+=buf;
}
while(flag1)
{
for(j=0;j<64;j++)
miwen[j]=q[j+flag2*64];
flag2++;
flag1-=64;
DES(miwen,tempchar,0);
for(i=0;i<64;i++)
buf[i]=tempchar[i];
buf[64]='\0';
str+=buf;
}
str+=m_miwenstring.Mid(flag2*64,temp);
r=str.GetBuffer(0);
flag1=str.GetLength();
flag2=0;
for(i=0;i<flag1/8;i++)
{
for(j=0;j<8;j++)
temp1[j]=r[j+flag2*8]-48;
c[0]=temp1[0]*128+temp1[1]*64+temp1[2]*32+temp1[3]*16+temp1[4]*8+temp1[5]*4+temp1[6]*2+temp1[7];
c[1]='\0';
m_mingwenstring+=c;
flag2++;
}
UpdateData(FALSE);
}
}
}
}
void CDESDlg::OnButton3()
{
// TODO: Add your control notification handler code here
m_mingwenstring="";
m_miyaostring="";
m_miwenstring="";
m_0="";
m_1="";
m_00="";
m_01="";
m_10="";
m_11="";
m_000="";
m_001="";
m_010="";
m_011="";
m_100="";
m_101="";
m_110="";
m_111="";
UpdateData(FALSE);
}
void CDESDlg::OnButton4()
{
// TODO: Add your control notification handler code here
char buf[3];
m_0="";
m_1="";
m_00="";
m_01="";
m_10="";
m_11="";
m_000="";
m_001="";
m_010="";
m_011="";
m_100="";
m_101="";
m_110="";
m_111="";
buf[0]=suiji[0][0];
buf[1]=suiji[0][1];
buf[2]='\0';
m_0+=buf;
buf[0]=suiji[1][0];
buf[1]=suiji[1][1];
buf[2]='\0';
m_1+=buf;
buf[0]=suiji[2][0];
buf[1]=suiji[2][1];
buf[2]='\0';
m_00+=buf;
buf[0]=suiji[3][0];
buf[1]=suiji[3][1];
buf[2]='\0';
m_01+=buf;
buf[0]=suiji[4][0];
buf[1]=suiji[4][1];
buf[2]='\0';
m_10+=buf;
buf[0]=suiji[5][0];
buf[1]=suiji[5][1];
buf[2]='\0';
m_11+=buf;
buf[0]=suiji[6][0];
buf[1]=suiji[6][1];
buf[2]='\0';
m_000+=buf;
buf[0]=suiji[7][0];
buf[1]=suiji[7][1];
buf[2]='\0';
m_001+=buf;
buf[0]=suiji[8][0];
buf[1]=suiji[8][1];
buf[2]='\0';
m_010+=buf;
buf[0]=suiji[9][0];
buf[1]=suiji[9][1];
buf[2]='\0';
m_011+=buf;
buf[0]=suiji[10][0];
buf[1]=suiji[10][1];
buf[2]='\0';
m_100+=buf;
buf[0]=suiji[11][0];
buf[1]=suiji[11][1];
buf[2]='\0';
m_101+=buf;
buf[0]=suiji[12][0];
buf[1]=suiji[12][1];
buf[2]='\0';
m_110+=buf;
buf[0]=suiji[13][0];
buf[1]=suiji[13][1];
buf[2]='\0';
m_111+=buf;
UpdateData(FALSE);
}
void Byte_To_Bit(char *str1,char *str2)
{
int i;
unsigned char c;
for(i=0;i<8;i++)
{
c=*(str1+i);
str2[i*8]=(c>>7)%2+48;
str2[i*8+1]=(c>>6)%2+48;
str2[i*8+2]=(c>>5)%2+48;
str2[i*8+3]=(c>>4)%2+48;
str2[i*8+4]=(c>>3)%2+48;
str2[i*8+5]=(c>>2)%2+48;
str2[i*8+6]=(c>>1)%2+48;
str2[i*8+7]=c%2+48;
}
}
void key_creat(char *p)
{
int i,flag;
char mainkey[64];
char key56[56];
char c[28],d[28],cc[28],dd[28];
char temp[56];
Byte_To_Bit(p,mainkey);
pc1_trans(mainkey,key56);
for(i=0;i<28;i++)
{
c[i]=key56[i];
d[i]=key56[i+28];
}
for(flag=0;flag<16;flag++)
{
for(i=0;i<28;i++)
{
cc[i]=c[(i+28-moveleft[flag])%28];
dd[i]=d[(i+28-moveleft[flag])%28];
}
for(i=0;i<28;i++)
{
temp[i]=cc[i];
temp[i+28]=dd[i];
}
pc2_trans(temp,key[flag]);
}
}
void pc1_trans(char *str1,char *str2)
{
int i=0;
for(;i<56;i++)
str2[i]=str1[pc1[i]-1];
}
void pc2_trans(char *str1,char *str2)
{
int i=0;
for(;i<48;i++)
str2[i]=str1[pc2[i]-1];
}
void DES(char *str1,char *str2,int mode)
{
int i=0,j;
char ip_buf1[64];/*IP置换后*/
char ip_buf2[64];/*IP逆置换前*/
char L[17][32];/*L[i]*/
char R[17][32];/*R[i]*/
ip_trans(str1,ip_buf1);
for(i=0;i<32;i++)
{
L[0][i]=ip_buf1[i]; /*初始化L0*/
R[0][i]=ip_buf1[i+32]; /*初始化R0*/
}
if(mode==1)/*加密模式*/
{
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
L[i+1][j]=R[i][j];
G_fuction(R[i],R[i+1],i);
}
}
if(mode==0)/*解密模式*/
{
for(i=0;i<16;i++)
{
for(j=0;j<32;j++)
L[i+1][j]=R[i][j];
G_fuction(R[i],R[i+1],15-i);
}
}
for(i=0;i<32;i++)
{
ip_buf2[i]=R[15][i];
ip_buf2[i+32]=L[15][i];
}
ip_trans_ni(ip_buf2,str2);
}
void ip_trans(char *str1,char *str2)
{
int i=0;
for(;i<64;i++)
str2[i]=str1[ip[i]-1];
}
void ip_trans_ni(char *str1,char *str2)
{
int i=0;
for(;i<64;i++)
str2[i]=str1[ip_ni[i]-1];
}
void G_fuction(char *str1,char *str2,int integer)
{
int i,flag;
int x,y;/*定位S盒中的位置*/
int temp;/*通过定位从S盒中取出的值*/
int value[6];
char E_expand[48];/*E扩展后*/
char P_temp[32];/*P置换前*/
char C[4];/*临时存储经过S盒得到的四位值*/
int buf[4];/*存temp的二进制值*/
for(i=0;i<48;i++)
E_expand[i]=str1[E[i]-1];
xor(E_expand,key[integer],48);
for(flag=0;flag<8;flag++)
{
for(i=0;i<6;i++)
{
if(E_expand[i+flag*6]=='0')
value[i]=0;
else
value[i]=1;
}
x=value[0]*2+value[5];
y=value[1]*8+value[2]*4+value[3]*2+value[4];
temp=S_box[flag][x*16+y];
for(i=0;i<4;i++)
buf[3-i]=(temp>>i)%2;
for(i=0;i<4;i++)
{
if(buf[i]==0)
C[i]='0';
else
C[i]='1';
}
for(i=0;i<4;i++)
P_temp[i+flag*4]=C[i];
}
P_dataex(P_temp,str2);
}
void xor(char *str1,char *str2,int length)
{
int i;
for(i=0;i<length;i++)
if(str1[i]==str2[i])
str1[i]='0';
else str1[i]='1';
}
void P_dataex(char *str1,char *str2)
{
int i;
for(i=0;i<32;i++)
str2[i]=str1[P[i]-1];
}
void suijixing(char *str,int num)
{
int flag[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int rate[14]={0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i,temp,total1,total2;
for(i=0;i<num;i++)
{
if(str[i]=='0')
flag[0]++;
else
flag[1]++;
if(str[i]=='0'&&str[i+1]=='0')
flag[2]++;
if(str[i]=='0'&&str[i+1]=='1')
flag[3]++;
if(str[i]=='1'&&str[i+1]=='0')
flag[4]++;
if(str[i]=='1'&&str[i+1]=='1')
flag[5]++;
if(str[i]=='0'&&str[i+1]=='0'&&str[i+2]=='0')
flag[6]++;
if(str[i]=='0'&&str[i+1]=='0'&&str[i+2]=='1')
flag[7]++;
if(str[i]=='0'&&str[i+1]=='1'&&str[i+2]=='0')
flag[8]++;
if(str[i]=='0'&&str[i+1]=='1'&&str[i+2]=='1')
flag[9]++;
if(str[i]=='1'&&str[i+1]=='0'&&str[i+2]=='0')
flag[10]++;
if(str[i]=='1'&&str[i+1]=='0'&&str[i+2]=='1')
flag[11]++;
if(str[i]=='1'&&str[i+1]=='1'&&str[i+2]=='0')
flag[12]++;
if(str[i]=='1'&&str[i+1]=='1'&&str[i+2]=='1')
flag[13]++;
}
total1=flag[2]+flag[3]+flag[4]+flag[5];
total2=flag[6]+flag[7]+flag[8]+flag[9]+flag[10]+flag[11]+flag[12]+flag[13];
for(i=0;i<2;i++)
rate[i]=(flag[i]*100)/num;
for(i=2;i<6;i++)
rate[i]=(flag[i]*100)/total1;
for(i=6;i<14;i++)
rate[i]=(flag[i]*100)/total2;
for(i=0;i<14;i++)
{
temp=rate[i];
suiji[i][0]=(temp/10)%10+48;
suiji[i][1]=temp%10+48;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -