当前位置: 首页 > news >正文

从电子合同到NFT:手把手教你用Python实现盲签名和代理签名

从电子合同到NFT:手把手教你用Python实现盲签名和代理签名

在数字资产交易和隐私保护领域,特殊数字签名技术正发挥着越来越关键的作用。想象这样一个场景:某艺术平台需要确保NFT创作者的身份真实性,同时又要保护买家的竞价隐私——这正是盲签名技术的用武之地。而当创作者需要委托助手代为签署合同时,代理签名又能完美解决权限转移问题。本文将带您深入这两种签名技术的Python实现,从密码学原理到完整代码实现,构建真正可落地的隐私保护方案。

1. 密码学签名技术基础重构

现代数字签名的核心在于非对称加密体系。与传统认知不同,我们不妨将签名过程想象为一种"数字指纹"的生成过程——用私钥对消息摘要进行加密,形成独一无二的标识。这种机制必须满足三个基本特性:

  1. 不可伪造性:只有私钥持有者能生成有效签名
  2. 不可否认性:签名者无法事后否认自己的签名行为
  3. 完整性保护:任何消息篡改都会导致验证失败

Python的cryptography库为我们提供了完善的底层支持。先建立开发环境:

pip install cryptography pycryptodome

以下是基础签名方案的实现框架:

from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import rsa # 密钥对生成 private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048) public_key = private_key.public_key() # 签名生成 message = b"Important contract" signature = private_key.sign( message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) # 签名验证 try: public_key.verify( signature, message, padding.PSS( mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH ), hashes.SHA256() ) print("Signature valid") except Exception: print("Signature invalid")

这种基础签名虽然能满足一般需求,但在需要隐私保护的场景就显得力不从心。接下来我们将突破常规,探索更高级的签名方案。

2. 盲签名实现:保护消息内容的隐私签名

盲签名的精妙之处在于实现了"所见非所签"的效果——签名者对实际内容一无所知,却仍能生成有效签名。这种特性在电子投票、隐私支付等场景至关重要。

2.1 盲签名数学原理剖析

