首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从没有web3j的ECDSA签名中派生v值

从没有web3j的ECDSA签名中派生v值
EN

Ethereum用户
提问于 2018-01-08 03:36:46
回答 2查看 1.9K关注 0票数 1

我目前正在用java中的ECDSASignature规范进行签名,但是我注意到从签名中获取v值是ethereum的自定义规范。

我的代码:

代码语言:javascript
复制
public static void main(String[] args) throws Exception
{
    byte[] offer = {
            0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
    };
    System.out.print(getAgreementFromAdmin(offer));
}

//TODO port to android
//TODO get v value
private static JSONObject getAgreementFromAdmin(byte[] offer) throws Exception
{
    //no need for address, from ecrecover you can take the token.
    System.out.println("offer: " +  offer.length);
    // sign() returns r, s but not v
    // org.web3j.crypto.ECDSASignature
    ECDSASignature signature = TransactionQueue.getAdminKeyPair().sign(offer);
    BigInteger r = signature.r;
    BigInteger s = signature.s;
    int v = 27; // minimum value of v, if not working try with 28
    JSONObject agreementJSON = new JSONObject();
    agreementJSON.put("offer", "0x" + bytesToHex(offer));
    agreementJSON.put("v", v);
    agreementJSON.put("r", r);
    agreementJSON.put("s", s);

    return agreementJSON;
}

符号方法被定义为:

代码语言:javascript
复制
public ECDSASignature sign(byte[] transactionHash) {
    ECDSASigner signer = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest()));

    ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(privateKey, Sign.CURVE);
    signer.init(true, privKey);
    BigInteger[] components = signer.generateSignature(transactionHash);

    return new ECDSASignature(components[0], components[1]).toCanonicalised();
}
EN

回答 2

Ethereum用户

发布于 2018-01-15 11:41:09

这与这个问题类似。在geth客户机中,v的计算可以找到这里。只是简单地结合了

  • "r“的y坐标的奇偶。
  • 溢出标志(根据注释,这在现实中不会发生)。
票数 2
EN

Ethereum用户

发布于 2018-01-10 17:36:33

要计算v,您需要知道对应于r的y坐标,您可能需要访问库的内部。

请看这个问题R,S,V ECDSA数据包签名

R是曲线上点的x坐标的函数。X坐标可以对应于椭圆曲线上的2y坐标,椭圆曲线在x轴上是对称的。V指定使用两个y坐标中的哪个来帮助进行公钥验证。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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