初めて構造体ポインターを使用していますが、ここで何が起こっているのか理解できないようです。私のテストは、x ^ y ^ y = x という xor の基本的なプロパティを適用しますが、C では適用されませんか?
以下のコードは私のメインプログラムにあり、「テスト」のすべての文字を正確に復元します(画面に印刷しますが、この質問を短くするために多くのがらくたを省略しました(er))。構造体「aes」は、次の定義を参照しています。
typedef uint32_t word;
struct aes {
word iv[4];
word key[8];
word state[4];
word schedule[56];
};
コンテキストが示唆するように、カプセル化プロジェクトは AES 実装です (新しい手法を試して現在のプロジェクトを高速化しようとしています)。
私のテストでは、問題の関数であっても make_string と make_state は確実に機能しますが、参考のために:
void make_string (word in[], char out[]) {
for (int i = 0; i < 4; i++) {
out[(i * 4) + 0] = (char) (in[i] >> 24);
out[(i * 4) + 1] = (char) (in[i] >> 16);
out[(i * 4) + 2] = (char) (in[i] >> 8);
out[(i * 4) + 3] = (char) (in[i] );
}
}
void make_state(word out[], char in[]) {
for (int i = 0; i < 4; i++) {
out[i] = (word) (in[(i * 4) + 0] << 24) ^
(word) (in[(i * 4) + 1] << 16) ^
(word) (in[(i * 4) + 2] << 8) ^
(word) (in[(i * 4) + 3] );
}
}
とにかく、これが機能するブロックです。関数に格納してモジュール化しようとしているのは、この機能です。
char test[16] = {
'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p'
};
aes cipher;
struct aes * work;
work = &cipher;
make_state(work->state, test);
work->state[0] ^= 0xbc6378cd;
work->state[0] ^= 0xbc6378cd;
make_string(work->state, test);
このコードは機能しますが、関数に渡して同じことを行うと、次のようにはなりません。
void encipher_block (struct aes * work, char in[]) {
make_state(work->state, in);
work->state[0] ^= 0xff00cd00;
make_string(work->state, in);
}
void decipher_block (struct aes * work, char in[]) {
make_state(work->state, in);
work->state[0] ^= 0xff00cd00;
make_string(work->state, in);
}
それでも、暗号化と復号化の両方で make_state と make_string 呼び出しを削除することで、期待どおりに機能します!
make_state(work->state, test);
encipher_block(&cipher, test);
decipher_block(&cipher, test);
make_string(work->state, test);
明確にするために、私は問題を抱えていません!この振る舞いを理解したいだけです。