⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.cpp

📁 单钥密码算法 AES DES IDEA LZW RC5
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -