#signature #signature-scheme #post-quantum #security #post-quantum-cryptography #32-byte

winternitz-ots

这是一个用于与Winternitz一次性签名(W-OTS)交互的Rust库,W-OTS是一种基于Lamport签名的基于哈希的量子后数字签名方案。此实现使用Blake2b哈希函数进行所有哈希操作,因为它速度快且安全,使用16个Winternitz参数,摘要大小(n)为32字节。

4个版本 (2个重大更新)

0.3.0 2021年5月20日
0.2.0 2021年1月11日
0.1.1 2020年4月29日
0.1.0 2019年10月29日

#1902 in 密码学

Apache-2.0

19KB
215

Winternitz-OTS

Crates.io Build Status Crates.io

这是一个用于处理基于哈希函数Blake2b的量子后数字签名方案Winternitz一次性签名(W-OTS)的Rust库/包。

了解W-OTS

使用方法

基本用法

这将向您展示库的基本用法以及如何生成W-OTS密钥对,然后使用它来签名消息摘要,然后验证签名。

use winternitz_ots::wots;

// Generates a W-OTS Keypair using parameters using Winternitz Parameter of 16 and Blake2B
let keypair = wots::generate_wots();

// Have A Hexadecimal String You Would Like To Sign
let hex_digest = String::from("F7EE6090BA42BDDAB5899E8E25525922C3279D8563EEF37A597F13BCADA73DF7");

// Sign up to a 256bit (32 byte) hexadecimal digest using your W-OTS Keypair and a String
let signature = keypair.sign(hex_digest);

// Return a Boolean To Check Whether The Signature Is Valid
let verification: bool = signature.verify();

访问密钥对属性

use winternitz_ots::wots;

// Generates a W-OTS Keypair using parameters using Winternitz Parameter of 16 and Blake2B
let keypair = wots::generate_wots();

// Sign Message
let sig = keypair.sign(message);

// Get From Keypair
let public_key: Vec<String> = keypair.pk;
let private_key: Vec<String> = keypair.sk;

// Get From Signature
let public_key = sig.pk;
let signatures = sig.signature;
let input: String = sig.input;

更深入的使用

extern crate winternitz_ots;
use winternitz_ots::wots;

fn main() {
    // Have A Hexadecimal String You Would Like To Sign
    let hex_string: String = String::from("ECC4C3134F80E54C08BAAE1A3F3BDC07BB3AD3906FF62D0D3DFC1EE87AE83194");

    // Generate W-OTS Keypair | Get The Hash Of The Public Key (For An Address For Example) using a digest from 1-64
    let keypair = wots::generate_wots();
    let public_key_hash = keypair.hash_public_key(8);

    // Export Public Key or Private Key; You may also wish to export metadata
    let pk = keypair.export_pk();
    let sk = keypair.export_sk();
    let (w, n) = keypair.export_metadata();

    // Use The Generate W-OTS Keypair
    let signature = keypair.sign(hex_string);

    // Check Whether The Signature Is Valid
    let is_signature_valid: bool = signature.verify();

    // Signature Attributes
        // A Vector of The Input Into Its Corresponding Value From 0-15 (for w=16)
    let input = &signature.input;
    let is_pk_hash_real = signature.verify_public_key_hash(public_key_hash.clone());

    println!();
    println!("PK[0]: {}",pk[0]);
    println!("PK[63]: {}",pk[63]);
    println!("SK[0]: {}",sk[0]);
    println!("SK[63]: {}",sk[63]);
    println!();
    println!("Public Key Address: 0x{}",public_key_hash);
    println!("Hash: Blake2b");
    println!("w: {}",w);
    println!("n: {}",n);
    println!();
    println!("Input: {}",input);
    println!();
    println!("Is Signature Valid: {}",is_signature_valid);
    println!("Is Public Key Address Valid For Given Public Key: {}",is_pk_hash_real);
    println!();
}

待办事项

  1. 添加更多测试/示例
  2. 大量重构代码并减少内存占用
  3. 尝试使代码对侧信道攻击安全,并测试安全漏洞
  4. 完成基准测试

还在开发Rust中的Winternitz-OTS+(WOTS+)版本。

许可证

根据您的选择,许可为以下之一

  • Apache License,版本2.0

贡献

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

依赖项

~0.6–1.3MB
~29K SLoC