规约证明(二):基于游戏证明数字签名方案的安全性 - 实践

什么是数字签名?

借用书里面给的一个例子,倘若两个参与方,分别为A l i c e AliceAliceB o b BobBobA l i c e AliceAlice想要让B o b BobBob相信一条消息m mm是她发送的。如何操作?

一种简单的方法是使用公钥加密。

  1. A l i c e AliceAlice首先生成一对公私钥( p k , s k ) (pk,sk)(pk,sk)并把公钥p k pkpk公开给B o b BobBob
  2. A l i c e AliceAlice使用自己的私钥s k sksk对消息m mm进行签名得到σ m \sigma_mσm
  3. B o b BobBob接收到( m , σ m ) (m,\sigma_m)(m,σm)之后,使用Alice的公钥p k pkpk验证σ m \sigma_mσm是否正确。

具体的构造方案,可以使用RSA,RSA的详细过程参考这一篇博客RSA加密。下面直接分析过程。

  1. A l i c e AliceAlice生成RSA公钥n , d n,dn,d并公开给B o b BobBob,保留私钥e ee
  2. A l i c e AliceAlice使用自己的私钥e ee对消息m mm进行签名得到σ m = m e mod n \sigma_m=m^e\ \text{mod}\ nσm=memodn
  3. B o b BobBob接收到( m , σ m ) (m,\sigma_m)(m,σm)之后,启用Alice的公钥n , d n,dn,d验证( σ m ) d mod n = m (\sigma_m)^d\ \text{mod}\ n=m(σm)dmodn=m
正确性验证

( σ m ) d mod n = m d e mod n = m φ ( n ) k + 1 mod n = m φ ( n ) k ∗ m mod n = m (\sigma_m)^d\ \text{mod}\ n=m^{de}\ \text{mod}\ n=m^{\varphi (n)k+1}\text{mod}\ n=m^{\varphi (n)k}*m\ \text{mod}\ n=m(σm)dmodn=mdemodn=mφ(n)k+1modn=mφ(n)kmmodn=m

安全性验证

B o b BobBob始终不知道A l i c e AliceAlice的私钥e ee。所以签名方案是安全的。

形式化的签名方案(共有四个算法)

  1. 系统生成算法(SysGen):输入一个安全参数λ \lambdaλ,返回一个系统参数S P SPSP
  2. 密钥生成算法(KeyGen):输入系统参数S P SPSP,返回公私钥对( p k , s k ) (pk,sk)(pk,sk)
  3. 签名算法(sign):输入消息m mm,私钥s k sksk和系统参数S P SPSP。返回m mm的签名σ m \sigma_mσm
  4. 验证算法(Verify):输入( m , σ m ) (m,\sigma_m)(m,σm),公钥p k pkpk和系统参数S P SPSP。如果σ m \sigma_mσmm mm的有效签名返回a c c e p t acceptaccept;否则r e j e c t rejectreject

正确性要求给定任何( p k , s k , m , σ m ) (pk,sk,m,\sigma_m)(pk,sk,m,σm),如果σ m \sigma_mσmm mm的一个有效签名(使用私钥s k sksk),那么验证算法(Verify)将会返回a c c e p t acceptaccept

安全性要求在没有私钥s k sksk的情况下,对于概率多项式敌手(PPT)想要伪造一个消息m mm的签名σ m \sigma_mσm很困难的。就是来通过验证

如何证明一个签名方案是安全的?

基于游戏的证明方法
假设存在挑战者C \mathcal CC与敌手A \mathcal AA。二者的关系是挑战者生成一个签名方案,而敌手去试图打破这个签名方案。二者进行如下交互

  1. 挑战者C \mathcal CC起初生成一对公私钥( p k , s k ) (pk,sk)(pk,sk),把公钥p k pkpk发给敌手,私钥自己保留。
  2. A \mathcal AA可以对任意消息做签名的问询。
  3. A \mathcal AA返回一个未被问询过的新消息的伪造签名。

选择消息攻击下存在性不可伪造安全模型(EU-CMA:Existential unforgeability against chosen-message attacks)的描述如下

  1. 初始化:令S P SPSP为系统参数。挑战者C \mathcal CC运行密钥生成算法(KeyGen)得到公私钥对( p k , s k ) (pk,sk)(pk,sk),把公钥p k pkpk发给敌手A \mathcal AA,挑战者保留私钥s k sksk来回应敌手对消息的签名问询。
  2. 问询:敌手对任意选择消息做出问询。对于消息m i m_imi的签名问询,C \mathcal CC运行签名算法(sign)计算σ m i \sigma_{m_i}σmi并返回给敌手。
  3. 伪造:如果敌手可以返回一个对消息m ∗ m^*m的伪造签名σ m ∗ \sigma_{m^*}σm(m ∗ m^*m在问询阶段没有被敌手问询过且σ m ∗ \sigma_{m^*}σmm mm的一个奏效签名),则敌手赢得游戏。

设敌手赢得游戏的概率为ϵ \epsilonϵ。交互流程图如下:
在这里插入图片描述

给一个定义。这里直接贴原文。

在这里插入图片描述

下面还有一个在选择消息攻击下强不可伪造安全(SU-CMA)的定义。

在这里插入图片描述

二者的重要区别在于(SU-CMA)放宽了对消息m ∗ m^*m通过的 限制,只要敌手能够伪造
出一个实用的签名σ m ∗ \sigma_{m^*}σm即可。m ∗ m^*m行是除了敌手问询过的任意消息。

posted @ 2025-12-25 19:37  yangykaifa  阅读(4)  评论(0)    收藏  举报