http://www.7klian.com

数据完整性算法_Schnorr数字签名先容

 3use secp256k1::{ SecretKey, PublicKey, thread_rng, Message };
 8    // Alice generates some keys

因此,Bob必需只计较与签名(s.G)相对应的公钥,并查抄它是否便是Bob已经知道的最后一个等式(R + P.e)的右侧。
20
建设签名
46    let k = SecretKey::random(&mut rng);
 5
14    // e = H(Ra || Rb || Pa || Pb || H(m))
4. 每小我私家都计较沟通的“共享公钥”,X如下:

可以回收各类其他身份验证步调来办理此问题,在此不再赘述。
49    let R = PublicKey::from_secret_key(&r);
 7fn main() {
29#[allow(non_snake_case)]
22    println!(“Signature is valid!”);
30    // Signatures
 8    let k = SecretKey::from_hex(“0000000000000000000000000000000000000000000000000000000000000001”).unwrap();
这是对数字签名的交互式先容。我们利用Rust代码来演示此处提出的一些想法。本段代码是利用libsecp256k-rs库。
51}

2. 在加密中,可以对动静举办编码,只有拥有私钥的人才气解密和读打动静;

 8    // Alice creates a public-private keypair
 1extern crate libsecp256k1_rs;
假设私钥暗示为ki,公钥暗示为Pi。假如我们要求Alice和Bob各自提供一个随机数,我们可以实验:、

29
 6#[allow(non_snake_case)]
2. 原子互换;
运作方法如下。Alice和Bob想要安详相同。一种简朴的要领是利用互相的公钥并计较

我们将在此处演示交互式MuSig方案,个中每个签名者都签名沟通的动静。该方案的事情道理如下:
 2
13    let Pf = Pb – Pa;
这是可行的,可是它需要各方之间举办另一轮动静通报,这倒霉于精采的用户体验。
10    let P_a = PublicKey::from_secret_key(&k_a);
1. 聚合签名;
可是看这个:

15    let e = Challenge::new(&[&Ra, &Rb, &Pa, &Pb, &m]).as_scalar().unwrap();
17    // Bob’s version:

我们为什么需要Nonce?
12    // I’m setting the order here. In general, they’ll be sorted
24    let sG = Ra + Rf + e*(Pa + Pf);
28
 7fn main() {
11    let (kb, Pb, rb, Rb) = get_keyset();

13    let P_b = PublicKey::from_secret_key(&k_b);
 7    // Create the secret key “1”
23    let S = PublicKey::from_secret_key(&s_agg);
17    // The challenge uses both nonce public keys and private keys
聚合签名是凡是的总和是s=∑si
 4
31    let mut rng = thread_rng();
25    assert_eq!(k, hacked);

10    let (k3, X3, r3, R3) = get_keys();
33    let P = PublicKey::from_secret_key(&k);
16    let a2 = Challenge::new(&[ &l, &X2 ]).as_scalar().unwrap();
10    let pub_from_k = PublicKey::from_secret_key(&k);
 5
这个非凡的库有一些很好的特性。我们重写了+(addition)和*(multiplication)运算符,,以便Rust代码看起来更像数学公式。这使得我们更容易运用我们将要摸索的想法。
 2
1. 每小我私家还计较共享随机数R = ∑Ri。
那么在安详通信的各方如何生成用于加密动静的共享机要?一种要领称为椭圆曲线Diffie-Hellman互换(ECDH),这是一种简朴的要领。
 3use secp256k1::{SecretKey, PublicKey, thread_rng, Message};
20    // Calculate the aggregate signature
20
25
10    // Bob generates some keys
10    let k = SecretKey::random(&mut rng);
22
35    let R = PublicKey::from_secret_key(&r);
13    let m = Message::hash(b”Meet me at 12″).unwrap();
23    // Check if it’s valid
33    let P = PublicKey::from_secret_key(&k);
13    // The challenge uses both nonce public keys and private keys
 7    let mut rng = thread_rng();
33    let s3 = r3 + k3 * a3 * e;
45    let mut rng = thread_rng();
15    let a1 = Challenge::new(&[ &l, &X1 ]).as_scalar().unwrap();
 3use libsecp256k1_rs::{ SecretKey, PublicKey };
 1extern crate libsecp256k1_rs as secp256k1;
19    let X = a1 * X1 + a2 * X2 + a3 * X3;
18    // X = sum( a_i X_i)
在数字签名先容中,我们将接头一类非凡的密钥:从椭圆曲线派生的密钥。尚有其他非对称方案,个中包罗基于RSA密钥的质数乘积的方案。

所以看起来Alice和Bob可以提供本身的R,任何人都可以从Rs和公钥的和结构两个多重签名。这确实有效:
3. 将以下内容发送给您的收件人Bob-您的动静(m),R和您的民众密钥(P = k.G)。

Schnorr签名的形式是s=r+e.k。这种结构也是线性的,因此它很好地切合椭圆曲线数学的线性。
此刻Bob说谎,说他的公钥是P’b = Pb-Pa,公有随机数是R’b = Rb-Ra。
26    println!(“Hacked key:     {}”, k)

替换R = rG和P = kG,我们有:

让我们看看如何利用Schnorr签名的线性特性来结构两个多重签名。Alice和Bob但愿在不需要彼此信任的环境下配合签名(好比Tari事务);也就是说,他们需要可以或许证明各自密钥的所有权,而且聚合签名只有在Alice和Bob都提供其部门签名时才有效。

Bob此刻还可以计较e,因为他已经知道m,R,P。可是他不知道您的私钥或随机数。
12    let P = PublicKey::from_secret_key(&k);
16    let m = Message::hash(b”a multisig transaction”).unwrap();
21    assert_eq!(PublicKey::from_secret_key(&s), e*P);
19    let e = Challenge::new(&[&Ra, &Rf, &Pa, &Pf, &m]).as_scalar().unwrap();
在“Key Cancellation(密钥打消进攻)”中,Bob不知道其已宣布的R和P值的私钥。我们可以通过要求Bob签署一条动静证明他确实知道私钥来击败Bob。
 6#[allow(non_snake_case)]
15}
这很有意思,secp256k1是椭圆曲线的名称,它为很多加密钱币生意业务(包罗)中提供很是重要的加密掩护事情。
11
 8    // Alice generates some keys
22}

然后签名是s=ek。
43#[allow(non_snake_case)]
Key Cancellation(密钥打消进攻)
28
31    let mut rng = thread_rng();

23    // Calc shared nonce
· 它答允交互式聚合签名(IAS),要求签名者举办相助。
34    let r = SecretKey::random(&mut rng);
38    let check = R + e * X;
1. 和以前一样,每个签名者都有一个公钥-私钥对。
让我们再来看前面的场景,可是这次,Bob提前知道了Alice的公钥和nonce,直到她果真它们。
 4use secp256k1::schnorr::{Schnorr, Challenge};
· 它答允每个签名者签名同一条动静m。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

相关文章阅读