#hashing #homomorphic #monoidal #sl2 #tillich-zemor

no-std brsl2

类似于'Bromberg, Shpilrain, 和 Vdovina在“在SL₂(𝔽ₚ)的凯莱图中的导航”中提出的凯莱散列

1个不稳定版本

0.7.0 2023年12月14日

#1770密码学


用于 armour

CC0 许可证

27KB
464

Bromberg-Shpilrain-Vdovina SL₂同态散列

这是Bromberg, Shpilrain, 和 Vdovina在论文《在SL₂(𝔽ₚ)的凯莱图中的导航》中提出的Tillich-Zémor风格散列函数的实现。

警告

此模块不是由密码学专家制作的,而是由某个普通人制作的。此外,该算法于2017年发布,本身并没有经过实战检验。只有在你(a)了解你所做的事情并已阅读并理解了我们的代码,以及/或者(b)你正在构建不依赖于散列函数加密特性的东西时,才应使用此库。

如果你是密码学专家,我们欢迎任何错误报告或拉取请求!如果你不是密码学专家,我们也欢迎它们;这个库相当简单,应该很容易在手里拿着上面链接的论文边喝咖啡边理解。

这个库是用来做什么的?

此库实现了一个假设上强大的散列函数H,它具有有用的性质,即它提供了一个幺半群同态。这意味着有一个便宜的操作 *,对于给定的字符串 s1s2H(s1 ++ s2) = H(s1) * H(s2)

此属性对于某些非常长的字符串可能通过许多不同的路径构建,但你仍然希望能够快速排除不等的字符串的应用特别有用。

它还允许你在获取数据时散列数据的部分,然后在方便的时候合并它们。这允许非常灵活的散列方案。

H还有一些其他酷炫的性质,并在某些有限的但可能有用的意义上“证明安全”。有关详细信息,请参阅Bromberg等人。

如何使用此库

本库提供了构建HashMatrix的方法,使用hash()函数,该函数接收一个字节切片。这些哈希可以进行比较,或者使用to_hex函数序列化为十六进制字符串。

use bromberg_sl2::*;
assert_eq!(
  hash("hello, world! It's fun to hash stuff!".as_ref()).to_hex(),
  "01c5cf590d32654c87228c0d66441b200aec1439e54e724f05cd3c6c260634e565594b61988933e826e9705de22884ce007df0f733a371516ddd4ac9237f7a46");

哈希也可以使用*运算符进行组合。

use bromberg_sl2::*;
assert_eq!(
  hash("hello, ".as_ref()) * hash("world!".as_ref()),
  hash("hello, world!".as_ref())
);

技术细节

我们使用A(2)和B(2)矩阵作为生成器,并使用p = 2^127 - 1作为我们的素数阶,以实现快速的模运算。

我们尚未尝试对库进行严重优化,性能是次要目标。到目前为止,我们的方法大约比SHA3-512快1/3。

我们需要一个架构无关的加密哈希过程,它尊重字符串连接的幺半群同态,并且用低级语言编写。虽然有一些相关算法的实现,例如经典的但已破损的 Tillich-Zémor哈希(来自"使用SL₂进行哈希" ),但是没有一种满足这些需求。

依赖项

~0–270KB