📄 des.cpp
字号:
{
if (j==0)
{
if(i==0) pstroutput+=sprintf(pstroutput,"/******************步骤1-2:生成子密钥**************************/\n");
if(i==0)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-1:第%d轮循环左移,左移%d位后:\n",i,i,totRot[i]);
else pstroutput+=sprintf(pstroutput,"步骤1-2-%d-1:第%d轮循环左移累计%d位,在前基础上再左移%d位后:\n",i,i,totRot[i],totRot[i]-totRot[i-1]);
pstroutput+=sprintf(pstroutput,"左28位:\n");
}
pstroutput+=sprintf(pstroutput,"%d", pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28]); //(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
if (j==27) pstroutput+=sprintf(pstroutput,"\n右28位:");
if ((j+1)%7==0) pstroutput+=sprintf(pstroutput," ");
if ((j+1)%28==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
}
} /* end of for j */
if( doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-2:第%d轮循环左移,累计左移%d位后左右合并得:\n",i,i,totRot[i]);
if( doEncrypt)for (j = 0; j < 56; j++)
{
pstroutput+=sprintf(pstroutput,"%d",(j%7+1));
if ((j+1)%7==0) pstroutput+=sprintf(pstroutput," ");
}
if( doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
for (j = 0; j < 56; j++)
{
//循环左移:即用右边(编号大)的位去写左边的(编号小)的位
k = j + totRot[i];/*static const char totRot[] = 1, 2(1+1), 4(1+1+2+2,教材上前面左移几项位数之和), 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28};*/
pcr[j] = pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28];//(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
if( doEncrypt)
{
pstroutput+=sprintf(pstroutput,"%d", pc1m[(k < (j < 28 ? 28 : 56)) ? k : k - 28]); //(j < 28 ? 28 : 56):取28则左半,取56右半,k - 28表示循环移位的
if ((j+1)%7==0) pstroutput+=sprintf(pstroutput," ");
if ((j+1)%56==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
}
} /* end of for j */
/* Rotate left and right halves independently */
if (doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-3:照以下数组进行选位并排序:\n",i);
for (j=0; j<48; j++)//
{
if (doEncrypt)
{// k = j % 6;
pstroutput+=sprintf(pstroutput,"%02d,", pc2[j]);
if ((j+1)%6==0 && doEncrypt) pstroutput+=sprintf(pstroutput,"|");
if ((j+1)%24==0 && doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
}
}
// if (doEncrypt) pstroutput+=sprintf(pstroutput,"\n");
for (j=0; j<48; j++)//
{
/* Select bits individually, check bit that goes to kn[j] */
//默认是所有密钥位都为零,只是要将为1的位重置一下即可。
if (pcr[pc2[j] - 1])//pc2是新的56位重新编号从1到56,pcr数组下标j从0起的,所以-1
{
/* mask it in if it's there */
k = j % 6;//j/6是j/6下取整。每6位写一个字节,共8字节,每字节还有两位没用。
kn[i][j / 6] |= byteBit[k] >> 2;// 0200, 0100, 040, 020, 010, 04, 02, 01 //128,64,32,16,8,4,2,1
} /* end of if *///先右移2位,即左边2位是空着的,k如何也取不到6(32,16,8,4,2,1,0,0)再或操作取位
if ( j==0 && doEncrypt)pstroutput+=sprintf(pstroutput,"步骤1-2-%d-3:第%d轮循环左移累计%d位,压缩置换后得到子钥K%d:\n",i,i,totRot[i],i);
if (doEncrypt)
{ k = j % 6;
pstroutput+=sprintf(pstroutput,"%d", kn[i][j / 6] & (byteBit[k] >> 2) ? 1:0);
if ((j+1)%6==0 && doEncrypt) pstroutput+=sprintf(pstroutput," ");
}
} /* end of j */
if( doEncrypt)pstroutput+=sprintf(pstroutput,"\n");
if(i==15&&doEncrypt) pstroutput+=sprintf(pstroutput,"/******************步骤1结束**************************/\n");
} /* end of for i */
return;
} /* SetKey() */
/************************************************************************
* Function name : Permute
* Description :
* :
* Parameters : inBlock -
* : perm -
* : outBlock -
* Returns : -
* Author : Richard Shen
* ----------------------------------------------------------------------
* Date By Description
* ----------------------------------------------------------------------
* 20Jan99 RCS Created.
************************************************************************/
void Permute(unsigned char *inBlock, char perm[16][16][8],
unsigned char *outBlock
)
{
int i;
int j;
char *p;
char *q;
char *oBlock;
if (perm == NULL)
{
/* No permutation, just copy */
for (i = 8; i != 0; i--)
*outBlock++ = *inBlock++;
return;
} /* end of if */
/* Clear output block */
memset(outBlock, 0, 8);
for (j = 0; j < 16; j += 2)
{
oBlock =(char *) outBlock;
/* For each input nibble and each output byte, OR the masks together */
p = perm[j][(*inBlock >> 4) & 017];
q = perm[j + 1][*inBlock & 017];
for (i = 8; i != 0; i--)
*oBlock++ |= *p++ | *q++;
inBlock++;
} /* end of for j */
return;
} /* Permute() */
/************************************************************************
* Function name : Round
* Description : Do one DES cipher round
* :
* Parameters : num -
* : block -
* Returns : -
* Author : Richard Shen
* ----------------------------------------------------------------------
* Date By Description
* ----------------------------------------------------------------------
* 20Jan99 RCS Created.
************************************************************************/
void Round(int doEncrypt,int num, unsigned long *block)
{
unsigned long temp(0);
//long也是32位,0元素为左,1元素字为右
/* if (num & 1) //从0起点,奇数轮完后,1元素异或后赋给1元素。
block[1] ^= F(doEncrypt,block[0], kn[num]);
else
block[0] ^= F(doEncrypt,block[1], kn[num]);
*/
long Ftemp(0);
int i(0);int j(0);
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07
else pstroutput+=sprintf(pstroutput,"解密步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07
Ftemp=F(doEncrypt,block[1], kn[num]);//调用F函数
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮开始的:block[1]\n",num); if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮开始的:block[1]\n",num);
else pstroutput+=sprintf(pstroutput,"解密第%d轮开始的:block[1]\n",num);
for( i=0;i<4;i++)
{
for(j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
} if (doEncrypt) pstroutput+=sprintf(pstroutput,"第%d轮后的block[0]即处理前的block[1]:\n",num);
for( i=0;i<4;i++)
{
for( j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮前的:block[0]\n",num);
else pstroutput+=sprintf(pstroutput,"解密第%d轮前的:block[0]\n",num);
for( i=0;i<4;i++)
{
for(j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[0]>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮的F(block[1], kn[%d]):\n",num,num);
else pstroutput+=sprintf(pstroutput,"解密第%d轮的F(block[1], kn[%d]):\n",num,num);
for( i=0;i<4;i++)
{
for( j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(Ftemp>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
// if (doEncrypt) pstroutput+=sprintf(pstroutput,"步骤2-2-%d:第%d轮处理开始***************************\n",num,num);//) & 07
temp = block[0]^Ftemp;
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密步骤2-3-%d F值与右半异或,互换:第%d轮的F(block[1], kn[%d])^block[0]且赋给block[1]:\n",num,num,num);
else pstroutput+=sprintf(pstroutput,"解密步骤2-3-%d F值与右半异或,互换:第%d轮的F(block[1], kn[%d])^block[0]且赋给block[1]:\n",num,num,num);
for( i=0;i<4;i++)
{
for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(temp>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
block[0]=block[1];
block[1]=temp;
if (doEncrypt) pstroutput+=sprintf(pstroutput,"加密第%d轮后结果:\n",num);
else pstroutput+=sprintf(pstroutput,"解密第%d轮后结果:\n",num);
for(i=0;i<4;i++)
{
for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[0]>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
for(i=0;i<4;i++)
{
for(int j=0;j<8;j++)pstroutput+=sprintf(pstroutput,"%u",(block[1]>>(3-i)*8 & byteBit[j]) ? 1:0);
pstroutput+=sprintf(pstroutput," ");//8位一制表符
if ((i+1)%4==0) pstroutput+=sprintf(pstroutput,"\n");
}
return;
} /* Round() */
/************************************************************************
* Function name : F
* Description : The nonlinear function F(r, k), the heart of DES
* :
* Parameters : r -
* : subKey -
* Returns : ...
* Author : Richard Shen
* ----------------------------------------------------------------------
* Date By Description
* ----------------------------------------------------------------------
* 20Jan99 RCS Created.
************************************************************************/
//F函数处理
long F(int doEncrypt,unsigned long r, unsigned char subKey[8])
{
unsigned long rVal, rt;
/*
Run E(R) ^ K through the combined S & P boxes
This code takes advantage of a convenient regularity in
E, namely that each group of 6 bits in E(R) feeding
a single S-box is a contiguous segment of R.
*/
unsigned long rt0,rt1;
//相当于循环右移1位
rt0 = (r >> 1) | ((r & 1) ? 0x80000000 : 0);//((r & 1) ? 0x80000000 : 0)取出第32位 >>左补0
//相当于循环左移1位,r始终未变
rt1 = (r << 1) | ((r & 0x80000000) ? 1 : 0);
if (doEncrypt) {
pstroutput+=sprintf(pstroutput,"加密步骤F处理-A右半扩展:Right Half (循环右移花接1位后)扩展后r的48位明文:\n");//) & 07
for(int i=0;i<48;i++){
if(i/6==7) pstroutput+=sprintf(pstroutput,"%d", rt1 & (byteBit[i%6+2 ]) ? 1:0);//最后6位
else pstroutput+=sprintf(pstroutput,"%d", rt0 >> 26-i/6*4 & (byteBit[i%6+2]) ? 1:0);//前面7个6位
if ((i%6+1)%4==0) pstroutput+=sprintf(pstroutput," ");
if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
}
}
else {
pstroutput+=sprintf(pstroutput,"解密步骤F处理-A右半扩展:Right Half 扩展后r的48位明文:\n");//) & 07
for(int i=0;i<48;i++){
if(i/6==7) pstroutput+=sprintf(pstroutput,"%d", rt1 & (byteBit[i%6+2 ]) ? 1:0);//最后6位
else pstroutput+=sprintf(pstroutput,"%d", rt0 >> 26-i/6*4 & (byteBit[i%6+2]) ? 1:0);//前面7个6位
if ((i%6+1)%4==0) pstroutput+=sprintf(pstroutput," ");
if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
}
}
rVal = 0;
unsigned long val(0);
unsigned long rValtwx[8]={0};
unsigned char tempSubKeyByte;
unsigned long XorValue(0),rowCol(0);
// tempSubKeyByte=*subKey++;
// rVal |= sp[0][((rt0 >> 26) ^ tempSubKeyByte) & 0x3f];//& 0x3f:仅取6位
/* rValtwx[0]= sp[0][((rt0 >> 26) ^ *subKey++) & 0x3f];
rValtwx[1]= sp[1][((rt0 >> 22) ^ *subKey++) & 0x3f];
rValtwx[2]= sp[2][((rt0 >> 18) ^ *subKey++) & 0x3f];
rValtwx[3]= sp[3][((rt0 >> 14) ^ *subKey++) & 0x3f];
rValtwx[4]= sp[4][((rt0 >> 10) ^ *subKey++) & 0x3f];
rValtwx[5]= sp[5][((rt0 >> 6) ^ *subKey++) & 0x3f];
rValtwx[6]= sp[6][((rt0 >> 2) ^ *subKey++) & 0x3f];
rValtwx[7]= sp[7][(rt1 ^ *subKey) & 0x3f];
*/
for(int KeyByte=0; KeyByte<8;KeyByte++)
{
if (doEncrypt)
{
pstroutput+=sprintf(pstroutput,"加密步骤F处理B:密钥字节的F处理...........\n");//) & 07
pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-1:第%d个6位密钥:",KeyByte,KeyByte);//) & 07
for(int i=0;i<6;i++)
{
pstroutput+=sprintf(pstroutput,"%d", subKey[KeyByte] & (byteBit[i%6+2 ]) ? 1:0);
if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
}
pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-1:第%d个6位数据:",KeyByte,KeyByte);//) & 07
for( i=0;i<6;i++)
{
if(KeyByte<7) pstroutput+=sprintf(pstroutput,"%d", rt0 >> (26-KeyByte*4) & (byteBit[i%6+2 ]) ? 1:0);
else pstroutput+=sprintf(pstroutput,"%d", rt1 & (byteBit[i%6+2 ]) ? 1:0);
if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
}
pstroutput+=sprintf(pstroutput,"加密步骤F处理B-%d-2:第%d次异或6位:",KeyByte,KeyByte);//) & 07
for(i=0;i<6;i++)
{
if(KeyByte<7) pstroutput+=sprintf(pstroutput,"%d", (rt0 >> (26-KeyByte*4) ^ subKey[KeyByte]) & (byteBit[i%6+2 ]) ? 1:0);
else pstroutput+=sprintf(pstroutput,"%d", (rt1 ^ subKey[KeyByte]) & (byteBit[i%6+2 ]) ? 1:0);
if ((i+1)%6==0) pstroutput+=sprintf(pstroutput,"\n");
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -