浅析IOTA中的WOTS签名
字数 2042 2025-08-18 11:36:57
Winternitz一次性签名(WOTS)在IOTA中的应用详解
1. IOTA简介
IOTA是一个面向物联网市场的分布式账本项目,具有以下特点:
- 数据结构:使用有向无环图(DAG)而非传统区块链,称为Tangle
- 交易机制:
- 免交易费
- 无矿工概念,用户自己验证交易并完成POW
- POW难度低,适合物联网设备
- 共识机制:目前依赖协调节点(coordinator node)防止51%攻击
- 三进制系统:
- 使用平衡三进制(-1[T],0,1)
- 基本单位:trit(三进制位)
- 1字节=3 trits=1 tryte(27种可能值)
- 使用26字母+数字9表示tryte
2. Hash签名基础
2.1 Lamport一次性签名(OTS)
密钥生成:
- 私钥:两串256个256bit随机数
- 公钥:对私钥所有随机数进行hash
签名过程:
- 计算消息M的hash H(M)
- 对H(M)的每个bit:
- bit=0:取私钥串1对应位置的随机数
- bit=1:取私钥串2对应位置的随机数
- 合并所选随机数作为签名
安全性:
- 每次签名暴露约50%私钥信息
- 地址不可重用,否则安全性急剧下降
3. Winternitz一次性签名(WOTS)
3.1 IOTA密钥生成
种子生成:
- 81 trytes长度(26字母+9)
- 生成命令示例:
cat /dev/urandom |tr -dc A-Z9|head -c${1:-81} # Linux cat /dev/urandom |LC_ALL=C tr -dc 'A-Z9' | fold -w 81 | head -n 1 # Mac
私钥派生:
- 安全等级(1/2/3)决定私钥长度:
- 总长度=2187×安全等级 trytes
- 默认安全等级为2
- 私钥划分:分成L=安全等级×27块,每块81 trytes
地址(公钥)生成:
- 对每块私钥进行26次hash
- 合并得到digest
- 对digest进行两次hash得到地址
3.2 WOTS签名过程
- 计算消息M的hash H(M)
- 将H(M)分成三部分,每部分27 trytes
- 计算每部分tryte值的和sum
- 调整每部分使sum=0:
- sum>0:从前往后递减tryte值
- sum<0:从前往后递增tryte值
- 得到normalized bundle hash
- 对每块私钥:
- 计算hash次数:Ni = 13 - TtoD(H[N])
- 对私钥块hash Ni次作为签名片段
- 合并所有签名片段得到完整签名
3.3 签名验证
- 将签名分成L块
- 对每块签名:
- 计算hash次数:Nj = 13 + TtoD(H[N])
- 对签名块hash Nj次
- 合并结果后两次hash,应与地址匹配
3.4 安全性分析
- 每次签名暴露私钥的约50%信息:
- 知道私钥块从13到26次的hash值
- 平均每块hash 13次
- 地址重用风险:
- 两次签名可暴露约75%私钥信息
- 可能伪造签名
4. IOTA交易结构
4.1 Bundle结构
- 类似比特币的UTXO模型
- 包含多个输入(Vin)和输出(Vout)交易
- 交易基本字段:
- hash:交易哈希
- signatureMessageFragment:签名片段
- address:地址
- value:交易值(负数为输入)
- currentIndex/lastIndex:在bundle中的位置
- bundle:bundle hash
- trunkTransaction/branchTransaction:批准的交易
- nonce:POW变量
4.2 签名处理
- 安全等级>1时,签名分成两部分:
- 一部分在输入交易(value为负)
- 另一部分在输出交易(value为0)
- 原因:IOTA交易固定为2673 trytes,需分割长签名
4.3 Bundle hash生成
使用以下字段生成:
- address
- value
- obsoleteTag
- timestamp
- currentIndex
- lastIndex
5. 安全漏洞与修复
5.1 原始漏洞
- 当normalized bundle hash的第一个tryte为'M'(13)时:
- 对应私钥块不进行hash(直接暴露)
- 可通过签名恢复完整私钥(因私钥生成方式)
- 发生概率:约4%
5.2 修复方案
计算normalized bundle hash时:
- 检查第一个tryte是否为'M'
- 如果是,将index=0交易的obsoleteTag加1
- 重新计算bundle hash
- 重复直到第一个tryte不为'M'
6. 地址重用问题
6.1 常规情况
- WOTS签名设计为一次性使用
- 重用地址会导致私钥信息过度暴露
6.2 特殊情况
- 协调节点使用Merkle OTS实现可重用地址
- 基于Merkle树
- 签名更长
- 快照机制可能导致地址重用:
- 定期清理Tangle,只保留有余额地址
- 需将余额为0的地址附加到Tangle
7. 总结
IOTA的WOTS签名方案特点:
- 基于hash,抗量子计算
- 三进制系统实现
- 一次性使用设计
- 需配合特定交易结构和安全措施
- 存在独特的安全考量与修复机制
关键注意事项:
- 绝对避免地址重用
- 注意安全等级选择
- 遵循官方种子生成规范
- 了解快照机制对地址的影响