首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算有效签名?

如何计算有效签名?
EN

Ethereum用户
提问于 2021-10-01 13:58:05
回答 1查看 237关注 0票数 0

我正在尝试创建一个在https://etherscan.io/verifySig上有效的签名,但它总是显示我的签名无效:

我创建了一个随机的私钥和公钥:

代码语言:javascript
复制
private key: 0xb9b2098efa21fd9fa0595c589c8487af8e2feb96569d8ed7dea3d3942f9e86ee
public key: 0x9b6eafcfec58f95f3771d5c2f9042ff80e491fd04a3aa1a847e7fd8442f1ee8c197f65b0d783b8a6f4c5d5ceaa4c027bc7e3ee36706af488972690fab52434b3

地址应为:

代码语言:javascript
复制
address: 0x98f13dc425811444c9c288cf366acfaf7e3b6d52

现在,我尝试使用这里提供的公式:Test_Signature来签署消息“https://cryptobook.nakov.com/digital-signatures/ecdsa-sign-verify-messages

消息哈希是用eth_utils计算的:

代码语言:javascript
复制
msg = b"Test_Signature"
h = eth_utils.keccak(msg)
h = int.from_bytes(h, "big")

在生成随机整数之后,我使用这些方程直接计算rsv

代码语言:javascript
复制
from tinyec.ec import SubGroup, Curve


# secp256k1 properties
p = 115792089237316195423570985008687907853269984665640564039457584007908834671663
n = 115792089237316195423570985008687907852837564279074904382605163141518161494337
G = (55066263022277343669578718895168534326250603453777594175500187360389116729240, 32670510020758816978083085130507043184471273380659243275938904335757337482424)

field = SubGroup(p=p, g=G, n=n, h=1)
curve = Curve(a=0, b=7, field=field, name='secp256k1')

# private key
priv_key = 83992441735806437997249052063040008803625856260092149954869332104473242142446

# public key
P = (70304058118741863582262393380291673246306160516057781381001139033552194760332, 11532912635836483492238225363108614691575607518644120117126194555700524627123)

# message hash
h = 87606763373646199415553583347194012180136404149033607198826021616865742156857

# random integer
k = 3721177852896846111935695432081468296180303375615453253386435739478984180396

R = k * curve.g
r = R.x
v = 27 + (R.y % 2)
s = pow(k, -1, n) * (h + r*priv_key) % n

产出如下:

代码语言:javascript
复制
r: 29336491788943161357283692504069157144877470785894834840899135746381367540519
v: 27
s: 12775157475818852054720297346653863004672088843187914057777144577979593234619
r:  0x40dbddadd4d5faf1743ff01ddae18d12d5a61b3b230aee8dbb06b7179c20fb27
s:  0x1c3e7b9eda633d88aceff79ca9887e88022f1aeca2813784250e8ff4b62398bb
v:  0x1b
signature: 40dbddadd4d5faf1743ff01ddae18d12d5a61b3b230aee8dbb06b7179c20fb271c3e7b9eda633d88aceff79ca9887e88022f1aeca2813784250e8ff4b62398bb1b

为什么该签名在网站上被标记为无效?计算中有错误吗?

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-10-02 12:17:06

问题在于计算错误的地址。

代码语言:javascript
复制
signerPrivKey = eth_keys.keys.PrivateKey(priv_key.to_bytes(32, "big"))
signerPubKey = signerPrivKey.public_key
print("address: ", signerPubKey.to_checksum_address())
#address:  0xE144236EFb7932bDaE617eBAAFD24aF962152c77
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/110873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档