2011-06-29 73 views
1

我正在通過一個小的C文件進行xor解碼,並且遇到了endianness的問題......我有點卡住瞭如何解決它們。這真的是我第一次用C中的按位運算玩這個。用不同的密鑰大小和字節處理異或

如果我使用一個字節的xor鍵並將多個xor編碼值轉換爲uint8_t指針,我的基本代碼就可以正常工作。走每個字節,對着密鑰進行異或運算,然後將結果存儲在解碼的字節數組/緩衝區中,然後將其打印回控制檯。

但是,如果我嘗試一個雙字節異或密鑰,然後endianness開始妨礙。我目前將密鑰放入uint32_t中,因爲我不打算處理大於32位的異或密鑰。在小端系統中,0xc39f的異或密鑰存儲爲0x9fc3。如果我一次播放一個字節,要解碼的字節是big-endian,但如果我嘗試一次播放兩個字節(與xor相同的大小),它們也會翻轉爲little-endian )。

我被誘惑到#include <byteswap.h>,然後致電bswap_32()。但是,雖然這將在小端上起作用,但它對大端端可能會產生相反的影響。我假設我會需要醜陋的#ifdef的只使用bswap_32()小端弧。我認爲,這是一種更便捷的方式。

隨機抽樣字符串:

g e n e r a t e 
67 65 6e 65 72 61 74 65 

Xor 0xc39f 

a4 fa ad fa b1 fe b7 fa 


如果我打回異或編碼的緩衝帶兩個字節(uint16_t)指針,我得到這個(通過一個基本的printf):

0xfaa4 0xfaad 0xfeb1 0xfab7 


然後用4個字節的指針(uint32_t的):

0xfaadfaa4 0xfab7feb1 



我希望針對上述情況,得到的而不是兩個字節指針:

0xa4fa 0xadfa 0xb1fe 0xb7fa 

和四字節指針:

0xa4faadfa 0xb1feb7fa 


思考?



編輯:任何接受者?目前的答案不足以滿足我的需求。

+0

向我們展示你的代碼? –

+0

代碼有點亂,實際上只是嘗試使用'switch'語句來查看我是在處理1,2或4個字節異或鍵,然後在每個「case」塊中適當地循環。 'case 2'和'case 4'的位實際上就是'printf()'調用來轉儲字節並查看endianness如何影響它們。所以真的沒什麼值得發佈。 – Kumba

回答

2

你這得太多,只是把你的XOR密鑰作爲endianless二進制blob,並將其轉換爲性能本地uint32_t

void xor_encrypt_slow(uint8_t *data, size_t len, uint8_t key[4]) 
{ 
    // key is a 4-byte xor key 
    size_t i; 
    for(i = 0; i < len; i++) 
     data[i] ^= key[i % 4]; 
} 

void xor_encrypt_fast(uint8_t *data, size_t len, uint8_t key[4]) 
{ 
    // Convert key to a 32-bit value 
    uint32_t key32 = *(uint32_t *)key; 

    // This assumes that data is aligned on a 4-byte boundary; if not, adjust 
    // accordingly 
    size_t i; 
    for(i = 0; i + 3 < len; i += 4) 
     ((uint32_t *)data)[i] ^= key32; 
    // Handle the remainder, if len is not a multiple of 4 
    for(; i < len; i++) 
     data[i] ^= key[i % 4]; 
} 
+0

密鑰已存儲在uint32_t中,但不作爲指針。具有編碼值的緩衝區與保存解碼值的緩衝區不同。解碼後的緩衝區將是一個uint8_t數組。通過使用一個xor鍵作爲uint32_t,即使它只是一個字節,如何確保每個字節只被一個字節取代,如果你一次做4個字節(如果我是錯了)? – Kumba

+0

我不滿意這個答案。但是,沒有其他人做出貢獻,因此作爲最完整的答案,即使它不能滿足我的問題,也會贏。 – Kumba

0

嘗試使用專門爲此設計的htonl()宏。它代表「十六進制爲網絡長」,並且被定義爲交換(或不交換)字節,以便在通過網絡傳輸它們之前根據需要使結果值變成大端。