Schnorr签名算法是由德国数学家、密码学家Claus Schnorr提出。并于1990年申请了专利,U.S. Patent 4,995,082,该专利与2008年2月失效。目前该算法可以自由使用。

Schnorr签名算法几乎在各个层面均优于比特币现有的签名算法ECDSA:性能,安全,体积,扩展性等方面。

Schnorr Sig可以与ECDSA使用同一个椭圆曲线:secp256k1 curve,升级起来的改动非常小。

原理

我们定义几个变量:

  • G:椭圆曲线。
  • m:待签名的数据,通常是一个32字节的哈希值。
  • x:私钥。P = xG,P为x对应的公钥。
  • H():哈希函数。
    • 示例:写法H(m || R || P)可理解为:将m, R, P三个字段拼接在一起然后再做哈希运算。

生成签名

签名者已知的是:G-椭圆曲线, H()-哈希函数,m-待签名消息, x-私钥。

  1. 选择一个随机数k, 令 R = kG
  2. 令 s = k + H(m || R || P)*x

那么,公钥P对消息m的签名就是:(R, s),这一对值即为Schnorr签名。

验证签名

验证者已知的是:G-椭圆曲线, H()-哈希函数,m-待签名消息, P-公钥,(R, s)-Schnorr签名。验证如下等式:

sG = R + H(m || R || P)P

若等式成立,则可证明签名合法。

我们推演一下,此过程包含了一个极其重要的理论:椭圆曲线无法进行除法运算。

  1. s值的定义:s = k + H(m || R || P)*x,等式两边都乘以椭圆曲线G,则有:
  2. sG = kG + H(m || R || P)*x*G,又因R = kG, P = xG,则有:
  3. sG = R + H(m || R || P)P,椭圆曲线无法进行除法运算,所以第3步的等式,无法向前反推出第1步,就不会暴露k值以及x私钥。同时,也完成了等式验证。

组签, Group Signature

一组公钥,N把,签名后得到N个签名。这个N个签名是可以相加的,最终得到一个签名。这个签名的验证通过,则代表N把公钥的签名全部验证通过。

有:

  • 椭圆曲线:G
  • 待签名的数据:m
  • 哈希函数:H()
  • 私钥:x1,x2,公钥:P1=x1*G, P2=x2*G
  • 随机数:k1, k2,并有 R1=k1*G, R2=k2*G
  • 组公钥:P = P1 + P2

则有:

  • 私钥x1和x2的签名为:(R1, s1), (R2, s2)。
  • 两个签名相加得到组签名:(R, s)。其中:R = R1 + R2, s = s1 + s2

推演过程:

1. 令 R = R1 + R2, s = s1 + s22. 已知:s1 = k1 + H(m || R || P)*x1,s2 = k2 + H(m || R || P)*x23. s = s1 + s2= k1 + H(m || R || P)*x1 +k2 + H(m || R || P)*x2= (k1 + k2) + H(m || R || P)(x1 + x2)4. 两边同时乘以G,则有:sG = (k1  + k2)G + H(m || R || P)(x1  + x2)G= (k1G + k2G) + H(m || R || P)(x1G + x2G)= (R1 + R2) + H(m || R || P)(P1 + P2)= R + H(m || R || P)P5. 完成证明,并从两个合作方推演至N个合作方

组公钥(Group Key),是N把公钥进行相加后的值,又称聚合公钥(Aggregation Key)。需要指出的是,参与方需要先相互交换公钥和R值,然后再进行各自的签名。

应用

若使用在比特币上,相比ECDSA会有一些额外的显著优势:

  • 更安全。目前Schnorr签名有安全证明,而ECDSA目前并没有类似的证明。
  • 无延展性困扰。ECDSA签名是可延展性的,第三方无需知道私钥,可以直接修改既有签名,依然能够保持该签名对于此交易是有效的。比特币一直存在延展性攻击,直到SegWit激活后才修复,前提是使用segwit交易,而不是传统交易。BIP62 和 BIP66 对此有详细描述。
  • 线性。Schnorr签名算法是线性的!这点非常牛逼,基于这点可衍生出许多应用。例如,N个公钥进行签名,采用ECDSA的话,则有N个签名,验证同样需要做N次。若使用Schnorr,由于线性特性,则可以进行签名叠加,仅保留最终的叠加签名。例如同一个交易无论输入数量多少,其均可叠加为一个签名,一次验证即可。以及GMaxwell提出的Taproot/Grafroot也是基于其线性特性。

Q&A

Q: Schnorr签名是否可以用在m of n多重签名上?
A: 当然可以。多重签名只是m of n的签名数量的模式。与签名算法无关。

Q: Schnorr的组签名特性是否可以做或模拟出m of n式的签名?
A: 无法做到。组内有N把公钥,则必须对应有N个签名,缺一不可。每个人在生成签名的时候,在哈希函数里都代入的都是组公钥P。

Q: 签名机制的安全性如何衡量?
A: 主要取决于两个:1. 签名算法本身 2. 椭圆曲线。目前,Schnorr与ECDSA都用的是曲线secp256k1,这个层面一样。至于签名算法本身安全性,Schnorr目前有安全证明,安全优于ECDSA。


