【密码学原理】数字签名(ElGamal签名,Schnorr签名,椭圆曲线签名,RSA-PSS签名)

article/2025/10/4 4:51:24

数字签名是公钥密码学发展过程中最重要的概念之一,产生和使用数字签名过程的一般模型如图所示

消息认证可以保护消息交换双方不受第三方的攻击,但是不能处理通信双方自身发生的攻击。例如对下图中的某种方式进行攻击,考虑两种情况:

  • Bob可以伪造一条消息并称该消息来自Alice。用他们的共享密钥产生认证码,并将认证码附加在消息后面。
  • Alice可以否认曾经发送过某天消息。Bob可以伪造消息,所以无法证明Alice确实发过该消息。

数字签名的特征:

  • 必须能验证签名者、签名日期和时间
  • 必须能认证被签的消息内容
  • 签名应该由第三方仲裁,以解决争执

下面给出一些攻击类型,危害程度从高到低:

  • 唯密文攻击
  • 已知消息攻击
  • 一般选择消息攻击
  • 定向选择消息攻击
  • 适应性选项消息攻击
  • 完全破译
  • 通用伪造
  • 选择伪造
  • 存在性伪造

 数字签名应该满足的条件:

  • 签名必须是与消息相关的二进制位串
  • 签名必须使用发送方某些独有的信息,以防止伪造和否认
  • 产生数字签名比较容易
  • 识别和验证签名比较容易
  • 伪造数字签名在计算上是不可行的。无论是从给定的数字签名伪造消息,还是从给定的消息伪造数字签名,在计算上是不可行的
  • 保存数字签名的副本是可行的

安全Hash函数可用于满足上述条件的数字签名设计,简单的设计方案如图所示

 直接数字签名是指:只涉及通信双方的数字签名。这里先进行签名,然后才执行外层的加密,发生争执的时候第三方可以查看消息及签名。如果对消息先加密,然后对消息的密文签名,那么第三方必须知道解密密钥才能读取原始消息。签名如果在内层进行,接收方可以存储明文的消息及签名,以备解决争执。

直接签名有个弱点,它依赖于发送方的私钥安全性。发送方可以抵赖私钥丢失或者被盗。被广泛接受的解决方案是使用数字证书的证书管理中心(CA)。

ElGamal数字签名方案

ElGamal签名方案使用私钥进行加密,使用公钥进行解密。

签名包括两部分,一部分是对公共参数\alpha的加密,一部分是对私钥和前一部分签名的加密。验证签名的方式为

m是明文的Hash值,然后对A的公钥和前一部分签名分别用签名求指数,得到的结果进行比较即可。

Schnorr数字签名方案

同ELGama数字签名一样,Schnorr数字签名也是基于离散对数,将生成签名所需的消息计算量最小化,生成签名的主要工作不依赖于消息,可以在处理器空闲时执行。生成签名过程与消息相关的部分需要进行2n位长度的整数与n位长度的整数相乘。

在签名之前可以生成x,这个x是关于随机数r的值,与M无关,最后签名只是与M的绑定,不依赖于M

验证过程为

数字签名标准(DSS)

DSS使用的是只提供数字签名功能的算法,与RSA不同,DSS虽然是一种公钥密码方案,但是不能用于加密或密钥交换。

数字签名算法(DSA)如图所示

DSA中的签名和验证函数如图所示

椭圆曲线数字签名算法(ECDSA)

ECDSA处理过程:

  • 参与数字签名的所有通信方都使用相同的全局参数,用于定义椭圆曲线以及曲线上的基点
  • 签名者首先生成一对公私钥。对于私钥,选择一个随机数或者伪随机数作为私钥,利用随机数和基点算出另一点,作为公钥
  • 对消息计算Hash值,用私钥、全局参数和Hash值生成签名
  • 验证者用签名者的公钥、全局参数等验证

全局参数:

密钥生成:

