#ring #signature #public-key #crypto #blsag

no-std orodruin

基于 Ristretto 曲线的安全 Rust Monero 类 bLSAG 环签名

1 个不稳定版本

0.1.0 2024 年 6 月 28 日

#1318 in 密码学

AGPL-3.0-only

26KB
485

Orodruin

基于 Ristretto 曲线的安全 Rust Monero 类 bLSAG 环签名,如《从零到 Monero》所述。

环签名

"环"是一组公钥。环签名是一种只能由环成员伪造的签名,虽然你可以验证其真实性,但你不能确定是哪个成员伪造的。

此 crate 实现了 bLSAG,这是一种环签名,可以证明由同一密钥发出的不同签名是相互关联的(而不破坏匿名性)。你可能想使用一次性密钥来避免可链接性。

典型应用是匿名投票系统和匿名交易(例如 Monero)。

解释和正确性证明见这篇简短的文章

特性

  • 签名(功能 alloc
  • 验证(no-std)
  • 泛型,用于实现 digest::Digest 的加密 512 位哈希器(例如 sha2)(功能 digest
  • 实现 blake2b-simd(功能 blake2b
  • 你可以轻松实现其他哈希器
  • 不保证 恒定时间操作。

示例

use orodruin::*;

let mut rng = rand::thread_rng();
let mut hasher = sha2::Sha512::default();

let secret_keys: Vec<SecretKey> = (0..4).map(|_| SecretKey::random(&mut rng)).collect();
let ring: Vec<PublicKey> = secret_keys.iter().map(SecretKey::public_key).collect();

for (i, secret_key) in secret_keys.into_iter().enumerate() {
	let message = i.to_be_bytes();
	let signature = sign(secret_key, &ring, i, &message, &mut rng, &mut hasher);
	assert_eq!(signature.verify(ring.iter(), &message, &mut hasher), Ok(()));
}

免责声明

我是一个学生,在密码学和计算机安全领域(截至 2024 年),但 我不是椭圆曲线方面的专家,也没有为这个算法做过安全性证明。此 crate 尚未 经过专家审查。使用风险自负。

名称

指环王 中,奥罗杜因是力量之戒被锻造和毁灭的火山。由于 crate Nazgul 的实现细节是受其启发的,我们保持了这一主题。

许可证

通过 LiberaPay 支持我

GNU AGPL v3,版权所有 2024 Pascal Engélibert (为什么是 copyleft?)

所有权利归 Axiom-Team(法国协会法律 1901)所有。

实现细节受 nazgul 启发。

本程序是自由软件:您可以在自由软件基金会发布的 GNU Affero 通用公共许可证的条款下重新分发和/或修改它,许可证版本为 3。
本程序按原样分发,不提供任何保证;甚至没有对适销性和特定用途适用性的暗示保证。有关详细信息,请参阅 GNU Affero 通用公共许可证。
您应该已经收到了与该程序一起的GNU Affero General Public License副本。如果没有,请参阅https://gnu.ac.cn/licenses/

依赖项

~1.5–2.3MB
~50K SLoC