盲签名 blind signature 简介

盲签名(Blind Signature)定义

是一种数字签名的方式,在消息内容被签名之前,对于签名者来说消息内容是不可见的.
类比例子:对文件签名就是通过在信封里放一张复写纸,签名者在信封上签名时,他的签名便透过复写纸签到文件上。


盲签名(Blind Signature)性质

它除了满足一般的数字签名条件外,还必须满足下面的两条性质:

  1. 签名者对其所签署的消息是不可见的,即签名者不知道他所签署消息的具体内容。
  2. 签名消息不可追踪,即当签名消息被公布后,签名者无法知道这是他哪次的签署的。


盲签名(Blind Signature)模型

  1. 接收者首先将待签数据进行盲变换,把变换后的盲数据发给签名者。
  2. 经签名者签名后再发给接收者。
  3. 接收者对签名再作去盲变换,得出的便是签名者对原数据的盲签名。
  4. 这样便满足了条件①。要满足条件②,必须使签名者事后看到盲签名时不能与盲数据联系起来,这通常是依靠某种协议来实现的。

大致的图示如下:




盲签名(Blind Signature)--RSA方案

传统的 RSA 方案大致过程如下(前提条件就没有列出):

加密:

解密:

签名者一般是基于消息的哈希值签名的,对于盲签名的要求,唯一不能满足的就是"签名者"事先会知道消息.所以RSA盲签名方案做了巧妙的转变.就是首先将消息 m 转化为 m`, 在此需要一个参数 r , gcd(r, N)=1. 然后就进入传统的 RSA 过程了.

  1. 盲化消息:
  2. 签名消息:
  3. 除盲消息:

这个方案有效的原因是:
                  
                 


盲签名(Blind Signature)--RSA方案的致命缺点(待续)

本文译自:http://en.wikipedia.org/wiki/Blind_Signatures,部分参考的百度百科.

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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.') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值