2015-10-18 105 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

相關問題