You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 04:15:39