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 進数に変換されることです。
誰かが私が間違っていることを見つけることができますか?