1个不稳定版本
0.7.0 | 2023年12月14日 |
---|
#1770 在 密码学 中
用于 armour
27KB
464 行
Bromberg-Shpilrain-Vdovina SL₂同态散列
这是Bromberg, Shpilrain, 和 Vdovina在论文《在SL₂(𝔽ₚ)的凯莱图中的导航》中提出的Tillich-Zémor风格散列函数的实现。
警告
此模块不是由密码学专家制作的,而是由某个普通人制作的。此外,该算法于2017年发布,本身并没有经过实战检验。只有在你(a)了解你所做的事情并已阅读并理解了我们的代码,以及/或者(b)你正在构建不依赖于散列函数加密特性的东西时,才应使用此库。
如果你是密码学专家,我们欢迎任何错误报告或拉取请求!如果你不是密码学专家,我们也欢迎它们;这个库相当简单,应该很容易在手里拿着上面链接的论文边喝咖啡边理解。
这个库是用来做什么的?
此库实现了一个假设上强大的散列函数H,它具有有用的性质,即它提供了一个幺半群同态。这意味着有一个便宜的操作 *
,对于给定的字符串 s1
和 s2
,H(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