我正在尝试在python中实现给定的DSA签名生成指令,在步骤3和步骤4中,很少有指令是我无法理解的。
让我是一个任意长度的消息。签名计算如下:
hashlib.sha3_256(input)函数的输入应该是什么?正如我在Python中看到的,它说输入必须是字符串(转换为字节)。发布于 2018-12-11 13:36:10
\parallel符号意味着级联。在本例中,使用消息m (它是一个位序列),将值r编码为一个位序列,并散列包含在m中的位序列,然后是编码的r。
在步骤4中,您有一个位序列(散列输出),您必须以某种方式将其转换回整数。这又是一个编码问题,但这次是在解码方向上。这里的基本主题是,您必须有一些约定,允许您将整数编码为位,并将位解码为整数。从安全的角度来看,约定的选择或多或少是开放的,但它当然是算法规范的一部分:签名者和验证者必须就这些细节达成一致,否则验证者将不会接受签名者产生的签名的有效性。
顺便说一下,这不是每日生活津贴。数字减影血管造影由FIPS 186-4指定。您所描述的是施诺尔签名 (有几个变体,例如级联中的m和r的顺序,或者是s = \alpha h + k还是s = \alpha h - k;所有这些变体都或多或少地获得了等价的安全性)。从历史上看,区别是很重要的: DSA是在Schnorr申请他的计划专利的时候定义的,DSA的定义是为了避免这一专利而精心制定的。在密码学上,区别也很重要: Schnorr签名的“安全图片”更好(我们可以对Schnorr签名进行安全证明,但我们不知道如何使用DSA;DSA签名是可扩展的,通常是无害的,但过去允许在比特币中重播攻击)。
https://crypto.stackexchange.com/questions/64763
复制相似问题