我试图逐步理解ECDSA签名的过程。函数应该如下所示:S = k^-1 (hash + dA * R) mod p,但我试图了解是否正确地实现了它。为了运行一个例子,我将借用比特币的一个实际用例。
变量如下:hash: 13981225937542801152472832285710043259607809420725863171548640618989758767092 k: 11253563012059685825953619222107823549092147699031672238385790369351542642469 dA: 32678163117146052705943574521051490808324525286453391448021727749576063492292 p: 115792089237316195423570985008687907853269984665640564039457584007908834671663 R: 36422191471907241029883925342251831624200921388586025344128047678873736520530
第一部分我试着理解,k^-1是什么意思。它是否是k的反转版本(与生成公钥时使用的方式相同)?假设是这样的话,我们将得到以下等式:
S = 46845980742442032273496636384730466168994452136155887088844811385771348454723 * (13981225937542801152472832285710043259607809420725863171548640618989758767092 + 32678163117146052705943574521051490808324525286453391448021727749576063492292 * 36422191471907241029883925342251831624200921388586025344128047678873736520530) MOD 115792089237316195423570985008687907853269984665640564039457584007908834671663
这给了我们47948206650808861643197644356522075407904568696590364200235146232910054391376和十六进制:6A01B9263C7233181FEE2661C53E75C14312A7F4A2426EAEEA3502DCC40F7E50。
然而,它的长度似乎只有有效签名的一半。我数学做得对吗?这仅仅是签名的一部分,其余的是单独生成的吗?
发布于 2018-01-13 13:46:09
$k^{-1}$是什么意思?
在这个问题的公式$S=k^{-1}(\mathrm{散列}+d_A\cdot R)\bmod p$中,$k^{-1}$是$k$模$p$的(或)乘法逆。根据定义,这是一个整数$i$,使得$(i\cdot k ) \equv1\pmod$,即整数$i$,使得$p$除以$(i\cdot k)-1$ (或者如果我们想要乘法逆,另外$i$必须是这样的$0
$k^{-1}$可以使用(半)扩展欧几里得算法(见这 )或其他方法计算。无论使用什么,问题都有$S$匹配$k$、$\mathrm{hash}$、$d_A$、$R$和$p$,以及给出的方程。但请看下面为什么$S$是错的。
它的长度似乎只有有效签名的一半。
确实如此。这是因为签名是$(R,S),每个约定都是$(R,S);就像固定长度八进制字符串的级联,表示每个大端约定的$R$和$S$,可能带有前缀。
对方程的评述
哦,我一开始就错过了:这个问题的方程$S=k^{-1}(\mathrm{+d_A\cdot}+d_A\cdot R)\bmod p$是错的!字段的阶$p$ (用于椭圆曲线secp256k1上的坐标)和椭圆曲线上的点$G$的阶$n$ (对于secp256k1也是椭圆曲线上的点数,包括无穷远点)之间存在混淆。正确的方程是$S=k^{-1}(\mathrm{散列}+d_A\cdot R)\bmod n$。对于secp256k1,$n$是115792089237316195423570985008687907852837564279074904382605163141518161494337。当然,这会改变$S$。
如果方程只给我们$R$,我们怎么能得到$S$?
我们使用方程$S=k^{-1}(\mathrm{散列}+d_A\cdot R)\bmod n$从$k$、$\mathrm{hash}$、$d_A$、$R$和$n$得到了$k$。
我们以前必须通过计算$R$ G$来获得$k\times。这是通过椭圆曲线secp256k1上的点乘,使用算术模$p$ (这不是一个错误),保持$X$坐标,并推导$R$。规范的方法是计算$R=X\bmod n$ (在减少了$X$模$p$,使$0\le X
更新:我确认问题的$R$与问题的$k$匹配。因此,剩下的工作就是使用适当的模数计算$S$,并将$(R,S)$格式化为签名。
https://crypto.stackexchange.com/questions/54655
复制相似问题