📄 templetdlg.cpp
字号:
//初始置换IP,结果放入plain_dup中
for(int k=0;k<64;k++)
Set(plain_dup,i,k,Get(plain,i,IP[k]-1,8),8);//Set函数将plain_dup的第i行第k个元素赋值为Get(plain,IP[k]),而Get函数返回plain的第i行第IP[K]个元素
//初始化R,L
for(n=0;n<4;n++)
{
L[n]=plain_dup[i*radix+n];
R[n]=plain_dup[i*radix+n+4];
}
//16轮加密
encoding(L,R,K,i);
//将L,R组合后放入cipher_dup中
for(n=0;n<4;n++)
{
cipher_dup[n]=R[n];
cipher_dup[n+4]=L[n];
}
//逆初始置换
for(n=0;n<64;n++)
Set(cipher,i,n,Get(cipher_dup,0,IPR[n]-1,8),8);
}
m_cipher=_T("");
for(i=0;i<len_virtual*radix*radix;i++)
{
m_cipher+=char(48+Get(cipher,0,i,8));
if(i%8==7)
m_cipher+=" ";
}
delete []plain;
delete []plain_dup;
delete []cipher;
}
UpdateData(false);
}
void CTempletDlg::OnButtonDecrypt()
{
// TODO: Add your control notification handler code here
UpdateData();
mode_flag=false;
int len=m_cipher.GetLength()/9;
int len_virtual;
len_virtual=len/8;
//cipher和cipher_dup都用于存放明文
char *cipher=new char[len_virtual*radix+1];
char *cipher_dup=new char[len_virtual*radix];
//cipher用于存放密文
char *plain=new char[len_virtual*radix+1];
plain[len_virtual*radix]='\0';
if(cipher_dup==NULL || plain==NULL||cipher==NULL)
{
MessageBox("内存分配失败!");
return;
}
else
{
char temp_key[9];
char plain_dup[8];
char key[8];
char C[4];
char D[4];
char K[16*6];
char L[4];
char R[4];
int i=0;
int n=0;
int k=0;
len=m_key.GetLength();
if(len!=8)//用' '填充m_key至64bit
{
len=8-len;
for(i=0;i<len;i++)
m_key+=" ";
}
//从m_key中获得密钥放入temp_key中
strcpy(temp_key,(LPCTSTR)m_key);
//置换PC-1,结果放入key中
for(k=0;k<56;k++)
Set(key,0,k,Get(temp_key,0,PC1[k]-1,8),8);
//将key分为C,D两部分
for(k=0;k<4;k++)
{
C[k]=key[k];
D[k]=key[k+3];
}
//正式生成子密钥,放入K中
produce_key(C,D,K);
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//从m_cipher中获得密文放入cipher中
for(i=0;i<len_virtual*radix;i++)
cipher[i]=(m_cipher.GetAt(i*(radix+1))-48)*128+(m_cipher.GetAt(i*(radix+1)+1)-48)*64
+(m_cipher.GetAt(i*(radix+1)+2)-48)*32+(m_cipher.GetAt(i*(radix+1)+3)-48)*16
+(m_cipher.GetAt(i*(radix+1)+4)-48)*8+(m_cipher.GetAt(i*(radix+1)+5)-48)*4
+(m_cipher.GetAt(i*(radix+1)+6)-48)*2+m_cipher.GetAt(i*(radix+1)+7)-48;
for(i=0;i<len_virtual;i++)
{
//初始置换IP,结果放入cipher_dup中
for(int k=0;k<64;k++)
Set(cipher_dup,i,k,Get(cipher,i,IP[k]-1,8),8);//Set函数将cipher_dup的第i行第k个元素赋值为Get(plain,IP[k]),而Get函数返回plain的第i行第IP[K]个元素
//初始化R,L
for(n=0;n<4;n++)
{
L[n]=cipher_dup[i*radix+n];
R[n]=cipher_dup[i*radix+n+4];
}
//16轮加密
encoding(L,R,K,i);
//将L,R组合后放入cipher_dup中
for(n=0;n<4;n++)
{
plain_dup[n]=R[n];
plain_dup[n+4]=L[n];
}
//逆初始置换
for(n=0;n<64;n++)
Set(plain,i,n,Get(plain_dup,0,IPR[n]-1,8),8);
}
m_plaindup.Format("%s",plain);
delete []plain;
delete []cipher_dup;
delete []cipher;
}
UpdateData(false);
}
void CTempletDlg::OnButtonProduce()
{
// TODO: Add your control notification handler code here
m_key.Format("%s","");
srand( (unsigned)time( NULL ) );
for(int i=0;i<8;i++)
m_key+=char('A')+rand()%26;
UpdateData(false);
}
void CTempletDlg::Set(char data[],int i,int k,int x,int rad)
{
int m=k/radix;
int n=k%radix;
char temp;
if(x==1)
{
switch(n){
case 0:
temp=char(0x80);
break;
case 1:
temp=char(0x40);
break;
case 2:
temp=char(0x20);
break;
case 3:
temp=char(0x10);
break;
case 4:
temp=char(0x08);
break;
case 5:
temp=char(0x04);
break;
case 6:
temp=char(0x02);
break;
case 7:
temp=char(0x01);
break;
}
data[i*rad+m]|=temp;
}
else
{
switch(n){
case 0:
temp=char(0x7F);
break;
case 1:
temp=char(0xBF);
break;
case 2:
temp=char(0xDF);
break;
case 3:
temp=char(0xEF);
break;
case 4:
temp=char(0xF7);
break;
case 5:
temp=char(0xFB);
break;
case 6:
temp=char(0xFD);
break;
case 7:
temp=char(0xFE);
break;
}
data[i*rad+m]&=temp;
}
}
int CTempletDlg::Get(char data[],int i,int k,int rad)
{
int m=k/radix;
int n=k%radix;
int y;
char temp;
char ch_temp=data[i*rad+m];
switch(n){
case 0:
temp=char(0x80);
break;
case 1:
temp=char(0x40);
break;
case 2:
temp=char(0x20);
break;
case 3:
temp=char(0x10);
break;
case 4:
temp=char(0x08);
break;
case 5:
temp=char(0x04);
break;
case 6:
temp=char(0x02);
break;
case 7:
temp=char(0x01);
break;
}
y=int(ch_temp&temp);
if(y==0)
return 0;
else
return 1;
}
void CTempletDlg:: produce_key(char C[],char D[],char K[])
{
char temp_key[7];
char temp_C[4];
char temp_D[4];
for(int k=0;k<16;k++)
{
C[3]&=0xF0;
D[0]&=0x0F;
for(int n=0;n<4;n++)
{
temp_C[n]=C[n];
temp_D[n]=D[n];
}
//分别对C、D进行循环移位
if(LOOP[k]==1)
{
C[0]= temp_C[0]<<1 | ((temp_C[1]>>7)&0x01);
C[1]= temp_C[1]<<1 | ((temp_C[2]>>7)&0x01);
C[2]= temp_C[2]<<1 | ((temp_C[3]>>7)&0x01);
C[3]= temp_C[3]<<1 | ((temp_C[0]>>7)&0x01)<<4;
D[0]=(temp_D[0]<<1 | ((temp_D[1]>>7)&0x01))&0x0F;
D[1]= temp_D[1]<<1 | ((temp_D[2]>>7)&0x01);
D[2]= temp_D[2]<<1 | ((temp_D[3]>>7)&0x01);
D[3]= temp_D[3]<<1 | ((temp_D[0]>>3)&0x01);
}
else
{
C[0]= temp_C[0]<<2 | ((temp_C[1]>>6)&0x03);
C[1]= temp_C[1]<<2 | ((temp_C[2]>>6)&0x03);
C[2]= temp_C[2]<<2 | ((temp_C[3]>>6)&0x03);
C[3]= temp_C[3]<<2 | ((temp_C[0]>>6)&0x03)<<4;
D[0]=(temp_D[0]<<2 | ((temp_D[1]>>6)&0x03))&0x0F;
D[1]= temp_D[1]<<2 | ((temp_D[2]>>6)&0x03);
D[2]= temp_D[2]<<2 | ((temp_D[3]>>6)&0x03);
D[3]= temp_D[3]<<2 | ((temp_D[0]>>2)&0x03);
}
//将C、D组合成temp_key
for(n=0;n<7;n++)
{
if(n<3)
temp_key[n]=C[n];
else
if(n==3)
temp_key[n]=C[n]|D[0];
else
temp_key[n]=D[n-3];
}
//进行PC2变换
for(n=0;n<48;n++)
Set(K,k,n,Get(temp_key,0,PC2[n]-1,8),6);
}
}
void CTempletDlg:: encoding(char L[],char R[],char K[],int i)
{
char temp_E[6];
char temp[4];
for(int j=0;j<16;j++)
{
for(int n=0;n<4;n++)
temp[n]=R[n];
//扩展运算E
for(n=0;n<48;n++)
Set(temp_E,0,n,Get(R,0,E[n]-1,8),8);
//与密钥做异或运算
for(n=0;n<6;n++)
if(mode_flag)
temp_E[n]^=K[j*6+n];
else temp_E[n]^=K[(15-j)*6+n];
//对temp_E做代换S
int coordinate[8][2];
char temp_E6[8];
for(n=0;n<2;n++)
{
temp_E6[4*n]=(temp_E[0+3*n]>>2)&0x3F;
temp_E6[4*n+1]=(temp_E[1+3*n]>>4)&0x0F|((temp_E[0+3*n]<<6)>>2)&0x3F;
temp_E6[4*n+2]=(temp_E[2+3*n]>>6)&0x03|((temp_E[1+3*n]<<4)>>2)&0x3F;
temp_E6[4*n+3]=temp_E[2+3*n]&0x3F;
}
for(n=0;n<8;n++)
{
coordinate[n][0]=Get(temp_E6,0,n*8+2,8)*2+Get(temp_E6,0,n*8+7,8);
coordinate[n][1]=Get(temp_E6,0,n*8+3,8)*8+Get(temp_E6,0,n*8+4,8)*4+Get(temp_E6,0,n*8+5,8)*2+Get(temp_E6,0,n*8+6,8);
}
char temp_R[4];
for(n=0;n<4;n++)
temp_E[n]=S[2*n][coordinate[2*n][0]][coordinate[2*n][1]]*16+S[2*n+1][coordinate[2*n+1][0]][coordinate[2*n+1][1]];
//P置换
for(n=0;n<32;n++)
Set(temp_R,0,n,Get(temp_E,0,P[n]-1,8),8);
for(n=0;n<4;n++)
temp_R[n]^=L[n];
for(n=0;n<4;n++)
{
L[n]=R[n];
R[n]=temp_R[n];
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -