#ring #signature #crypto

no-std fujisaki_ringsig

Fujisaki-Suzuki 环签名在 Rust 中的实现

5 个版本

0.1.1 2021 年 2 月 22 日
0.1.0 2021 年 2 月 22 日
0.0.3 2017 年 12 月 2 日
0.0.2 2017 年 7 月 3 日
0.0.1 2017 年 6 月 26 日

#2135加密学 分类中

MIT/Apache 许可协议

27KB
512

fujisaki-ringsig

Version Docs Build Status

这是 Eiichiro Fujisaki 和 Koutarou Suzuki 提出的可追踪环签名算法(Traceable Ring Signature algorithm)的实现。此 crate 使用 curve25519-dalek 库。特别是,它使用 ristretto 模块来实现其椭圆曲线实现。

许可协议

以下任一许可协议均可:

由您选择。

警告

此 crate 不应在任何严肃的上下文中使用。它不安全。


lib.rs:

WARNING: THIS CRATE SHOULD NOT BE USED IN ANY SERIOUS CONTEXTS. IT IS NOT SECURE.

这是 Eiichiro Fujisaki 和 Koutarou Suzuki 提出的可追踪环签名算法(Traceable Ring Signature algorithm)的实现。此 crate 使用 curve25519-dalek 库。特别是,它使用 ristretto 模块来实现其椭圆曲线实现。

示例用法

use fujisaki_ringsig::{gen_keypair, sign, trace, verify, Tag, Trace};

let msg1 = b"now that the party is jumping";
let msg2 = b"magnetized by the mic while I kick my juice";
let issue = b"testcase 12345".to_vec();

// Make some keypairs for our ring. Pretend we only have the private key of the first keypair
let (my_privkey, pubkey1) = gen_keypair(&mut rng);
let (_, pubkey2) = gen_keypair(&mut rng);
let (_, pubkey3) = gen_keypair(&mut rng);
let pubkeys = vec![pubkey1.clone(), pubkey2, pubkey3];

// Make the tag corresponding to this issue and ring
let tag = Tag {
    issue,
    pubkeys,
};

// Make two signatures. Sign different messages with the same key and the same tag. This is
// a no-no. We will get caught.
let sig1 = sign(&mut rng, &*msg1, &tag, &my_privkey);
let sig2 = sign(&mut rng, &*msg2, &tag, &my_privkey);

// The signatures are all valid
assert!(verify(&*msg1, &tag, &sig1));
assert!(verify(&*msg2, &tag, &sig2));

// Can't mix signatures
assert!(!verify(&*msg1, &tag, &sig2));

// But we have been caught double-signing!
assert_eq!(trace(&*msg1, &sig1, &*msg2, &sig2, &tag), Trace::Revealed(&pubkey1));

依赖项

~2MB
~41K SLoC