1 个不稳定版本
0.5.0 | 2021年10月7日 |
---|
#2091 in 密码学
23KB
244 行
RSA-FDH
这是一个用于开发目的的分支。它不再维护。请使用原始库。
RSA-FDH 是一种使用 RSA 和 完整域哈希 的证明安全盲签名方案。
本项目实现了两种 RSA-FDH 签名方案
-
一个带有完整域哈希 (FDH) 填充的常规签名方案。
-
一个支持盲签名的盲签名方案,以保持被签名的消息对签名者保密。
注意事项
-
在使用盲签名方案时,签名密钥应仅作为 RSA-FDH 盲签名的一部分使用。密钥重复用于加密或其他协议可能导致密钥泄露。
-
本项目及其依赖项尚未经过安全审计。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
循环在有限次数迭代内完成。
支持两种签名方案
-
在常规签名方案中,签名者在签名消息之前应用 FDH。
-
在盲签名方案中,发送者在对消息进行盲化处理之前,先应用FDH(Feige–Fiat–Hohenstein)算法到消息上,然后将生成的摘要进行盲化并发送给签名者。签名者直接对盲化的摘要进行签名。签名者不得在RSA-FDH盲签名协议之外重新使用其私钥进行加密。
盲化、去盲化、签名和验证都按照RSA的常规方式进行。
贡献者
依赖项
~4.5MB
~98K SLoC