# Schnorr 基础知识学习

By [albertma](https://paragraph.com/@albertma-2) · 2022-05-26

---

比特币Taproot中包含了新的签名方式

什么是Schnorr？
-----------

Schnorr是一种新的密钥签名方案，将会在比特币的taproot的升级中使用。Schnorr的优点在BIP340列出：

[https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#motivation](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#motivation)

中有详细的描述。

现总结如下：

1.  **可证明安全性**
    
    相比之下ECDSA 可证明安全性的最著名结果依赖于更强的假设。
    
2.  **不可锻造性**
    
    Schnorr 签名的 SUF-CMA 安全性意味着它们是不可延展的。 另一方面，ECDSA 签名本质上是可延展的\[3\]； 无法访问密钥的第三方可以将给定公钥和消息的现有有效签名更改为对相同密钥和消息有效的另一个签名。
    
3.  **线性**
    
    Schnorr 签名提供了一种简单有效的方法，使多个合作方能够生成对其公钥总和有效的签名。
    

使用上：

跟ECDSA一样依然有签名和验签的两个步骤

![左边：使用message和私钥签名。右边：验证message](https://storage.googleapis.com/papyrus_images/7acb0c619edce6162149158349fd30ff265a1bb2be75c9c4d06df802c3085076.png)

左边：使用message和私钥签名。右边：验证message

签名用私钥和message去做了一个签名。验证方使用公钥和message以及签名来验证。

签名
--

![](https://storage.googleapis.com/papyrus_images/fe5ed3f76e3e9ac637d82b5a711207bcb83f8899eaf1ec30c0d320990078b84b.png)

R是最终签名的第一部分，r必须保密，而且不能被重用。

第一步：生成challenge hash

![](https://storage.googleapis.com/papyrus_images/12503ae0de68a1f9c17678430910525e67bd333d69f0efdd47a1c6e548a3b071.png)

第二步：计算challenge response，或者叫作简单的response s，是签名的第二部分。

![](https://storage.googleapis.com/papyrus_images/3334ac6c68d8bcb9a52276e9e08889aa7675226bff585ab554ba3cb6c22f7a27.png)

最终Signature是

（R，s）

### 验证者

验证者需要能够访问 P（公钥），m（message）， R（随机数\*G）和 s(签名)

![](https://storage.googleapis.com/papyrus_images/3f9c66c5ae30ae0e39c5a0bfab8c903d2a4bb28c2e2f6e33e43231b2be702af3.png)

如果r泄露了，那么就可以反推出私钥p

![](https://storage.googleapis.com/papyrus_images/65a58dbd70b0f7d1e784324a1c252661a0f2ff61d9fc72a8ea6dda67782ce529.png)

随机数r也不能使用2遍；

因为如果使用2遍，那么可以推出私钥p

![](https://storage.googleapis.com/papyrus_images/618278052d253ecdc02d0867635d5ee1d391bbd36f0b24717575402911e09493.png)

![](https://storage.googleapis.com/papyrus_images/1cfbc7700e19d6fd5e8d0d15ce5368bf0499c90f89ae726c76a9186c17f18d49.png)

最终可以得出

![](https://storage.googleapis.com/papyrus_images/fde633be256b2e44fd51f9f0cabacfb9c836fe488d8c4a4cf5e654f75354792c.png)

### 组成challenge的元素的必要性

*   m： 就是要签名的message，如果去掉m，那么signature会对所有message都合法的。
    
*   R：如果challenge里面没有随机数的，那么签名可以被任何人轻易的伪造。
    

![](https://storage.googleapis.com/papyrus_images/cae48cd3d367bb1db24275d30bd4a0bdb68f0fb07af0923c3a7fc23e5b4b87df.png)

最后一个方程是“验证方程”，但求解 R。该方程的右侧仅包含已知变量 s、e 和 P。因此签名 (R,s) 是有效的。

P：公钥，如果公钥没有在challenge里，那么签名也容易被破解。

![](https://storage.googleapis.com/papyrus_images/ca9dd524b1414c593d67c7472084c285ba32f497d062026c5b2e71bc2915e4b3.png)

References

[https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#motivation](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki#motivation)

[https://popeller.io/schnorr-basics](https://popeller.io/schnorr-basics)

---

*Originally published on [albertma](https://paragraph.com/@albertma-2/schnorr)*
