c - 将 256 位 key 打入 32 位轮 key 的问题

标签 c cryptography

我正在尝试将 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 keykey 数组成员初始化为 {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/

相关文章:

c# - Mono 无法将 SHA1 识别为 RSA 签名的哈希算法

c - c 中的 setenv() 不添加我的自定义 bin 目录

c - C 源代码中使用的链接器变量的“ undefined reference ”

c# - 将 4 个字节(从字符串格式)转换为一个 u32。 C 或 C#

c - 在 gcc 编译器的标志中排除 "lib"前缀

algorithm - 如何计算希尔密码算法中的逆 key 矩阵?

linux - 安全删除 Bash 环境变量

c - xcode多个主要方法

c# - 一个项目中的 key 无效错误但在同一解决方案的不同项目中有效

c# - C# 中的非对称加密示例