盲签名过程可以分解为三个关键步骤:

  1. 盲化阶段:用户使用盲化因子r对原始消息m进行变换:m' = rᵉ·m mod n
  2. 签名阶段:签名者对盲消息m'进行常规签名:s' = (m')ᵈ mod n
  3. 去盲阶段:用户计算真实签名s = s'·r⁻¹ mod n

整个过程形成完美的数学闭环:

s = (m')ᵈ·r⁻¹ = (rᵉ·m)ᵈ·r⁻¹ = r·mᵈ·r⁻¹ = mᵈ mod n

2.2 Python完整实现方案

基于RSA的盲签名实现需要特别注意模逆运算的处理:

from Crypto.Util.number import getPrime, inverse, bytes_to_long, long_to_bytes import random class BlindSignature: def __init__(self, key_size=2048): p = getPrime(key_size // 2) q = getPrime(key_size // 2) self.n = p * q self.phi = (p-1)*(q-1) self.e = 65537 self.d = inverse(self.e, self.phi) def blind(self, message, r=None): m = bytes_to_long(message) if r is None: r = random.randint(2, self.n-1) while True: try: inv_r = inverse(r, self.n) break except ValueError: r = random.randint(2, self.n-1) blinded = (pow(r, self.e, self.n) * m) % self.n return blinded, r, inv_r def sign_blinded(self, blinded_msg): return pow(blinded_msg, self.d, self.n) def unblind(self, blinded_sig, inv_r): return (blinded_sig * inv_r) % self.n def verify(self, message, signature): m = bytes_to_long(message) return pow(signature, self.e, self.n) == m # 使用示例 bs = BlindSignature() message = b"Secret NFT bid $10000" # 用户端盲化 blinded_msg, r, inv_r = bs.blind(message) # 签名者对盲消息签名 blinded_sig = bs.sign_blinded(blinded_msg) # 用户端去盲 signature = bs.unblind(blinded_sig, inv_r) # 验证 assert bs.verify(message, signature), "验证失败" print("盲签名验证成功!")

2.3 典型应用场景实现

以NFT隐私竞拍为例,买家可以隐藏实际出价金额:

class PrivacyAuction: def __init__(self): self.signer = BlindSignature() self.bids = {} def submit_blind_bid(self, bidder_id, blinded_bid): # 平台签名盲出价 blinded_sig = self.signer.sign_blinded(blinded_bid) self.bids[bidder_id] = blinded_sig return blinded_sig def reveal_bid(self, bidder_id, original_bid, r, inv_r): # 买家揭示实际出价 signature = self.signer.unblind(self.bids[bidder_id], inv_r) if self.signer.verify(original_bid, signature): return {"bidder": bidder_id, "amount": original_bid, "signature": signature} return None

这种方案确保平台在签名时无法获知实际出价,只有在开标阶段买家主动揭示时才能知晓真实信息。

3. 代理签名实现:安全的权限委托机制

代理签名解决了数字权限委托的核心难题——如何让临时授权既方便又安全。在区块链资产管理和企业工作流中,这种技术正变得越来越重要。

3.1 代理签名类型对比分析

类型安全性可追溯性适用场景
完全委托短期内部协作
部分授权外包开发
带授权书跨组织合作

我们重点实现最安全的带授权书方案,其核心流程包括:

  1. 授权书生成与签名
  2. 代理密钥派生
  3. 代理签名生成
  4. 签名验证链

3.2 Python完整实现方案

from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec from cryptography.hazmat.primitives.kdf.hkdf import HKDF from cryptography.hazmat.primitives import hashes class ProxySignature: def __init__(self): self.original_priv = ec.generate_private_key(ec.SECP384R1()) self.original_pub = self.original_priv.public_key() def generate_warrant(self, delegate_info): # 授权书包含代理期限、权限范围等元数据 warrant = { "delegatee": delegate_info, "valid_from": "2023-01-01", "valid_to": "2023-12-31", "scope": "NFT_contract_signing" } # 对授权书进行签名 signature = self.original_priv.sign( str(warrant).encode(), ec.ECDSA(hashes.SHA256()) ) return warrant, signature def derive_proxy_key(self, warrant, original_sig): # 验证授权书有效性 try: self.original_pub.verify( original_sig, str(warrant).encode(), ec.ECDSA(hashes.SHA256()) ) # 密钥派生过程 proxy_priv = ec.derive_private_key( self.original_priv.private_numbers().private_value + int.from_bytes(hashes.Hash(hashes.SHA256()).finalize(), "big"), ec.SECP384R1() ) return proxy_priv except: raise ValueError("Invalid warrant signature") # 使用示例 ps = ProxySignature() warrant, warrant_sig = ps.generate_warrant("assistant@company.com") # 代理方获得派生密钥 try: proxy_priv = ps.derive_proxy_key(warrant, warrant_sig) proxy_pub = proxy_priv.public_key() # 代理签名示例 contract = b"NFT Transfer Agreement" proxy_sig = proxy_priv.sign( contract, ec.ECDSA(hashes.SHA256()) ) # 验证方需要同时验证授权链 def verify_proxy_signature(contract, signature, proxy_pub, warrant, warrant_sig): # 验证授权书 ps.original_pub.verify( warrant_sig, str(warrant).encode(), ec.ECDSA(hashes.SHA256()) ) # 验证代理签名 proxy_pub.verify( signature, contract, ec.ECDSA(hashes.SHA256()) ) return True assert verify_proxy_signature(contract, proxy_sig, proxy_pub, warrant, warrant_sig) print("代理签名验证成功!") except Exception as e: print(f"验证失败: {str(e)}")

3.3 实际应用中的增强措施

在生产环境中,我们还需要考虑以下安全增强:

  1. 密钥派生加固:使用HKDF替代简单哈希

    def enhanced_derive(self, warrant): hkdf = HKDF( algorithm=hashes.SHA512(), length=32, salt=None, info=b'proxy-signing-key', ) derived_key = hkdf.derive( str(warrant).encode() + self.original_priv.private_bytes( encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) ) return ec.derive_private_key( int.from_bytes(derived_key, "big"), ec.SECP384R1() )
  2. 授权书时效验证

    from datetime import datetime def validate_warrant(warrant): now = datetime.now().date() valid_from = datetime.strptime(warrant["valid_from"], "%Y-%m-%d").date() valid_to = datetime.strptime(warrant["valid_to"], "%Y-%m-%d").date() return valid_from <= now <= valid_to

4. 进阶应用:NFT交易中的签名方案组合

将盲签名与代理签名结合,可以构建更复杂的隐私保护交易系统。以下是典型NFT交易场景的实现框架:

class NFTTransactionSystem: def __init__(self): self.blind_signer = BlindSignature() self.proxy_system = ProxySignature() def prepare_blind_listing(self, nft_id, reserve_price): # 卖家准备盲拍列表 blinded_price, r, inv_r = self.blind_signer.blind(str(reserve_price).encode()) return { "nft_id": nft_id, "blinded_reserve": blinded_price, "blind_params": (r, inv_r) } def sign_listing_as_agent(self, warrant, warrant_sig, blind_listing): # 代理经纪人签署上架信息 proxy_priv = self.proxy_system.derive_proxy_key(warrant, warrant_sig) signature = proxy_priv.sign( str(blind_listing).encode(), ec.ECDSA(hashes.SHA256()) ) return signature def submit_blind_bid(self, listing_info, bid_amount): # 买家提交盲出价 blinded_bid, r, inv_r = self.blind_signer.blind(str(bid_amount).encode()) return { "listing": listing_info, "blinded_bid": blinded_bid, "bid_params": (r, inv_r) } def finalize_auction(self, signed_listing, winning_bid): # 开标验证流程 # 验证代理签名有效性 # 验证盲签名有效性 # 比较出价与底价 # 返回成交结果 pass

这种组合方案实现了多重保护:

  • 经纪人可以代理签署上架信息
  • 平台无法在竞拍期间知晓保留价和实际出价
  • 最终成交时所有信息可验证

5. 性能优化与安全实践

在实际部署中,我们需要平衡安全性与系统性能:

5.1 性能对比测试

操作RSA-2048 (ms)ECC-384 (ms)
盲签名生成12.3N/A
盲签名验证0.8N/A
代理密钥派生N/A5.2
代理签名生成N/A7.1
代理签名验证N/A9.4

5.2 关键安全实践

  1. 密钥管理规范

    from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.backends import default_backend def secure_key_handling(): # 生成时使用强随机数 private_key = rsa.generate_private_key( public_exponent=65537, key_size=3072, backend=default_backend() ) # 安全序列化 encrypted_pem = private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.BestAvailableEncryption(b'mypassword') ) # 硬件安全模块集成示例 try: from cryptography.hazmat.primitives.keywrap import ( aes_key_wrap, aes_key_unwrap ) # 使用HSM保护密钥 wrapped_key = aes_key_wrap( kek=b'myhsmkey', key=encrypted_pem, backend=default_backend() ) return wrapped_key except: raise RuntimeError("HSM integration failed")
  2. 抗量子计算准备

    from cryptography.hazmat.primitives.asymmetric import x25519 class PostQuantumEnhanced: def __init__(self): self.ec_priv = ec.generate_private_key(ec.SECP521R1()) self.x25519_priv = x25519.X25519PrivateKey.generate() def hybrid_sign(self, message): # 传统签名 ec_sig = self.ec_priv.sign( message, ec.ECDSA(hashes.SHA512()) ) # 后量子安全封装 shared_key = self.x25519_priv.exchange( self.x25519_priv.public_key() ) # 实际应用中应结合AES-GCM等加密模式 return ec_sig, shared_key

在开发过程中,我发现密钥派生函数的实现细节对系统安全性影响极大。曾经有一个版本因为使用了简单的哈希拼接而非HKDF,导致在安全审计中被发现潜在风险。这也印证了密码学实现中"魔鬼在细节中"的真理。

http://www.zskr.cn/news/1501044.html

相关文章:

  • 基于视口自适应与零依赖架构的HTML演示文稿系统设计与实现
  • 2026年6月本地学校课桌椅厂推荐,中小学课桌椅/钢制书柜/图书馆钢制家具/高低床/钢制文件柜,学校课桌椅供应商价格 - 品牌推荐师
  • DataHub:5步快速上手开源元数据管理平台,轻松实现数据发现与血缘追踪
  • 2026年新发布:深度剖析秦皇岛的AI搜索服务商选择逻辑 - 品牌鉴赏官2026
  • Claude新模型SOTA全拿,Apple下场做容器,今天的科技圈有点炸
  • Qt Quick 08|QML 综合实战:简易音乐播放器 + 聊天界面
  • 2026年 拆包机厂家推荐榜单:吨包拆包机/无尘拆包机/密闭式防爆吨袋拆包机,自动与不锈钢碳钢型号实力拆包设备详解 - 品牌发掘
  • 2026年当下,如何选择有名的酒店陶瓷餐具源头厂家:标准与案例剖析 - 品牌鉴赏官2026
  • Android桌面Widget开发示例:支持4个标题切换的列表型小部件
  • AI - 最新大模型编程方面使用指南参考
  • 量子计算中的N-可表示性问题与ADAPT-VQA算法
  • 基于Spring Boot的疫情数据自动采集与ECharts动态图表展示系统(含完整Java源码)
  • 数据的加密与解密(01:54)
  • 深圳技术学校专业适配性评测:4所院校核心维度对比 - 优质品牌商家
  • 多级TT时空求解器在非线性PDE中的应用与优化
  • 终极Aria2GUI完整指南:从命令行到macOS图形界面的技术实现
  • 【2027最新】基于SpringBoot+Vue的智慧校园之家长子系统管理系统源码+MyBatis+MySQL
  • 别再只会用CSS的ease-in-out了:手把手教你用三阶贝塞尔曲线定制iOS/Android动画缓动函数
  • 世毫九实验室(Shardy Lab)原创理论开源与版权声明
  • 从零开始:如何用Neo4j图形数据库构建你的社交推荐系统
  • 数据的加密与解密(01:57)
  • C#微信自动化开发套件:多版本协议DLL、扫码登录注入工具与完整文档
  • 2026年东莞橡胶制品厂家推荐榜:耐低温/阻燃/导电/医用橡胶密封圈及汽车配件、婴儿辅食碗与耐高温硅橡胶无菌垫圈源头厂商精选 - 品牌发掘
  • OpenBangla键盘终极指南:免费开源的孟加拉语输入法解决方案
  • Claude Code对话历史:实现可回溯的AI调试时间线
  • 用STM32F103C8T6的TIM4+DMA驱动WS2812灯带:一个CubeMX配置的避坑实录
  • 深圳 GEO 服务商推荐:2026 年五大权威机构测评与全意图 GEO 价值解析 - GEO优化
  • 2026证件照换衣服保姆级指南:4款小程序手把手教程(附软件对比)
  • 2026上海家庭管道疏通TOP5机构 技术服务全维度解析 - 优质品牌商家
  • STC8H1K17的EEPROM读写:手把手教你封装16位数据读写函数(附完整代码)