0

C で Advanced Encryption Standard (AES) を実装しています。

コードで:

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

ご覧のとおり、一部の値は char からバイナリに適切に変換されますが、他の値はそうではありません。たとえば、値 67 は 01000010 (66) に変換されます。私が見る唯一のパターンは、奇数が偶数の 2 進数に変換されることです。

誰かが私が間違っていることを見つけることができますか?

4

2 に答える 2

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]))

これがイデオネです。

于 2012-10-31T20:31:59.163 に答える
1

8-bitPosition がゼロになることはありませんが、下位ビットを取得するにはゼロである必要があります。

于 2012-10-31T20:24:43.603 に答える