每个签名者都要生成一对公私钥,假设是Bob

这里是定义在Z_q上的椭圆曲线,椭圆曲线上的乘法运算就是多个点的累加运算,最后的结果还是椭圆曲线上的点

有了公钥之后,Bob对消息m生成320字节的数字签名:

第2步确保最后算出的公钥(椭圆曲线上的点)是落在曲线上。第5不,如果为O点也是不符合的,所以也要重新生成。

Alice在获得Bob的公钥和全局参数后,即可校验签名

RSA-PSS数字签名

掩码生成函数(MGF)是一个伪随机函数,输入参数是一个任意长度的位串X以及需要输出字节长度L。

在签名之前,先对消息进行编码(EM),如图

拥有私钥\left ( d,n \right )和公钥\left ( e,n \right )的签名者生成签名

将字节串EM作为无符号的非负二进制整数m,加密得到签名s:s=m^d \mod{n}

在做签名的时候不再用公钥加密m,而是用私钥加密得到签名。验证的时候用公钥验证:


http://chatgpt.dhexx.cn/article/FlVnf70y.shtml

相关文章

Schnorr签名java实现

Schnorr签名(模指数)的实现java 1、算法描述2、算法的实现(java) 和ElGama数字签名一样,Schnorr数字签名方案也是基于离散对数。 Schnorr数字签名主要工作不依赖于消息,生成签名过程与消息相关的部分需要进…

Blind Schnorr Signature

1. 引言 前序博客有: 盲签名 blind signature Blind Schnorr Signature交互签名Demo见: Blind Schnorr Signature Interactive Demo 参考资料 [1] Schnorr Applications: Blind Signatures

本体技术视点 | 为什么 BIP - 340 选择引入 Schnorr 签名算法?

引言 备受瞩目的技术升级 Taproot 软分叉将于最近激活,激活高度为 709632,距今已不足 500 个区块。此次升级包括三个改进提案,分别是 BIP - 340、BIP - 341 和 BIP - 342。其中,BIP - 340 引入了 Schnorr 签名,BIP - …

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

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

零知识证明系列之二——Schnorr协议

​Schnorr协议简介 Schnorr协议是由德国数学家和密码学家Claus-Peter Schnorr在1991年提出,是一种基于离散对数难题的知识证明机制。Schnorr本质上是一种零知识的技术,即Prover声称知道一个密钥x的值,通过使用Schnorr加密技术,可…

Schnorr 签名方案和 BLS 签名方案的全面对比

原文:https://medium.com/cryptoadvance/bls-signatures-better-than-schnorr-5a7fe30ea716https://medium.com/cryptoadvance/how-schnorr-signatures-may-improve-bitcoin-91655bcb4744 Schnorr 签名算法最初是由德国密码学家 Claus Schnorr 于 2008 年提出的&…

Schnorr签名算法(初始化和签名)C语言实现

Schnorr签名算法(初始化和签名) Schnorr签名算法(验证) Schnorr签名算法(正确性) Schnorr签名算法(举例) Schnorr签名算法(举例) C语言实例 #include <stdlib.h> #include <stdio.h> #include <time.h> int xy[22]; // 判断两个数是否互质 int isHuZhi(int …

Schnorr数字签名方案

Schnorr数字签名方案 Schnorr签名算法最初由德国密码学家claus schnorr于2008年提出&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单著称 Schnorr数字签名方案也是基于离散对数的&#xff08;基于离散对数的还有ElGamal数字签名方案、DSA数字签…

记录我看的密码学方案中的技术,Shamir秘密共享,Schnorr零知识证明,EIGamal密码体制

记录我看的论文中基于的技术&#xff0c;对他们进行大概介绍 Shamir 秘密共享方案零知识证明EIGamal密码体制 Shamir 秘密共享方案 1979年&#xff0c;Shamir提出的一个基于拉格朗日插值的(k,n)门限方案 目的&#xff1a;可以将秘密s分给n个成员&#xff0c;规定至少有k&#…

