如何在Python 3+中使用PyCrypto实现消息盲化?
RSA盲化签名实现(基于PyCryptodome)
PyCryptodome的pkcs1_15模块没有提供现成的blind()/unblind()方法,但我们可以基于RSA盲化签名的数学原理手动实现——核心是通过随机盲化因子对消息的PKCS#1 v1.5填充哈希进行处理,让签名方无法获知原始消息内容,最终去除盲化后得到的签名仍可通过标准pkcs1_15流程验证。
完整实现代码
from Crypto.PublicKey import RSA from Crypto.Hash import SHA256 from Crypto.Util.number import getPrime, inverse, GCD from Crypto.Util.asn1 import DerSequence import math # 1. 生成RSA密钥对(3072位,符合示例规格) private_key = RSA.generate(3072) public_key = private_key.publickey() n = public_key.n # RSA模数 e = public_key.e # 公钥指数 d = private_key.d # 私钥指数 em_len = (n.bit_length() + 7) // 8 # 签名的字节长度 # ---------------------- # 请求方(持有公钥,需盲化消息)操作 # ---------------------- # 原始消息 message = "需要进行盲化签名的敏感内容".encode('utf-8') # 计算消息哈希 hash_obj = SHA256.new(message) hash_bytes = hash_obj.digest() # 构造SHA256的ASN.1 DER编码(PKCS#1 v1.5填充要求) der = DerSequence([ DerSequence([ b'\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01', # SHA256的OID b'\x05\x00' ]), hash_bytes ]) t = der.encode() # 执行PKCS#1 v1.5填充,得到待签名的整数 em = b'\x00\x01' + b'\xff' * (em_len - len(t) - 3) + b'\x00' + t em_int = int.from_bytes(em, byteorder='big') # 生成盲化因子r:必须与模数n互质 while True: r = getPrime(math.floor(math.log2(n))) if GCD(r, n) == 1: break # 计算盲化后的待签名整数:m_blind = (em_int * r^e) mod n r_pow_e = pow(r, e, n) m_blind = (em_int * r_pow_e) % n # ---------------------- # 签名方(持有私钥)操作 # ---------------------- # 对盲化后的内容签名(RSA私钥运算:s_blind = m_blind^d mod n) s_blind = pow(m_blind, d, n) # ---------------------- # 请求方去盲化,得到原始消息的合法签名 # ---------------------- # 计算盲化因子的模逆元 r_inv = inverse(r, n) # 去盲化得到标准PKCS#1 v1.5签名 signature_int = (s_blind * r_inv) % n signature_bytes = signature_int.to_bytes(em_len, byteorder='big') # ---------------------- # 验证签名(标准pkcs1_15流程) # ---------------------- try: pkcs1_15.new(public_key).verify(hash_obj, signature_bytes) print("盲化签名验证通过!") except ValueError: print("盲化签名验证失败!")
关键说明
- 盲化因子要求:必须选择与RSA模数
n互质的随机数,否则无法计算逆元完成去盲化操作。 - PKCS#1 v1.5填充:盲化前必须对哈希进行标准填充,确保最终签名符合
pkcs1_15的验证规范。 - 安全性:盲化因子
r必须是随机且保密的,泄露会导致原始消息内容被签名方获知。
内容的提问来源于stack exchange,提问作者Tom Cusack-Huang
相关产品推荐
相关产品推荐

