我试过几个。Python的pyskein;我在某处网上找到的 javascript 绞纱计算器;用于 xkcd 的愚人节漫画的绞纱计算器对于给定的输入都给出相同的输出。
但是当我在这里下载参考 C 源代码的 1.3 版时,我得到了不同的结果。最糟糕的是,我从 C API 获得的结果与源代码附带的“已知答案测试”示例完全匹配,所以我认为我使用它是正确的。
我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include "SHA3api_ref.h"
int main(int argc, const char * argv[])
{
const int BITS = 256; // length of hash in bits
const int LENGTH = 32; // length of data in bits
BitSequence *hashval = calloc(BITS/8, 1);
const BitSequence content[] = {0xC1, 0xEC, 0xFD, 0xFC};
Hash(BITS, content, LENGTH, hashval);
for (int i = 0; i < BITS/8; i++) {
printf("%02X", hashval[i]);
}
return 0;
}
结果十六进制:2638B1711F1346D08BF02B5D1A575CD924140A608512AF5B8E4475632599A896
相同数据上相同哈希的 Python 代码:
import skein
print( skein.skein256(bytes([0xC1, 0xEC, 0xFD, 0xFC])).hexdigest() )
结果十六进制:07e785ce898fa5cfa22e15294481717935923985ea90f67fc65cb5b3cb718190
KAT_MCT/ShortMsgKAT_256.txt
请注意,根据代码随附的文件,C 答案是预期的答案。但是 pyskein 给出的结果似乎其他所有人都同意是正确的。我错过了什么?