我正在尝试将 key 打成圆形 key 。 我使用结构来保存 key :
struct key
{
u_int64_t key[4];
u_int32_t round_keys[8];
};
使用 func 初始化结构体值:
struct key *set_key()
{
struct key *key = malloc(sizeof(*key));
memset(key, 0, 4 * sizeof(u_int64_t) + 8 * sizeof(u_int32_t));
key->key[0] = 0x1;
key->key[1] = 0x1;
key->key[2] = 0x1;
key->key[3] = 0x1;
return key;
};
并使用 func 将键打成圆形键:
void key_to_round_keys(struct key *key)
{
memcpy(key->round_keys, key->key, sizeof(u_int32_t));
memcpy(key->round_keys + sizeof(u_int32_t), key->key + sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 2 * sizeof(u_int32_t), key->key + 2 * sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 3 * sizeof(u_int32_t), key->key + 3 * sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 4 * sizeof(u_int32_t), key->key + 4 * sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 5 * sizeof(u_int32_t), key->key + 5 * sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 6 * sizeof(u_int32_t), key->key + 6 * sizeof(u_int32_t), sizeof(u_int32_t));
memcpy(key->round_keys + 7 * sizeof(u_int32_t), key->key + 7 * sizeof(u_int32_t), sizeof(u_int32_t));
};
我的主要功能是
int main() {
struct key *key = set_key();
key_to_round_keys(key);
printf("Key[1]: %llu\nRound key 1: %d", key->key[0], key->round_keys[0]);
delete_key(key);
}
问题是,在将 key 打入圆形 key 的过程中,我得到了值 {1, 0, 0, 0, 1, 0, 0, 0} 为我的圆形 key 。但它应该类似于 {0, 1, 0, 1, 0, 1, 0, 1}。 为什么会这样?
最佳答案
key_to_round_keys
中的指针算术完全错误。对于指针加法,((p) + (i))
相当于 (&((p)[i]))
。
假设您的系统上的 sizeof(u_int32_t)
为 4(这很可能),那么:
memcpy(key->round_keys + 7 * sizeof(u_int32_t), key->key + 7 * sizeof(u_int32_t), sizeof(u_int32_t));
相当于:
memcpy(&key->round_keys[7 * 4], &key->key[7 * 4], sizeof(u_int32_t));
或者:
memcpy(&key->round_keys[28], &key->key[28], sizeof(u_int32_t));
但是,round_keys
数组成员只有 8 个元素长,而 key
数组成员只有 4 个元素长,因此此 的源和目标>memcpy
调用超出范围。
由于您的 set_key
函数将 struct key
的 key
数组成员初始化为 {1, 1, 1, 1}
(四个 64 位数字),并且您已表示希望使用 key_to_round_keys
函数将其复制到 round_keys
数组成员,如 {0 , 1, 0, 1, 0, 1, 0, 1}
,看来你希望round_keys[0]
包含key[0]的高32位
和 round_keys[1]
包含 key[0]
的低 32 位。或者一般来说,round_keys[2*n]
应该包含key[n]
的高32位,以及round_keys[2*n+1]
code> 应包含 key[n]
的低 32 位。可以按如下方式完成:
void key_to_round_keys(struct key *key)
{
key->round_keys[0] = key->key[0] >> 32;
key->round_keys[1] = key->key[0] & 0xFFFFFFFFu;
key->round_keys[2] = key->key[1] >> 32;
key->round_keys[3] = key->key[1] & 0xFFFFFFFFu;
key->round_keys[4] = key->key[2] >> 32;
key->round_keys[5] = key->key[2] & 0xFFFFFFFFu;
key->round_keys[6] = key->key[3] >> 32;
key->round_keys[7] = key->key[3] & 0xFFFFFFFFu;
};
或者:
void key_to_round_keys(struct key *key)
{
for (int n = 0; n < 4; n++)
{
key->round_keys[2*n] = key->key[n] >> 32;
key->round_keys[2*n+1] = key->key[n] & 0xFFFFFFFFu;
}
};
关于c - 将 256 位 key 打入 32 位轮 key 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59289892/