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

no-std bromberg_sl2

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

1个不稳定版本

0.6.0 2021年11月30日
0.5.1 2020年12月28日
0.4.5 2020年12月18日
0.4.2 2020年11月27日
0.1.2 2020年11月26日

#2106加密学

38每月下载量
mergle中使用

CC0许可

25KB
438

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。

我们需要一个与架构无关的加密哈希过程,它是一个单群同态,遵守字符串连接,并使用低级语言编写。虽然有一些相关算法的实现,例如来自“使用SL₂进行哈希”的、备受尊敬但已破损的Tillich-Zémor哈希,但它们都无法满足这些需求。

依赖项

~275–600KB
~13K SLoC