TupleHash:一项NIST标准

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

TupleHash:一个 NIST 标准

认识 Zig 实现

在数学中,元组是一种用值的有序列表来表示值的方式——并且是不可变的。因此,让我们看看 TupleHash 的概念,并应用这个概念。

几十年来,NIST 一直在推动密码学标准,现在正在展望未来,发布了一份题为“加密算法和密钥长度的转换使用”的草案[这里]:

在这份文档中,NIST 批准在哈希方法中使用 TupleHash 和 ParallelHash:

TupleHash 为字节字符串的元组生成一个可变长度的哈希函数,并保留每个字符串的语义。它使用 SHA-3 作为其基础,并在 NIST SP 800–185 中标准化。总的来说,它可以使用 128 位和 256 位版本。

TupleHash

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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
asecuritysite
asecuritysite
江湖只有他的大名,没有他的介绍。