您的位置:首页 > 其它

DES加密的一点思考(二)

2009-04-14 00:39 246 查看
  首先声明,对于DES的学习就以此篇日志作为一个暂时的告别。毕竟只要通过学习提升了能力和耐性就行了,网上现成的函数库,工具库还是有一大堆的。



  
// 置换选择表一 (PC-1)
static BYTE bSelSwapTable_1[56] = {
	57, 49, 41, 33, 25, 17,  9,  1, 58, 50, 42, 34, 26, 18, 
	10,  2, 59, 51, 43, 35, 27, 19, 11,  3, 60, 52, 44, 36,
	63, 55, 47, 39, 31, 23, 15,  7, 62, 54, 46, 38, 30, 22,
	14,  6, 61, 53, 45, 37, 29, 21, 13,  5, 28, 20, 12,  4
} ;
        UINT i ;
	BYTE bByteIndex, bBitIndex, bTemp[7] = {0} ;
	for ( i = 0; i < 56; i++ )
	{
		bByteIndex	= ( bSelSwapTable_1[i] - 1 ) / 8 ;
		bBitIndex	= 7 - ( bSelSwapTable_1[i] - 1 ) % 8 ;
		if ( this->bKey[bByteIndex] & bBitMask[bBitIndex] )
			bTemp[i>>3] |= bBitMask[(~i)&7] ;
	}




  知道这段话产生了些什么么?



  这是在DES中产生16组密钥的过程的最开始的步骤。



  使用的那个表就是置换选择表1(PC-1)



  这段代码写得很有意思的。首先得明白UINT的数据的右移运算就是直接的在高位补0,左移就是地位补0。然后每次的(~i)&7其实就是求i对7的补数。



  最最有意思的还是在bTemp[7],经过56次循环后,它就存储了56个bit位的信息。每次的关键就是和不同的bBitMask来按位或运算。



  这让我想起了在《编程之美》书里提及到的,对于一个int的变量,如何存储2个数据不会太大的变量A B?其实就是定义int x。x的高四位来表示A,第四位来表示B就行了。对A的操作之前,把x右移,然后运算完再回复B。对于B的操作同理。



  有点意外的是,没想到刚从书上看到的内容就此应用上了。编程大师的这些风格都一样啊,不同的资料来源,一样的思维火花。这还只是DES里的我抽取出来的一小部分,真的很有意思。我还得加油。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: