2016-07-03 78 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