python winternitz一次性签名(+)实现
winternitz的Python项目详细描述
Winternitz一次性签名
winternitz一次性签名方案的python实现
说明
winternitz一次性签名是lamport一次性签名的扩展。 此python包可用于执行wots操作,包括 密钥生成、签名生成和签名验证。 目前,wots和wots+已经实现。
简介
兰波特在1979年发明了一种算法,允许人们创建一次性签名。 使用加密安全的单向函数。这是温特尼茨的基础 一次性签名算法。温特尼茨增加了调整折衷方案的可能性。 介于时间和空间的复杂性之间。
lamport一次性签名方案
兰波特建议为消息的每一位创建两个密钥,这将 签字。每一位可以取一个值。要导出验证密钥, 每个密钥都经过一次哈希运算。现在你有一把密钥和一把验证密钥, 它由 m 2元组值组成,其中 m 是数值 信息的比特数。验证密钥已发布。 签名由 m 值组成。对于您从中释放密钥的消息的每一位 相应的密钥,取决于该位具有的值。所有这些秘密 密钥构成消息的签名。验证器对每个密钥进行哈希运算 一次并将其与此位置的一个验证密钥进行比较,具体取决于值 比特的。如果且仅当所有派生的验证密钥与 您发布的验证密钥位于2元组的正确位置,该位置由 比特的。这个算法很快 (与现有的pqc算法相比),但是签名的大小是巨大的。
winternitz扩展lamports算法提供了决策的可能性 有多少位将一起签名。这些位可以 表示被称为winternitz参数( w=2^{bits} )。这种方法提供了 此算法的用户可以选择时间和空间折衷的优点 (不管是速度还是存储容量更重要)。信息的指纹 将签名分成 组ceil(log 2(w)) 位。每个组都有一个密钥。 每个验证密钥都是通过对每个组的密钥进行哈希运算而得到的。所有验证 密钥将被发布并表示一个统一的验证密钥。在签署消息时, 消息的指纹被分成 ceil(log2(w)) 位组。要创建签名, 对每个位组的私钥进行散列 位组值 次,其中 位组值 是值 比特组的。另外附加了一个(反和)校验和,它拒绝中间人 攻击。校验和由签名计算,分成 ceil(log2(w)) 位的位组,并且 签署。为了验证签名,消息的指纹首先被分成 ceil(log2(w) 每个比特。基本思想是取每个位组的签名,计算验证密钥 最后将其与发布的验证密钥进行比较。因为签名是散列的 位组值 次,从签名计算验证密钥所需做的一切 就是散列签名 2^{w-1}-bitgroup\u value-1 次。除了验证消息之外,验证程序 还必须计算校验和并进行验证。
设置
需要:python>;=3.4
< div >