gpt4 book ai didi

c - 将 256 位 key 击败为 32 位轮 key 的问题

转载 作者:行者123 更新时间:2023-12-04 10:54:40 24 4
gpt4 key购买 nike

我试图把 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} 用于我的圆形键。但它应该像 {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函数初始化 key struct 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]应包含 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com