QCryptographicHash - 实际上SHA3在这里是什么?

时间:2017-03-28 07:33:11

标签: qt cryptography sha-3 keccak

我得到了这样一段代码:

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,我们如何知道?

2 个答案:

答案 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中修复了