参考:

  • Schnorr signature,https://en.wikipedia.org/wiki/Schnorr_signature

  • BIP-Schnorr,Pieter Wuille,https://github.com/sipa/bips/blob/bip-schnorr/bip-schnorr.mediawiki

  • Simple Schnorr Multi-Signatures with Applications to Bitcoin,https://eprint.iacr.org/2018/068

Schnorr签名介绍相关推荐

  1. Schnorr签名与比特币隐私的必然性

    数字签名是在线主权的支柱.公钥密码学在 1976 年的出现,为创建全球通信媒介.互联网以及全新的货币形式比特币铺平了道路.虽然从那时起公钥加密的基本属性并没有太大变化,但现在密码学家的工具箱中有许多开 ...

  2. 【密码学】Schnorr认证,Schnorr签名,安全性证明

    Schnorr是Sigma协议的实例,从Schnorr 认证协议和Schnor签名两个部分来介绍.在前面关于认证协议的讲述中,用到了一些特定的符号,这里会继续使用. 首先认识Schnorr认证协议,定 ...

  3. 史上最全的Schnorr签名方案和BLS签名方案的全面对比

    前言 Schnorr 签名算法最初是由德国密码学家 Claus Schnorr 于 2008 年提出的,而来自区块链协议公司 Blockstream 的密码学家 Gregory Maxwell.Pie ...

  4. Schnorr signature (Schnorr 签名)数学原理

    来源 一.ECC public key & private key On secp256k1, a private key is simply a scalar integer value b ...

  5. BSV 上的 Schnorr 签名

    我们已经在 BSV 上实现了 Schnorr 签名.这是第一个也是唯一一个已知的实现,没有对原始协议进行任何更改¹. 一笔交易一个签名 Schnorr 是一种可以用于替代比特币签名当前使用的 ECDS ...

  6. Schnorr签名体制

    schnorr签名被认为可以解决比特币的空间问题,如下面一段所述: If you ask anyone in the Bitcoin space what the biggest challenge ...

  7. 数字签名(RSA签名、ElGamal签名、Schnorr签名、DSS、DSA、离散对数签名、特殊性质的签名算法、Chaum盲签名、Chaum-Antwerpen不可否认签名、群签名、MUO代理签名)

    数字签名基本概念 数字签名的必要性: 消息认证能够使通信双方对接收到的信息来源及完整性进行验证,防止第三方的攻击,然而却不能防止通信双方中的一方对另一方的欺诈. 这种欺诈有多种形式,例如通信双方(发送 ...

  8. schnorr签名和batch verification

    schnorr 签名 概念:Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的,在密码学中,它是一种数字签名方案,以其简单高效著称 原理:其安全性基于某些离散对数问题 ...

  9. Android打包知识体系(二)——APK签名介绍

    上一节介绍到多渠道打包的快速,他是如何如此迅速的完成打包的? 问题1:如何不修改签名的情况下,网APK中注入渠道信息??? 先不急接着往下看. 一.APK签名介绍: 1.APK 签名方案 Androi ...

最新文章

  1. 做个游戏:设计代码生成特定的调用堆栈
  2. java context.write_Channel.write() 和 ChannelHandlerContext.write() 的区别
  3. windows如何调用Linux的API,Windows和Native API中的系统调用?
  4. JS实现子类调用父类的同名函数函数
  5. python查看内置模块,python快速查看内置模块函数
  6. 【Java程序设计】流程控制
  7. 计算机怎么获取权限删除文件,电脑删除文件需要获取trustedinstaller权限怎么回事...
  8. access汇总含义_access的用法总结大全
  9. 计算机中mpeg代表什么,mpg和mpeg格式的区别
  10. 朝花夕拾 - 年度整理,2021?2022!
  11. H5学习之路之audio音频播放
  12. Linux命令~~ls列出 ~alias别名~通配符讲解
  13. 如何用JAVA制作一个漂亮的表格
  14. 别让自己“墙”了自己
  15. 最新史上最权威的Oracle学习路线视频教程(价值2w)
  16. 如何用java代码调用ffmpeg进行视频转码
  17. linux unix novel,《手机》:书写的是语言,表达的是孤独www.smallnovel.com
  18. Java实现的LU分解,高斯消去法求线性方程组的解
  19. 【Proteus仿真】利用加法计数器74XX160的级联实现2位计数
  20. 视频基础--视频基础知识介绍

热门文章

  1. vscode设置html、js不换行
  2. Spring5学习(二):Spring 配置、依赖注入
  3. web网页劫持是如何做到的
  4. squeeze和unsqueeze
  5. 斩获殊荣 | 赛宁网安荣获星光江苏年度数字经济创新产品优胜奖
  6. Qt开发中触发鼠标悬停事件
  7. CMU-Cognitive Robotics-卡内基梅隆大学-认知机器人学课程资料(2017-2019)
  8. 换一个灯泡需要多少程序员?
  9. Netty框架之多线程的Selector优化
  10. QString 与 LPCWSTR 互转