我正在在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位点永远不会为零,但是您需要它才能获得底部。