浅析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

签名过程

  1. 计算消息M的hash H(M)
  2. 对H(M)的每个bit:
    • bit=0:取私钥串1对应位置的随机数
    • bit=1:取私钥串2对应位置的随机数
  3. 合并所选随机数作为签名

安全性

  • 每次签名暴露约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

地址(公钥)生成

  1. 对每块私钥进行26次hash
  2. 合并得到digest
  3. 对digest进行两次hash得到地址

3.2 WOTS签名过程

  1. 计算消息M的hash H(M)
  2. 将H(M)分成三部分,每部分27 trytes
  3. 计算每部分tryte值的和sum
  4. 调整每部分使sum=0:
    • sum>0:从前往后递减tryte值
    • sum<0:从前往后递增tryte值
  5. 得到normalized bundle hash
  6. 对每块私钥:
    • 计算hash次数:Ni = 13 - TtoD(H[N])
    • 对私钥块hash Ni次作为签名片段
  7. 合并所有签名片段得到完整签名

3.3 签名验证

  1. 将签名分成L块
  2. 对每块签名:
    • 计算hash次数:Nj = 13 + TtoD(H[N])
    • 对签名块hash Nj次
  3. 合并结果后两次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时:

  1. 检查第一个tryte是否为'M'
  2. 如果是,将index=0交易的obsoleteTag加1
  3. 重新计算bundle hash
  4. 重复直到第一个tryte不为'M'

6. 地址重用问题

6.1 常规情况

  • WOTS签名设计为一次性使用
  • 重用地址会导致私钥信息过度暴露

6.2 特殊情况

  • 协调节点使用Merkle OTS实现可重用地址
    • 基于Merkle树
    • 签名更长
  • 快照机制可能导致地址重用:
    • 定期清理Tangle,只保留有余额地址
    • 需将余额为0的地址附加到Tangle

7. 总结

IOTA的WOTS签名方案特点:

  • 基于hash,抗量子计算
  • 三进制系统实现
  • 一次性使用设计
  • 需配合特定交易结构和安全措施
  • 存在独特的安全考量与修复机制

关键注意事项:

  • 绝对避免地址重用
  • 注意安全等级选择
  • 遵循官方种子生成规范
  • 了解快照机制对地址的影响
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) 生成命令示例: 私钥派生 : 安全等级(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,抗量子计算 三进制系统实现 一次性使用设计 需配合特定交易结构和安全措施 存在独特的安全考量与修复机制 关键注意事项: 绝对避免地址重用 注意安全等级选择 遵循官方种子生成规范 了解快照机制对地址的影响