#签名方案 #签名 #rsa #盲签名 #加密

rsa-fdh

RSA-FDH是一种可证明安全的盲签名方案,它使用RSA和全域哈希(FDH),并支持盲签名/盲签名。

6个版本 (3个破坏性更新)

0.5.0 2020年11月24日
0.4.1 2020年8月23日
0.4.0 2020年6月21日
0.2.1 2020年2月17日
0.1.0 2019年4月4日

#1343密码学

Download history 126/week @ 2024-03-14 205/week @ 2024-03-21 111/week @ 2024-03-28 96/week @ 2024-04-04 82/week @ 2024-04-11 78/week @ 2024-04-18 84/week @ 2024-04-25 83/week @ 2024-05-02 85/week @ 2024-05-09 91/week @ 2024-05-16 84/week @ 2024-05-23 68/week @ 2024-05-30 54/week @ 2024-06-06 60/week @ 2024-06-13 56/week @ 2024-06-20 33/week @ 2024-06-27

每月210次下载
6 个crate中(5个直接)使用

MIT/Apache

22KB
244

RSA-FDH

checks codecov docs patreon flattr

RSA-FDH是一种可证明安全的盲签名方案,它使用RSA和全域哈希

本项目实现了两种RSA-FDH签名方案

  1. 带有全域哈希(FDH)填充的常规签名方案。

  2. 支持盲签名的盲签名方案,以保持待签名消息对签名人保密。

注意事项

  1. 在使用盲签名方案时,签名密钥应仅作为RSA-FDH盲签名的部分使用。密钥重复用于加密或其他协议可能导致密钥泄露。

  2. 本项目及其依赖尚未经过安全审计。1.0版本将在完成安全审计后发布。如果您有兴趣进行安全审计,请参阅此票据

常规签名方案示例

use rsa_fdh;
use rsa::{RSAPrivateKey, RSAPublicKey};
use sha2::{Sha256, Digest};

// Set up rng and message
let mut rng = rand::thread_rng();
let message = b"NEVER GOING TO GIVE YOU UP";

// Create the keys
let signer_priv_key = RSAPrivateKey::new(&mut rng, 256)?;
let signer_pub_key: RSAPublicKey = signer_priv_key.clone().into();

// Apply a standard digest to the message
let mut hasher = Sha256::new();
hasher.input(message);
let digest = hasher.result();

// Obtain a signture
let signature = rsa_fdh::sign::<Sha256, _>(&mut rng, &signer_priv_key, &digest)?;

// Verify the signature
rsa_fdh::verify::<Sha256, _>(&signer_pub_key, &digest, &signature)?;

盲签名方案示例

use rsa_fdh;
use rsa::{RSAPrivateKey, RSAPublicKey};
use sha2::{Sha256, Digest};

// Set up rng and message
let mut rng = rand::thread_rng();
let message = b"NEVER GOING TO GIVE YOU UP";

// Create the keys
let signer_priv_key = RSAPrivateKey::new(&mut rng, 256)?;
let signer_pub_key: RSAPublicKey = signer_priv_key.clone().into();

// Hash the contents of the message with a Full Domain Hash, getting the digest
let digest = blind::hash_message::<Sha256, _>(&signer_pub_key, message)?;

// Get the blinded digest and the secret unblinder
let (blinded_digest, unblinder) = blind::blind(&mut rng, &signer_pub_key, &digest);

// Send the blinded-digest to the signer and get their signature
let blind_signature = blind::sign(&mut rng, &signer_priv_key, &blinded_digest)?;

// Unblind the signature
let signature = blind::unblind(&signer_pub_key, &blind_signature, &unblinder);

// Verify the signature
blind::verify(&signer_pub_key, &digest, &signature)?;

协议描述

全域哈希(FDH)的构建如下

FDH(𝑀, 𝐼𝑉) =H(𝑀 ‖ 𝑁 ‖𝐼𝑉 + 0)‖ H(𝑀 ‖ 𝑁 ‖𝐼𝑉 + 1)‖ H(𝑀 ‖ 𝑁 ‖𝐼𝑉 + 2) ...

其中

  • 𝑀是消息
  • H是任何哈希函数
  • 𝑁是签名密钥的公开模数
  • 𝐼𝑉是一个一字节初始化向量

消息在轮次中与𝑁和𝐼𝑉 +增量后缀一起散列,直到哈希长度大于或等于𝑁的长度。根据需要截断哈希以产生与𝑁具有相同长度的摘要𝐷。

𝐷还必须小于𝑁,因此我们增加𝐼𝑉,直到找到小于𝑁的𝐷。

伪代码

fn generate_digest(message, public_key):
    fdh = create_fdh(algo=sha256, length=public_key.bitlen())
    iv = 0
    digest = fdh(message, iv)
    while digest.as_int() > public_key.n():
        iv++
        digest = fdh(message, iv)
    return digest

由于𝑁通常出现在(2^bitlen) / 2,因此while循环在最小迭代次数内完成。

支持两种签名方案

  1. 在常规签名方案中,签名者在签名消息之前应用FDH。

  2. 在盲签名方案中,发送者在将生成的摘要进行盲化并发送给签名者之前,先将FDH应用于消息。签名者直接对盲化的摘要进行签名。签名者不得在RSA-FDH盲签名协议之外重新使用其私钥进行加密。

盲化、解盲、签名和验证均按照RSA的常规方式进行。

贡献者

  1. Patrick Hayes (linkedin) (github) - 可招聘。

依赖项

~9.5MB
~168K SLoC