schnorr签名和batch verification

schnorr 签名 概念&#xff1a;Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单高效著称 原理&#xff1a;其安全性基于某些离散对数问题的难处理性。 签名过程&#xff1a; 和…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP&#xff0c;它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤&#xff08;承诺、挑战和证明&#xff09;&#xff0c;在文献中通常被称…

ECDSA VS Schnorr signature VS BLS signature

1. ECDSA ECDSA&#xff0c;全称为Elliptic curve Digital Signature Algorithm&#xff0c;采用Elliptic curve cryptography来实现的数字签名算法。 公私钥对 ( p k , P ) (pk,P) (pk,P)&#xff0c;其中公钥 P p k G Ppk\times G PpkG&#xff0c; G G G为所选椭圆曲线的…

BSV 上的 Schnorr 签名

我们已经在 BSV 上实现了 Schnorr 签名。这是第一个也是唯一一个已知的实现&#xff0c;没有对原始协议进行任何更改。 一笔交易一个签名 Schnorr 是一种可以用于替代比特币签名当前使用的 ECDSA 算法的替代算法。一个关键优势是&#xff0c;同一交易的一个输入或多个输入中的多…

深入浅出零知识证明(一):Schnorr协议

最近在学习零知识证明&#xff0c;因为内容很多并且难度也大&#xff0c;想根据自己的学习路线做一系列总结&#xff0c;这是第一篇文章&#xff0c;主要介绍零知识证明的一些重要概念和思想&#xff0c;可以对零知识证明有直观的理解&#xff0c;然后讲解一个经典简洁的零知识…

密码学——Schnorr签名算法

一、基本知识 1.1 概述 Schnorr签名算法最初是由德国密码学家ClausSchnorr于2008年提出的&#xff0c;在密码学中&#xff0c;它是一种数字签名方案&#xff0c;以其简单高效著称&#xff0c;其安全性基于某些离散对数问题的难处理性。 1.2 椭圆曲线上的计算 密码学中&…

什么是 Schnorr 签名?

在密码学中&#xff0c;Schnorr 签名是由 Schnorr 签名算法生成的数字签名。 与大多数区块链不同&#xff0c;BTC自其早期以来基本保持不变&#xff0c;大多数升级都是有限的&#xff0c;并旨在增强网络的效率而不是功能。BTC协议的更新是非常罕见的&#xff0c;并且通常用于技…

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

前言 Schnorr 签名算法最初是由德国密码学家 Claus Schnorr 于 2008 年提出的&#xff0c;而来自区块链协议公司 Blockstream 的密码学家 Gregory Maxwell、Pieter Wuille 等人&#xff0c;则在 2018 年提出了一种名为 MuSig 的 Schnorr 签名方案&#xff0c;这也是我们即将探索…

Schnorr身份识别方案

Schnorr身份识别协议是又一个零知识证明协议&#xff0c;相比Fiamt协议有两点不同&#xff0c;一是其安全性依赖于离散对数的困难性&#xff0c;二是该方案使用乘法群&#xff0c;从而可以提前计算了一些参数&#xff0c;减小了证明者实时计算开销&#xff0c;特别适合计算能力…

Schnorr协议:非交互零知识身份证明和数字签名

本文首发公众号区块链之美&#xff01;致力于区块链技术研究&#xff0c;传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。 摘要&#xff1a;本篇文章介绍Schnorr的两大应用场景&#xff1a;从交互式零知识身份证明到非交互零知识身份证明、数字签名实现基本原理…

matlab实现rrt算法

这一部分算法强烈推荐两篇博客&#xff0c;尤其是第一篇博客介绍算法的原理非常简单易懂&#xff1a; https://blog.csdn.net/weixin_43465857/article/details/96451631 https://www.cnblogs.com/long5683/p/11795987.html https://blog.csdn.net/aoyousihaiqiuqihuang/articl…