📄 des.cpp
字号:
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L,
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L,
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L,
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L,
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L,
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L };
static unsigned long sp5[64] = {
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L,
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L,
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L,
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L,
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L,
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L,
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L,
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L,
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L,
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L,
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L,
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L,
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L,
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L,
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L,
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L };
static unsigned long sp6[64] = {
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L,
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L,
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L,
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L,
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L,
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L,
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L,
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L,
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L,
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L,
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L,
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L,
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L,
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L,
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L,
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L };
static unsigned long sp7[64] = {
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L,
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L,
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L,
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L,
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L,
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L,
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L,
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L,
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L,
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L,
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L,
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L,
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L,
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L,
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L,
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L };
static unsigned long sp8[64] = {
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L,
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L,
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L,
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L,
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L,
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L,
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L,
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L,
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L,
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L,
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L,
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L,
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L,
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L,
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L,
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L };
/*static void desfunc(block,keys)
register unsigned long *block, *keys;*/
static void desfunc(register unsigned long *block,register unsigned long *keys)
{
register unsigned long fval, work, right, leftt;
register int round;
leftt = block[0]; //64位明文/密文分组其中的32位 Li
right = block[1]; // Ri
//left right调整 使得十六轮的置换可用八轮完成
work = ((leftt >> 4 ) ^ right) & 0x0f0f0f0fL;
right ^= work;
leftt ^= (work << 4);
work = ((leftt >> 16 ) ^ right) & 0x0000ffffL;
right ^= work;
leftt ^= (work << 16);
work = ((right >> 2 ) ^ leftt) & 0x33333333L;
leftt ^= work;
right ^= (work << 2);
work = ((right >> 8 ) ^ leftt) & 0x00ff00ffL;
leftt ^= work;
right ^= (work << 8);
right = ((right << 1) | ((right >>31) & 1L)) & 0xffffffffL;
work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work;
right ^= work;
leftt = ((leftt <<1 ) | ((leftt >>31) & 1L)) & 0xffffffffL;
for( round = 0; round < 8; round++ ) {
work = (right <<28 ) | (right >>4 );
work ^= *keys++; //与子密钥相异结果作为S盒输入
fval = sp7[ work & 0x3fL];//S盒压缩置换
fval |= sp5[(work >> 8 ) & 0x3fL];//S盒经过调整 使得无需扩展变换
fval |= sp3[(work >> 16) & 0x3fL];
fval |= sp1[(work >> 24) & 0x3fL];
work = right ^ *keys++;
fval |= sp8[ work & 0x3fL];
fval |= sp6[(work >> 8 ) & 0x3fL];
fval |= sp4[(work >> 16) & 0x3fL];
fval |= sp2[(work >> 24) & 0x3fL];
leftt ^=fval;
work = (leftt << 28 ) | ( leftt >> 4 );
work ^= *keys++;
fval = sp7[ work & 0x3fL];
fval |= sp5[(work >> 8 ) & 0x3fL];
fval |= sp3[(work >> 16) & 0x3fL];
fval |= sp1[(work >> 24) & 0x3fL];
work = leftt ^ *keys++;
fval |= sp8[ work & 0x3fL];
fval |= sp6[(work >> 8 ) & 0x3fL];
fval |= sp4[(work >> 16) & 0x3fL];
fval |= sp2[(work >> 24) & 0x3fL];
right ^=fval;
}
right = ( right << 31 ) | ( right >> 1 );
work = ( leftt ^ right ) & 0xaaaaaaaaL;
leftt ^= work;
right ^= work;
leftt = ( leftt << 31 ) | ( leftt >> 1 );
work = ((leftt >> 8 ) ^ right ) & 0x00ff00ffL;
right ^= work;
leftt ^= ( work << 8 );
work = ((leftt >> 2 ) ^ right ) & 0x33333333L;
right ^= work;
leftt ^= ( work << 2 );
work = ((right >> 16 ) ^ leftt ) & 0x0000ffffL;
leftt ^= work;
right ^= ( work << 16 );
work = ((right >> 4 ) ^ leftt ) & 0x0f0f0f0fL;
leftt ^= work;
right ^= ( work << 4 );
//调整回复
*block++ = right;
*block = leftt;
return;
}
/* Validation sets:
*
* Single-length key, single-length plaintext
* Key : 0123 4567 89ab cdef
* Plain : 0123 4567 89ab cde7
* Cipher : c957 4425 6a5e d31d
*
************************************************/
/* Produce a key
*
*/
void des_key( des_ctx *dc, unsigned char *key) {
deskey( key, EN0); // produce a key for encrpyt
cpkey(dc->ek); // cp KnL[32] to dc.ek
deskey(key,DE1);
cpkey(dc->dk);
}
/*Encrypt several blocks in ECB mode. Caller is responsible for
short blocks . */
void des_enc(des_ctx *dc, unsigned char *data, int blocks) {
unsigned long work[2];
int i;
unsigned char *cp;
cp = data;
for( i = 0; i<blocks; i++){
scrunch(cp,work);
desfunc(work,dc->ek);
unscrun(work,cp);
cp+=8;
}
}
void des_dec(des_ctx *dc, unsigned char *data, int blocks) {
unsigned long work[2];
int i;
unsigned char *cp;
cp = data;
for( i =0; i<blocks; i++){
scrunch(cp,work);
desfunc(work,dc->dk);
unscrun(work,cp);
cp+=8;
}
};
/*
void main(void){
des_ctx dc;
int i;
unsigned long data[10];
unsigned char *cp;
unsigned char key[8] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};//key
unsigned char x[8] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xe7};//plaintxt
cp = x ;
for( i=0;i<8;i++)
printf("%c",cp[i]); //输出明文
printf("\n");
des_key(&dc,key);//产生子密钥串
des_enc(&dc,cp,1);//加密
printf("Enc(0..7,0..7) = "); //输出密文
for( i=0;i<8;i++)
printf("%02x",((unsigned int) cp[i]&0x00ff));
printf("\n");
des_dec( &dc,cp,1);//解密
for(i =0;i<8;i++)
printf("%c",cp[i]);//输出解密后所得到的信息 与明文对比
printf("\n");
printf("Dec(abve,0..7) = ");//以二进制形式输出解密后信息
for( i=0;i<8;i++)
printf("%02x",((unsigned int) cp[i]&0x00ff));
printf("\n");
cp = (unsigned char * ) data;//测试多个分组的情况
for( i=0;i<10;i++) data[i]=i;
des_enc(&dc,cp,5); //Enc 5 blocks.
for(i = 0; i< 10;i+=2) printf( "Block %01d = %081x %081x.\n",
i/2,data[i],data[i+1]); //二进制输出密文
des_dec(&dc,cp,1);//分块解密
des_dec(&dc,cp+8,4);
for(i =0;i<10;i+=2) printf( "Block %01d =%081x %081x. \n",
i/2,data[i],data[i+1]);//输出解密后所得到的信息0-9 与明文0-9吻合
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -