我得到了这样一段代码:
void SHAPresenter::hashData(QString data)
{
QCryptographicHash* newHash = new QCryptographicHash(QCryptographicHash::Sha3_224);
newHash->addData(data.toUtf8());
QByteArray hashResultByteArray = newHash->result();
setHashedData(QString(hashResultByteArray.toHex()));
delete newHash;
}
根据Qt spec, QCryptographicHash :: Sha3_224 应该"生成SHA3-224哈希值。在Qt 5.1"中引入。我想比较该代码的结果与其他来源的结果,以检查我是否以正确的方式放置数据。我找到了网站:https://emn178.github.io/online-tools/sha3_224.html 所以我们在两种情况下都有SHA3_224。问题是第一个将从" test":
生成这样一个字节串3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e
第二个:
3797bf0afbbfca4a7bbba7602a2b552746876517a7f9b7ce2db0ae7b
完全不相似。但也有一个网站做了" Keccak-224": https://emn178.github.io/online-tools/keccak_224.html
结果是:
3be30a9ff64f34a5861116c5198987ad780165f8366e67aff4760b5e
我知道SHA3基于Keccak的功能 - 但这里的问题是什么?这两种实现中的哪一种以适当的方式遵循NIST FIPS 202,我们如何知道?
答案 0 :(得分:2)
我现在正在为Java编写一个Keccak库,所以我把这些玩具用来测试最初的怀疑。
首先简要总结一下。 Keccak是一个海绵功能,它可以采用许多参数(比特率,容量,域后缀和输出长度)。 SHA-3只是Keccak的一个子集,其中这些值已由NIST选择并标准化(在FIPS PUB 202中)。
在SHA3-224的情况下,参数如下:
bitrate: 1152
capacity: 448
domain suffix: "01"
output length: 224 (hence the name SHA3-224)
需要注意的重要一点是,域后缀是一个位串,它在输入消息之后和填充之前被追加。域后缀是区分Keccak函数的不同应用程序的可选方法(例如SHA3,SHAKE,RawSHAKE等)。所有SHA3功能都使用" 01"作为域名后缀。
根据文档,我得到的结论是Keccak最初没有域后缀概念,Keccak团队提供的已知答案测试要求不使用域后缀。
那么,对你的问题。如果我们采用String" test"并使用ASCII或UTF-8编码将其转换为字节数组(因为Keccak使用二进制编码,因此必须首先将文本转换为字节或位,因此决定使用哪种字符编码很重要)将它提供给一个真正的SHA3-224哈希函数我们将得到以下结果(以十六进制表示,16个字节到一行以便于阅读):
37 97 BF 0A FB BF CA 4A 7B BB A7 60 2A 2B 55 27
46 87 65 17 A7 F9 B7 CE 2D B0 AE 7B
SHA3-224可以概括为Keccak[1152, 448](M || "01", 224)
,其中M || "01"
表示"在输入消息之后和多速率填充之前附加01"。
但是,如果没有域后缀,我们得到Keccak[1152, 448](M, 224)
,其中寂寞M
表示不附加后缀位,并且多速率填充将在输入消息之后立即开始。如果我们提供相同的输入"测试"对于不使用域后缀的Keccak函数的消息,我们得到以下结果(再次以十六进制):
3B E3 0A 9F F6 4F 34 A5 86 11 16 C5 19 89 87 AD
78 01 65 F8 36 6E 67 AF F4 76 0B 5E
因此,此结果表明该函数不是SHA3-224 。
这意味着您所看到的输出差异完全由" 01"的域名后缀的存在与否来解释。 (这是我对你的问题的直接怀疑)。声称是SHA3的任何东西必须使用" 01"域后缀,所以要非常警惕行为不同的工具。仔细检查文档以确保在创建/使用对象或函数时不要求您指定所需的域后缀,但声称为SHA3的任何内容实际上都不应该忘记后缀位。
答案 1 :(得分:1)
这是Qt和reported here中的错误,并在Qt5.9中修复了