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 加密学
89KB
1K SLoC
Selenite
一个用于后量子代码签名证书的实验性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