【问题标题】:SipHash24 Key "too large for its type"SipHash24 键“对于它的类型来说太大了”
【发布时间】:2016-01-16 14:14:25
【问题描述】:

有人告诉我要使用 Siphash 密钥

24 64 6d 71 33 45 30 31 63 2f 6d 69 37 33 9d 19

我正在尝试使用来自OpenBSD 的 SipHash24_Init。

我有以下全局:

const SIPHASH_KEY COMP_SIPHASH_KEY = 0x24646d7133453031632f6d6937339d19;

并且是这样使用的:

SIPHASH_CTX ctx;
SipHash24_Init(&ctx, &COMP_SIPHASH_KEY);

我会发布更多,但它很复杂,我认为它不相关

但是我在定义/声明中得到以下编译器错误:

error: integer constant is too large for its type
error: invalid initializer

【问题讨论】:

  • 我们不知道您使用的是哪个库包含这些类型或函数。
  • OpenBSD 中的 SipHash24 - 我的错 openbsd.org/cgi-bin/man.cgi?query=SipHash24
  • 您需要使用 16 字节的数组或两个 64 位整数之一。大概是前者。在 C 的大多数实现中没有 128 位整数类型。像byte key[] = {0x24, 0x64, 0x6d, ... } 这样的东西。或者,您可以将其存储为十六进制字符串,并使用Hexadecimal String to Byte Array in C 的答案之一将其转换为原始字节。
  • @MaartenBodewes 问题是在不了解库的情况下只能发表一些想法,而不是不知道哪个答案实际上是正确的。

标签: c hash cryptography


【解决方案1】:

所以鉴于我最近在 C 方面的实践有限,我认为你应该这样做:

SIPHASH_CTX ctx;
SIPHASH_KEY key;

key.k0 = bswap_64(0x24646d7133453031);
key.k1 = bswap_64(0x632f6d6937339d19);
SipHash24_Init(&ctx, &key);

SIPHASH_KEY 似乎被定义为

typedef struct {
    uint64_t k0;
    uint64_t k1;
} SIPHASH_KEY;

我在这里使用<byteswap.h> 库来反转长值中的字节,因为k0k1 应该被编码为小端值。

【讨论】:

  • 您的答案将值视为 Big Endian。我怀疑您需要重新排序每个整数中的字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多