2012-10-31 62 views
0

我在C中實現高級加密標準(AES)。在subBytes()步驟期間,我在從char轉換爲二進制時遇到了一些問題。在C中實現AES時的奇怪行爲(將char轉換爲bin)

隨着代碼:

void subBytes(unsigned char* state) { 
    int i=0; 
    for(; i<=127; i++) { 

     printf("%d",getBitState(state, i)); 

     if(i%32==0){printf("\n");} 
     else if(i%8==0) {printf(",");} 
    } 
    printf("\n"); 
} 

int getBitState(unsigned char* state, int i) { 

    int bytePosition = i/8; 
    int bitPosition = i%8; 
    unsigned char byteValue = state[bytePosition]; 

    return (byteValue >> (8-bitPosition)) & 1; 
} 

如果狀態矩陣爲:

50, 67, 246, 168, 
136, 90, 48, 141, 
49, 49, 152, 162, 
224, 55, 7, 52, 

輸出是:

00110010,01000010,11110110,10101000 

10001000,01011010,00110000,10001100 

00110000,00110000,10011000,10100010 

11100000,00110110,00000110,0011010 

所以,你可以看到,一些值遠從字符轉換爲二進制,但其他人不。例如,值67轉換爲01000010(66)。 我看到的唯一模式是奇數在二進制數中轉換。

任何人都可以發現我做錯了什麼嗎?

+4

我希望這是強制t爲樂趣。請不要在生產中使用自行實施的加密。有經過認證的實現已經正確實施。 –

+0

我正要說同樣的話。 [OpenSSL](http://www.openssl.org/)是現成的加密庫的流行選擇。 – Thomas

+0

是的,我知道..只是爲了好玩(:: – gpestana

回答

1

你getBitState功能可降低到以下內容:

int getBitState(unsigned char* state, int i) 
{ 
    return !!((0x80 >> (i & 7)) & state[i >> 3]); 
} 

雙砰轉換任何非零值到1。

可替換地,因爲這是加密和速度是一個問題,使用宏:

#define GETBITSTATE(state, i) (!!((0x80 >> (i & 7)) & state[i >> 3])) 

Here's an ideone.

1

8位位置永遠不能爲零,但你需要它來獲得最低位。