1. 引言
NIST 几十年来一直致力于推动密码学标准的发展,如今,它发布了名为 Transitioning the Use of Cryptographic Algorithms and Key Lengths 的草案,着眼于未来:
在该草案中,NIST批准在哈希方法中使用 TupleHash 和 ParallelHash:
TupleHash:
- 为字节字符串元组生成可变长度的哈希函数,并保留每个字符串的语义。
- 使用 SHA-3 作为基础,并在 NIST SP 800-185 中标准化。
- 总体而言,可使用 128 位和 256 位版本。
TupleHash 专注于创建字符串序列,并尊重其顺序。如果有两个连接的字符串,如“bob”和“alice”,则 SHA-256 将生成相同的哈希值:
SHA-256(“bob” || “alice”) = SHA-256(“bo” || “balice”)
而使用 TupleHash,有:
TupleHash(“bob” || “alice”) != TupleHash(“bo” || “balice”)
如,若有字符串“bob”,“alice”和“eve”,会得到不同的哈希值:
String1=bob, String2=alice, String3=eve
TupleHash128: 718983f6d81800b22d19c34f30dbd8da
TupleHash256: ec5b7f75bb15cd453d317fcce49c56bc
String1=bob, String2=alic, String3=eeve
TupleHash128: f7b9682d52ef43a41811ab7c05e734ac
TupleHash256: f4677ea94c322eb2bbfa3c0b917bcaca
from Crypto.Hash import TupleHash128,TupleHash256
import sys
s1="Test"
s2="01"
s3="02"
l=32
if (len(sys.argv)>1):
s1=str(sys.argv[1])
if (len(sys.argv)>2):
s2=str(sys.argv[2])
if (len(sys.argv)>3):
s3=str(sys.argv[3])
if (len(sys.argv)>4):
l=int(sys.argv[4])
print(f"String1={
s1}, String2={
s2}, String3={
s3}")
hd = TupleHash128.new(digest_bytes=l)
hd.update(s1.encode())
hd.update(s2.encode())
hd.update(s3.encode())
print(f"TupleHash128: {
hd.hexdigest()}")
hd = TupleHash256.new(digest_bytes=l)
hd.update(s1.encode())
hd.update(s2.encode())
hd.update(s3.encode())
print(f"TupleHash256: {
hd.hexdigest()}")
生成32字节哈希结果为:
String1=The quick brown fox jumps over the lazy dog
String2=01
String3=abc
Hash length: 32
TupleHash128: d7bdd3eb5108d3b864efb590aa68cd80f3685eab0d3e3ba584d8f34c1899ca13
TupleHash256: c408773956b5403791d32e8ff96698f4203f57796a77340bbd556784554ab2a2
生成16字节哈希结果为:
String1=The quick brown fox jumps over the lazy dog
String2=01
String3=abc
Hash length: 16
TupleHash128: d58ebc11da494c4c746b0d07e3451af1
TupleHash256: 76257cd0cf06ce920f9dbeb2507c903d
参考资料
[1] Prof Bill Buchanan OBE FRSE 2024年10月博客 TupleHash