我第一次使用结构指针,我似乎无法理解这里发生的事情。我的测试应用了 xor 的基本属性,即 x ^ y ^ y = x,但不是在 C 中?
下面的代码在我的主程序中,并准确地恢复了“test”的所有字母(我继续在屏幕上打印,但我省略了很多垃圾,以保持这个问题简短(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);
}
然而,通过删除 encipher 和 decipher 中的 make_state 和 make_string 调用,它可以按预期工作!
make_state(work->state, test);
encipher_block(&cipher, test);
decipher_block(&cipher, test);
make_string(work->state, test);
所以澄清一下,我没有问题!我只是想了解这种行为。