本文介绍了NIST(美国国家标准与技术研究院)批准的TupleHash算法,该算法基于SHA-3,用于生成可变长度的哈希值,尤其适用于处理字符串序列,它能区分顺序不同的字符串组合,文章展示了如何在Zig语言中实现TupleHash128和TupleHash256,并通过示例验证了其独特性。

在数学中,元组是一种用值的有序列表来表示值的方式——并且是不可变的。因此,让我们看看 TupleHash 的概念,并应用这个概念。
几十年来,NIST 一直在推动密码学标准,现在正在展望未来,发布了一份题为“加密算法和密钥长度的转换使用”的草案[这里]:

在这份文档中,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,我们会得到:
Tuple(“bob” || “alice”) != Tuple(“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
我们可以使用 Python 中的密码学库来实现 Tuple 哈希[这里]:
const std = @import("std");
const hash = @import("std").crypto.hash;
pub fn main() !void {
var stdout_buffer: [4096]u8 = undefined;
var stdout_writer = std.fs.File.stdout().writer(&stdout_buffer);
const stdout = &stdout_writer.interface;
// Get the command-line arguments
// 获取命令行参数
var m1: []const u8 = undefined;
var m2: []const u8 = undefined;
const args = try std.process.argsAlloc(std.heap.page_allocator);
defer std.process.argsFree(std.heap.page_allocator, args);
// Check if there are any arguments
// 检查是否有任何参数
if (args.len > 1) {
m1 = args[1];
}
if (args.len > 2) {
m2 = args[2];
}
var tuple128 = hash.sha3.TupleHash128.init();
var tuple256 = hash.sha3.TupleHash256.init();
tuple128.update(m1);
tuple128.update(m2);
tuple256.update(m1);
tuple256.update(m2);
var out1: [32]u8 = undefined;
var out2: [64]u8 = undefined;
tuple128.final(&out1);
tuple256.final(&out2);
try stdout.print("\nMessage 1: {s} \n", .{m1});
try stdout.print("Message 2: {s} \n", .{m2});
try stdout.print("\nTuple128: {x} \n", .{out1});
try stdout.print("\nTuple256: {x} \n", .{out2});
try stdout.flush();
}
然后我们可以运行文件 zig_tuple.exe。一个针对“hello”和“123 is”的示例运行[这里]:
Message 1: hello
Message 2: 123
Tuple128: 3938d49ade8ec0f0c305ac63497b2d2e8b2f650714f9667cc41816b1c11ffd20
Tuple256: 2dca563c2882f2ba4f46a441a4c5e13fb97150d1436fe99c7e4e43a2d20d0f1cd3d38483bde4a966930606dfa6c61c4ca6400aeedfb474d1bf0d7f6a70968289
然后为了证明哈希值是不同的,对于“hello1”和“23”,我们得到了不同的输出哈希值[这里]:
Message 1: hello1
Message 2: 23
Tuple128: ed235d3686b59ba8f8ec82189a7d65489e647b053495862f9267ccad9167cdd9
Tuple256: 08df6d3fd7883179b39c7f325738a5a880f134e8fb534a53025d40df213c9129812b77d307614bd243f32930174dad3075e5cb59687eccafad30346a9153d314
这里还有其他的 Zig 实现:
https://asecuritysite.com/zig/
- 原文链接: medium.com/asecuritysite...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!