盲签名 blind signature

本文深入探讨了盲签名的概念及其在数字签名中的重要性,详细介绍了基于RSA和BLS签名的盲签名实现过程。通过实例展示了盲签名如何确保签名者对消息内容的不可见性和消息不可追踪性。同时,分析了基于RSA的盲签名存在的安全问题,如RSA盲签名攻击,并阐述了如何利用这种攻击解密消息。此外,还提到了BLS签名作为替代方案在盲签名中的应用。
摘要由CSDN通过智能技术生成

1. 引言

前序博客有:

盲签名(blind signature)为:
一种数字签名的方式,在消息内容被签名之前,对于签名者来说消息内容是不可见的。

类比例子:对文件签名就是通过在信封里放一张复写纸,签名者在信封上签名时,他的签名便透过复写纸签到文件上。

盲签名除具有普通数字签名特征之外,还额外具有如下特征:

  • 1)签名者对其所签署的消息是不可见的,即签名者不知道其所签署消息的具体内容。
  • 2)签名消息不可追踪,即当签名消息被公开时,签名者无法知道其哪次签署了该消息。

盲签名的基本流程为:
在这里插入图片描述
实现盲签名的方案主要有:

  • 基于RSA的盲签名
  • 基于BLS-signature的盲签名

2. 基于RSA的盲签名

基本背景参看:

( e , n ) (e,n) (e,n)为公钥, d d d为私钥,其中 e d ≡ ( p − 1 ) ( q − 1 ) m o d    n ed\equiv (p-1)(q-1)\mod n ed(p1)(q1)modn m ∈ [ 0 , n − 1 ] m\in[0,n-1] m[0,n1]为待签名消息。
为让签名者不知道所签名的消息 m m m,需引入一个参数 r r r(仅用户可知),使得 g c d ( r , n ) = 1 gcd(r,n)=1 gcd(r,n)=1
基于RSA的盲签名流程为:

  • 1)用户blinding消息: m ′ ≡ m r e ( m o d    n ) m'\equiv mr^e(\mod n) mmre(modn)
  • 2)签名者对已盲化的消息进行签名: s ′ ≡ ( m ′ ) d ( m o d    n ) s'\equiv(m')^d(\mod n) s(m)d(modn)
  • 3)用户收到签名后进行unblinding操作: s ≡ s ′ ⋅ r − 1 ( m o d    n ) s\equiv s'\cdot r^{-1}(\mod n) ssr1(modn)
  • 4)任何人,采用公钥 ( e , n ) (e,n) (e,n),可对 m m m s s s验签: s e ≡ m e d ( m o d    n ) = m ( m o d    n ) s^e\equiv m^{ed}(\mod n)=m(\mod n) semed(modn)=m(modn)

基于RSA的盲签名方案有效的原因是:
r e d ≡ r ( m o d    n ) r^{ed}\equiv r(\mod n) redr(modn)
s ≡ s ′ ⋅ r − 1 ≡ ( m ′ ) d r − 1 ≡ m d r e d r − 1 ≡ m d r r − 1 ≡ m d ( m o d    n ) s\equiv s'\cdot r^{-1}\equiv (m')^dr^{-1}\equiv m^dr^{ed}r^{-1}\equiv m^drr^{-1}\equiv m^d(\mod n) ssr1(m)dr1mdredr1mdrr1md(modn)

基于RSA的盲签名存在的一个问题是:
通过RSA blinding attack,可能可利用盲签名将一个消息解密为另一消息。
因为盲签的过程等价为使用签名者使用私钥 d d d解密的过程,攻击者可提供已 经签名者公钥加密的消息 m ′ = m e m'=m^e m=me,具体流程为:

  • 1)攻击者blinding消息: m ′ ′ ≡ m ′ r e ( m o d    n ) ≡ ( m e ( m o d    n ) ⋅ r e ) ( m o d    n ) = ( m r ) e ( m o d    n ) m''\equiv m'r^e(\mod n)\equiv (m^e(\mod n)\cdot r^e)(\mod n)=(mr)^e(\mod n) mmre(modn)(me(modn)re)(modn)=(mr)e(modn)
  • 2)签名者签名: s ′ ≡ ( m ′ ′ ) d ( m o d    n ) ≡ ( ( m r ) e ( m o d    n ) ) d ( m o d    n ) ≡ ( m r ) e d ( m o d    n ) ≡ m ⋅ r ( m o d    n ) s'\equiv (m'')^d(\mod n)\equiv ((mr)^e(\mod n))^d(\mod n)\equiv (mr)^{ed}(\mod n)\equiv m\cdot r (\mod n) s(m)d(modn)((mr)e(modn))d(modn)(mr)ed(modn)mr(modn)
  • 3)攻击者unblinding: s ≡ s ′ ⋅ r − 1 ( m o d    n ) ≡ m ( m o d    n ) ≠ m ′ s\equiv s'\cdot r^{-1}(\mod n)\equiv m(\mod n)\neq m' ssr1(modn)m(modn)=m。本来发送给签名者的加密消息 m m m应只有签名者通过私钥获知,而此时攻击者借助盲签名,获知了相应的加密消息 m m m

3. 基于BLS-signature的盲签名

基本背景参看:

参考资料

[1] Which blind signature schemes exist, and how do they compare?
[2] 维基百科 Blind signature
[3] 盲签名 blind signature 简介

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
RSA部分签名算法是一种基于RSA签名算法的签名方案,它可以在不泄露用户私钥的前提下,实现对用户消息的签名。下面是RSA部分签名算法的设计与实现步骤: 1. 生成RSA密钥对。与普通的RSA签名算法一样,首先需要生成RSA密钥对,包括公钥和私钥。其中,公钥包括模数N和指数e,私钥包括模数N和指数d。 2. 随机生成因子r。因子r是一个随机数,用于将用户的消息化,使得签名过程不可逆。 3. 将因子r与用户的消息做异或运算。假设用户要签名的消息为M,那么化后的消息为M' = M XOR r。 4. 使用私钥对化后的消息进行签名。首先需要对化后的消息进行RSA加密,得到加密结果C = (M XOR r)^d mod N,然后将加密结果C作为签名返回给用户。 5. 用户将签名因子r一起发送给验证者。用户发送的签名为(C, r),验证者可以使用公钥进行解密得到消息的哈希值H = C^e mod N,然后将哈希值与用户的消息做比较,如果相等则验证通过。 需要注意的是,在签名过程中,因子r不能泄露给验证者,否则验证者可以通过反推用户的私钥来伪造签名。因此,在实现过程中需要确保因子r只由用户掌握,不会被泄露。 代码实现如下: ```python import random from Crypto.Util import number # 生成RSA密钥对 def generate_key(key_size): p = number.getPrime(key_size//2) q = number.getPrime(key_size//2) n = p * q phi = (p - 1) * (q - 1) e = 65537 d = number.inverse(e, phi) return (n, e), (n, d) # 化消息 def blind_message(m): r = random.randint(2, n - 1) m_blind = m ^ r return m_blind, r # 签名消息 def sign_message(m): m_blind, r = blind_message(m) c = pow(m_blind, d, n) return c, r # 验证签名 def verify_signature(m, c, r, e, n): m_blind = pow(c, e, n) m = m ^ r if m_blind != m: return False else: return True # 测试 if __name__ == '__main__': key_size = 1024 message = b'Hello, world!' public_key, private_key = generate_key(key_size) n, e = public_key n, d = private_key c, r = sign_message(int.from_bytes(message, 'big')) if verify_signature(int.from_bytes(message, 'big'), c, r, e, n): print('Signature verified.') else: print('Invalid signature.') ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值