在C中实现AE时的奇数行为(将char转换为bin)

  • 本文关键字:char 转换 bin 实现 AE c aes
  • 更新时间 :
  • 英文 :


我正在在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转换为二进制,而另一些值则没有。例如,值67在01000010(66)中转换。我看到的唯一模式是,奇数数是在二进制数字中转换的。

有人可以发现我在做什么错吗?

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

这是一个理论家。

8位点永远不会为零,但是您需要它才能获得底部。

最新更新