2016-07-03 102 views
0

我正在教我自己c与我已购买的一些教科书。一般来说,这很容易,但是我不太容易理解的一个这样的领域涉及位操作。我理解字面(孤立)意义上的操作符的使用,但不是它们如何应用于下面的特定上下文中。c - 解密中的位操作/操作

下面有2个这样的例子,我没有能够掌握他们在一些解密算法中如何/做些什么。

所有即时通讯寻找的是一个解释什么是十六进制和位移/左右将一起做。

我一直在网上查看的大多数例子都是孤立的,至今尚未陷入这种情况如何应用。

如果有任何人都可以推荐的位操作/操作的教科书,我也愿意投资于这些信息。这是我的决心,真的要指出这一点(我讨厌继续前进,没有完全掌握一些东西)。

  unsigned long lBits = 0; 
      lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)| 
      ((unsigned long)(key[29] & 0xFFFF)<< 16)| 
      ((unsigned long)(key[30] & 0xFFFF)<< 8)| 
      ((unsigned long)(key[31] & 0xFFFF)); 

    ... 

    for(i=0; i < max_length ; i++){ 
    unsigned long tBits = lBits | i;  
    tkey[28] = (unsigned char) (tBits >> 24); 
    tkey[29] = (unsigned char) (tBits >> 16); 
    tkey[30] = (unsigned char) (tBits >> 8); 
    tkey[31] = (unsigned char) (tBits); 
+0

你还没有提供'key'和'tkey'声明。 – owacoder

+0

是的,我期待削减我发布的代码量,因为这个例子很长。 key是通过作为32位密钥的一部分的命令行传入的char数组arg,tkey是用0填充以满足32位长度的相同密钥。 – xxdefaultxx

+0

它是一个'unsigned char'数组,还是'char'? – owacoder

回答

1

让我们打破这行由行:

 unsigned long lBits = 0; 
     lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)| 
     ((unsigned long)(key[29] & 0xFFFF)<< 16)| 
     ((unsigned long)(key[30] & 0xFFFF)<< 8)| 
     ((unsigned long)(key[31] & 0xFFFF)); 

这是起初相当混乱。乍一看,它似乎试图读取从key[28]开始的大端32位整数。但是,由于掩码是0xFFFF(16位),而不是典型8位掩码的预期0xFF,所以这不是实际的效果。实际发生的是key的字节实际上被合并为32位长。由于缺乏语境,很难说这应该达到什么程度,确切地说。我猜想它可能会混合密钥的位,形成一个“圆键”或类似的东西。

for(i=0; i < max_length ; i++){ 
    unsigned long tBits = lBits | i;  
    tkey[28] = (unsigned char) (tBits >> 24); 
    tkey[29] = (unsigned char) (tBits >> 16); 
    tkey[30] = (unsigned char) (tBits >> 8); 
    tkey[31] = (unsigned char) (tBits); 

这有点清楚。它只是以大字节格式写tBits | itkey[28]

实际上,这是循环遍历i中的所有位组合并将它们写入从key[28]开始的32位。我认为循环体的其余部分用这些位做了些什么。

+0

感谢您的输入。计数器遍历可能的组合数以填充提供的部分密钥。我真的不明白如何适用于上述。 – xxdefaultxx

+0

argh。抱歉。只是意识到柜台应该是我。我复制不正确。 :( – xxdefaultxx