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