📄 cdes.cpp
字号:
for(k=0;k<56;k++)
{
if(k<28)
Swap_Bit[k]=C0[k];
else Swap_Bit[k]=D0[k-28];
}
// PC-2
for(k=0;k<48;k++)
Key_Bit[i][k]=Swap_Bit[PC_2[k]-1];
}
/*
#ifdef DEBUG
printf("\n");
for(i=0;i<16;i++)
{
for(k=0;k<48;k++)
printf("%d",Key_Bit[i][k]);
printf("\n");
}
printf("\n");
#endif
*/
for(i=0;i<16;i++)
Bit64To8Byte(Key_Bit[i],key[i]);
/*
#ifdef DEBUG
printf("\n");
for(i=0;i<16;i++)
for(j=0;j<8;j++)
printf("%c",key[i][j]);
printf("\n");
#endif
*/
}
/***********Expand**********/
// Function Name: Expand
// 传入参数: orig(32bits)
// 功能:将传入的32bit扩展为48bit,
// 传出参数:Ex[48](48bits)
// 返回值: void
/********************************/
void DES::Expand(unsigned char *orig,unsigned char Ex[48])
{
int i;
for(i=0;i<48;i++)
Ex[i]=orig[E[i]-1];
}
/***********Bit64To32Bit**********/
// Function Name: Bit64To32Bit
// 传入参数: Bit64
// 功能:将传入的64bit均分为8bit,
// 把高4位截去(eg:00001011=>1011)
// 传出参数:Bit32
// 返回值: void
/********************************/
void DES::Bit64To32Bit(unsigned char *Bit64,unsigned char *Bit32)
{
int i;
for(i=0;i<8;i++)
memcpy(Bit32+i*4,Bit64+i*8+4,4);
}
/***********S_Box**********/
// Function Name: S_Box
// 传入参数: Ex[48]
// 功能:将传入的48bits,经过S盒压缩替换为32bits
// 传出参数:S_Bit[32]
// 返回值: void
/********************************/
void DES::S_Box(unsigned char Ex[48],unsigned char S_Bit[32])
{
int i,j;
unsigned char row=0,col=0;
unsigned char s_tmp[8];
unsigned char tmp[6];
unsigned char RowCol_Bit[64];
unsigned char RowCol_Byte[8];
//unsigned char Result[32];
memset(tmp,0,6);
memset(s_tmp,0,8);
for(i=0;i<8;i++)
{
memset(RowCol_Bit,0,64);
memset(RowCol_Byte,0,8);
memcpy(tmp,Ex+6*i,6);
RowCol_Bit[6]=tmp[0];
RowCol_Bit[7]=tmp[5];
//取头尾2位组成S盒的行
Bit64To8Byte(RowCol_Bit,RowCol_Byte);
row=RowCol_Byte[0];
memset(RowCol_Bit,0,16);
memcpy(RowCol_Bit+4,tmp+1,4);
//取中间4位组成S盒的列
Bit64To8Byte(RowCol_Bit,RowCol_Byte);
col=RowCol_Byte[0];
//由行和列查对应的S盒
switch(i)
{
case 0:
s_tmp[i]=S1[row][col];
break;
case 1:
s_tmp[i]=S2[row][col];
break;
case 2:
s_tmp[i]=S3[row][col];
break;
case 3:
s_tmp[i]=S4[row][col];
break;
case 4:
s_tmp[i]=S5[row][col];
break;
case 5:
s_tmp[i]=S6[row][col];
break;
case 6:
s_tmp[i]=S7[row][col];
break;
case 7:
s_tmp[i]=S8[row][col];
break;
}
}
memset(RowCol_Bit,0,64);
Byte8To64Bit(s_tmp,RowCol_Bit);
/*
#ifdef DEBUG
printf("\n S_R Bit:\n");
for(i=0;i<63;i++)
printf("%d",RowCol_Bit[i]);
printf("\n");
#endif
*/
Bit64To32Bit(RowCol_Bit,S_Bit);//clean high 4bit(0000)
}
void DES::Encode(unsigned char orig_str[8],unsigned char orig_pass[8],unsigned char encode_str[8])
{
unsigned char KEY[16][8];//48 bit(6byte)密码
unsigned char Origo_Bit[64];
unsigned char Swap_Bit[64];
unsigned char LBit[64],RBit[64];
unsigned char LBYTE[17][8],RBYTE[17][8];
unsigned char tmpByte[8];
unsigned char Ex_Bit[64],SBOX_Bit[32];
unsigned char Pass_Bit[64];
int i,j;
memset(Origo_Bit,0,64);
memset(Swap_Bit,0,64);
memset(LBit,0,sizeof(LBit));
memset(LBYTE,0,sizeof(LBYTE));
memset(RBYTE,0,sizeof(RBYTE));
memset(tmpByte,0,8);
//get key
BuildKey(orig_pass,KEY);
Byte8To64Bit(orig_str,Origo_Bit);
//ip swap
for(i=0;i<64;i++)
Swap_Bit[i]=Origo_Bit[IP[i]-1];
//将IP排列后的64bit一分为二,RBYTE=4byte,LBYTE=4BYTE;
Bit64To8Byte(Swap_Bit,tmpByte);
/*
#ifdef DEBUG
printf("\n Ip swap later:\n");
for(i=0;i<8;i++)
printf("%c",tmpByte[i]);
printf("\n");
#endif
*/
memcpy(LBYTE[0],tmpByte,4);
memcpy(RBYTE[0],tmpByte+4,4);
//进行16次乘积变换()
for(i=0;i<16;i++)
{
memcpy(LBYTE[i+1],RBYTE[i],4);//L(i)=R(i-1)
memset(tmpByte,0,8);
memset(RBit,0,sizeof(RBit));
Byte8To64Bit(RBYTE[i],RBit);
/*
#ifdef DEBUG
printf("\nRBit:\n");
for(j=0;j<64;j++)
printf("%d",RBit[j]);
printf("\n");
#endif */
memset(Ex_Bit,0,64);
Expand(RBit,Ex_Bit);
memset(RBYTE[i],0,8);
Bit64To8Byte(Ex_Bit,RBYTE[i]);
/*
#ifdef DEBUG
printf("\n Expand RBYTE[%d] :",i);
for(j=0;j<8;j++)
printf("%c",tmpByte[j]);
printf("\n");
#endif */
//xor R0(48bit) XOR KEY[i]
memset(Ex_Bit,0,64);
for(j=0;j<6;j++)
RBYTE[i][j] ^= KEY[i][j];
Byte8To64Bit(RBYTE[i],Ex_Bit);
/*
#ifdef DEBUG
printf("\n Ex_Bit:\n");
for(j=0;j<64;j++)
printf("%d",Ex_Bit[j]);
printf("\n");
#endif
#ifdef DEBUG
printf("\n KEY[%d]:",i);
for(j=0;j<8;j++)
printf("%c",KEY[i][j]);
printf("\n RBYTE0: ");
for(j=0;j<8;j++)
printf("%c",RBYTE[0][j]);
printf("\n");
#endif*/
memset(SBOX_Bit,0,32);
S_Box(Ex_Bit,SBOX_Bit);
memset(RBit,0,64);
for(j=0;j<32;j++)
RBit[j]=SBOX_Bit[P[j]-1];//p排列
/*
#ifdef DEBUG
printf("\n RBIT:\n");
for(j=0;j<32;j++)
printf("%d",RBit[j]);
printf("\n");
#endif
*/ memset(RBYTE[i],0,8);
Bit64To8Byte(RBit,RBYTE[i]);
//32bit == 4 byte
for(j=0;j<4;j++)
RBYTE[i+1][j]=LBYTE[i][j] ^ RBYTE[i][j];
/*
#ifdef DEBUG
printf("\n RBYTE[%d]: ",i);
for(j=0;j<4;j++)
printf("%c",RBYTE[i][j]);
printf(" LBYTE[%d]",i);
for(j=0;j<4;j++)
printf("%c",LBYTE[i][j]);
//printf("\n");
#endif
*/
}
memset(tmpByte,0,8);
memcpy(tmpByte,RBYTE[16],4);
memcpy(tmpByte+4,LBYTE[16],4);
/*
printf("\n tmpByte:");
for(j=0;j<8;j++)
printf("%c",tmpByte[j]);
printf("\n");*/
memset(Swap_Bit,0,64);
Byte8To64Bit(tmpByte,Swap_Bit);
memset(Pass_Bit,0,64);
for(i=0;i<64;i++)
Pass_Bit[i]=Swap_Bit[IP_1[i]-1];
Bit64To8Byte(Pass_Bit,encode_str);
}
void DES::Uncode(unsigned char orig_str[8],unsigned char orig_pass[8],unsigned char uncode_str[8])
{
unsigned char KEY[16][8];//48 bit(6byte)密码
unsigned char Origo_Bit[64];
unsigned char Swap_Bit[64];
unsigned char LBit[64],RBit[64];
unsigned char LBYTE[17][8],RBYTE[17][8];
unsigned char tmpByte[8];
unsigned char Ex_Bit[64],SBOX_Bit[32];
unsigned char Pass_Bit[64];
int i,j;
memset(Origo_Bit,0,64);
memset(Swap_Bit,0,64);
memset(LBit,0,sizeof(LBit));
memset(LBYTE,0,sizeof(LBYTE));
memset(RBYTE,0,sizeof(RBYTE));
memset(tmpByte,0,8);
//get key
BuildKey(orig_pass,KEY);
Byte8To64Bit(orig_str,Origo_Bit);
//ip swap
for(i=0;i<64;i++)
Swap_Bit[i]=Origo_Bit[IP[i]-1];
//将IP排列后的64bit一分为二,RBYTE=4byte,LBYTE=4BYTE;
Bit64To8Byte(Swap_Bit,tmpByte);
memcpy(RBYTE[16],tmpByte,4);
memcpy(LBYTE[16],tmpByte+4,4);
//进行16次乘积变换()
for(i=16;i>0;i--)
{
memcpy(RBYTE[i-1],LBYTE[i],4);//R(i-1)=L(i)
memset(tmpByte,0,8);
memset(LBit,0,sizeof(LBit));
Byte8To64Bit(LBYTE[i],LBit);
memset(Ex_Bit,0,64);
Expand(LBit,Ex_Bit);
memset(LBYTE[i],0,8);
Bit64To8Byte(Ex_Bit,LBYTE[i]);
//xor R0(48bit) XOR KEY[i]
memset(Ex_Bit,0,64);
for(j=0;j<6;j++)
LBYTE[i][j] ^= KEY[i-1][j];
Byte8To64Bit(LBYTE[i],Ex_Bit);
memset(SBOX_Bit,0,32);
S_Box(Ex_Bit,SBOX_Bit);
memset(LBit,0,64);
for(j=0;j<32;j++)
LBit[j]=SBOX_Bit[P[j]-1];//p排列
memset(LBYTE[i],0,8);
Bit64To8Byte(LBit,LBYTE[i]);
//32bit == 4 byte
for(j=0;j<4;j++)
LBYTE[i-1][j]=RBYTE[i][j] ^ LBYTE[i][j];
}
memset(tmpByte,0,8);
memcpy(tmpByte,LBYTE[0],4);
memcpy(tmpByte+4,RBYTE[0],4);
memset(Swap_Bit,0,64);
Byte8To64Bit(tmpByte,Swap_Bit);
memset(Pass_Bit,0,64);
for(i=0;i<64;i++)
Pass_Bit[i]=Swap_Bit[IP_1[i]-1];
Bit64To8Byte(Pass_Bit,uncode_str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -