12个不稳定版本 (5个破坏性版本)

0.6.0 2021年12月10日
0.5.3 2021年10月22日
0.4.1 2021年10月8日
0.3.1 2021年1月11日
0.1.0 2019年11月21日

#1491 in 加密学

MIT/Apache

89KB
1K SLoC

Selenite

Crates.io Build Status Crates.io

一个用于后量子代码签名证书的实验性Rust Crate。

所有数字签名都是 第三轮NIST后量子候选方案,并列于此处

请阅读文档以了解用法。

概述

数字签名

  • SPHINCS+
  • FALCON512和FALCON1024
  • ED25519*
  • BLS12_381*

*: 非后量子密码学

示例用法

SPHINCS+ (SHAKE256)

阅读SPHINCS+

SPHINCS+是一种无状态的基于哈希的签名方案,其密码假设来自密码哈希函数。

通过使用哈希函数SHAKE256并设置其他安全参数,此数字签名实现达到了安全级别5,这是签名可以拥有的最高安全性。然而,与其它选择相比,SPHINCS+的验证时间较慢。

  • SPHINCS+版本: sphincsshake256256srobust

  • 公钥大小: 64字节

  • 私钥大小: 128字节

  • 签名大小: 29,792字节

use selenite::crypto::*;

fn main() {
    // Generates The Respected Keypair
    let keypair = SphincsKeypair::new();

    // Signs The Message as a UTF-8 Encoded String
    let mut signature = keypair.sign("message_to_sign");

    // Returns a boolean representing whether the signature is valid or not
    let is_verified = signature.verify();
}

FALCON512/FALCON1024

阅读FALCON

FALCON是一种基于格的签名方案,其基本问题是基于NTRU格上的短整数解问题(SIS),在一般情况下,即使借助量子计算机,也没有已知的有效解决算法。Falcon512在经典安全假设上与RSA2048的安全性相似。

  • 公钥大小: 897字节 | 1793字节

  • 私钥大小: 1281字节 | 2305字节

  • 签名大小: 660字节 | 1280字节

use selenite::crypto::*;

fn main(){
    // Generates FALCON512 Keypair
    let keypair = Falcon512Keypair::new();
    
    // Generates FALCON1024 Keypair
    let keypair2 = Falcon1024Keypair::new();
    
    // Signs The Message as a UTF-8 Encoded String using the first keypair (FALCON512)
    let signature = keypair.sign("Message1");
    
    // Returns a boolean representing whether the signature is valid or not
    let is_verified = signature.verify();
}

ED25519

ED25519是DJB开发的基于椭圆曲线的数字签名,具有小的公钥、私钥和签名。

它不是后量子安全的,但已被包含在这个库中。

  • 公钥大小: 32字节

  • 私钥大小: 32字节

  • 签名大小: 64字节

use selenite::crypto::*;

fn main(){
    // Generates ED25519 Keypair
    let keypair = ED25519::new();
    
  	// Signs Message
    let signature = keypair.sign("Message1");
    
    // Returns a boolean representing whether the signature is valid or not
    let is_verified = signature.verify();
}

BLS签名

BLS是一种配对友好的椭圆曲线,允许签名聚合。签名的聚合允许您将多个签名组合成一个。Selenite支持聚合(尽管仍在开发中)。

use selenite::crypto::*;

fn main() {
    let keypair = BLSKeypair::new();
    
    let keypair2 = BLSKeypair::new();
    
    let signature = keypair.sign("This message is being signed by BLS");
    
    let signature2 = keypair2.sign("This message is also being signed by BLS");
    
    let is_verified = signature.verify();
       
}

序列化

您可以使用 serde-yaml 将密钥对序列化为 YAML。

fn serialize(){
    // Generates Keypair
    let keypair = SphincsKeypair::new();
    
    // Serializes Keypair To YAML
    let yaml = keypair.serialize();
    
    // Deserializes Keypair To Respected Struct
    let keypair_from_yaml = SphincsKeypair::deserialize(&yaml);
}

fn serialize_signature(){
    // Generates Keypair
    let keypair = SphincsKeypair::new();

    // Generates Signature
    let signature = keypair.sign("Hello World!");

    // [BINCODE] Serialize To Bincode
    let bincode: Vec<u8> = signature.serialize_to_bincode();

    // [YAML] Serialize To YAML
    let yaml = signature.serialize();
}

来自 CSPRNG 的随机性

Selenite 允许您轻松地从您的操作系统获取安全随机数。

use selenite::random::OsRandom;

fn main() {
    let randomness_32 = OsRandom::rand_32.expect("Failed To Get Randomness");

    let randomness_64 = OsRandom::rand_64.expect("Failed To Get Randomness");

    let randomness_128 = OsRandom::rand_128.expect("Failed To Get Randomness");
}

创建 SPHINCS+ 证书

use selenite::crypto::SphincsKeypair;
use selenite::certificate::*;

fn main(){
    let (cert,keypair) = SeleniteCertificate::new(
        String::from("Subject Name"),
        CertificateType::INDIVIDUAL,
        Some(String::from("[Optional] Username")),
        vec![KeyUsage::CODE_SIGNING,KeyUsage::DOCUMENT_SIGNING,KeyUsage::REVOCATION],
        Some(String::from("[Optional] Email Address")),
        Some(String::from("[Optional] Phone Number")),
        Some(String::from("[Optional] Address")),
        Some(String::from("[Optional] Backup Email")),
        Some(String::from("[Optional] Backup Phone Number")),
        Some(String::from("[Optional] Description")),
        Some(String::from("[Optional] Website")),
        Some(String::from("[Optional] @Github")),
        Some(String::from("[Optional] @Reddit")),
        Some(String::from("[Optional] @Twitter")),
        Some(String::from("[Optional] @Keybase")),
        Some(String::from("[Optional] Bitcoin Address (BTC)")),
        Some(String::from("[Optional] Ethereum Address (ETH)")),
        Some(String::from("[Optional] Monero Address (XMR)")),
        Some(String::from("[Optional] Zcash Address (ZEC)")),
        Some(String::from("[Optional] PGP Key")),
        Some(String::from("[Optional] Onion Website")),
        Some(String::from("[Optional] Backup PGP Key")),
        Some(0usize), // (Optional) | Last_Bitcoin_Block_Height,
        Some(String::from("[Optional] Last Bitcoin Block Hash")),
        );
}

待办事项

  • 添加 Dilithium,另一个第三轮候选人

  • 添加更好的 序列化

  • 添加 测试

  • 重构代码

资源

许可证

许可方式任选其一

  • Apache License,版本 2.0

  • MIT 许可证

任选。

贡献

除非您明确说明,否则任何有意提交并包含在作品中的贡献,如 Apache-2.0 许可证中定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~47MB
~1M SLoC