0

我在 C 中实现高级加密标准 (AES)。在 subBytes() 步骤中,我在从 char 转换为二进制时遇到了一些问题。

使用代码:

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 转换为 binary,但其他值则没有。例如,值 67 转换为 01000010 (66)。我看到的唯一模式是奇数转换为偶数二进制数。

谁能发现我做错了什么?

4

2 回答 2

1

8-bitPosition 永远不能为零,但您需要它才能获得最低位。

于 2012-10-31T20:24:43.603 回答
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]))

这是一个ideone。

于 2012-10-31T20:31:59.163 回答