2015-10-18 45 views
1

我已被告知要使用的一个Siphash键SipHash24密钥 “太大,其类型为”

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 
+0

我们不知道你正在使用哪个库,包含这些类型或功能。 –

+0

OpenBSD中的SipHash24 - 我的错误http://www.openbsd.org/cgi-bin/man.cgi?query=SipHash24 – jnd

+2

您需要使用一个16字节的数组或两个64位整数中的一个。可能是前者。 C的大多数实现中没有128位的整数类型,比如'byte key [] = {0x24,0x64,0x6d,...}'。或者,您可以将其存储为十六进制字符串,并使用[C中的十六进制字符串到字节数组]的答案之一(http://stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in- c)将其转换为原始字节。 – CodesInChaos

回答

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>库这里将长字节内的字节翻转为k0和​​应该被编码为小端值。

+1

您的答案将值视为Big Endian。我怀疑你需要重新排列每个整数中的字节。 – CodesInChaos

相关问题