如何字符串化椭圆签名 ECDSA

Posted

技术标签:

【中文标题】如何字符串化椭圆签名 ECDSA【英文标题】:how to stringify elliptic signature ECDSA 【发布时间】:2021-06-01 18:45:07 【问题描述】:

我有一个签名,它可以工作,但我想将此签名传递给 websocket,但我需要字符串化以传递对象。但是当我字符串化然后我解析时,结果是不一样的。

let privKey = keyPair.getPrivate("hex");
let msg = JSON.stringify(
    go: 'coucou'
);
let msgHash = sha3.keccak256(msg);
let signature =
    ec.sign(msgHash, privKey, "hex",  canonical: false );

console.log(signature)
console.log(JSON.stringify(signature))

字符串化前的签名:

Signature 
  r: BN 
    negative: 0,
    words: [
       2305509, 63298775,
      50157238, 36339965,
      49744272, 57791728,
      21008130,   692794,
      36859051,  3475687
    ],
    length: 10,
    red: null
  ,
  s: BN 
    negative: 0,
    words: [
       4203544,  5856462, 11303403, 15905374,
       1228528, 49677779, 30950729, 21688839,
      46989698,  1764062,        0,        0,
             0,        0,        0,        0,
             0,        0,        0,        0,
             0,        0,        0,        0,
             0,        0,        0,        0,
             0,        0
    ],
    length: 10,
    red: null
  ,
  recoveryParam: 1

JSON.stringify() 后的签名:

"r":"d4239e326cab02a48e9408f02dc753c2f709908aa03f6fd56b6f17735c232de5","s":"6bab7acd018252bc81dd84549bd8174c12bef03cac978ac79eb1657338402418","recoveryParam":1

JSON.parse() 后的签名:


  r: 'fc102d49e2b1405afdf61c767a72910241dd87d3fb92b6660f4bd7c08dc9d507',
  s: '59570010a6c7b70c5ff2490732e32d1bbe66d2f99504f500cf0897343e32f43b',
  recoveryParam: 1

所以你可以看到,我没有相同的结果。 肯定有什么让我无法理解

【问题讨论】:

【参考方案1】:

终于找到解决办法了。

代码是对的,你可以保留解析后的响应,它适用于签名验证,不要忘记在你的验证函数中解析签名。

【讨论】:

以上是关于如何字符串化椭圆签名 ECDSA的主要内容,如果未能解决你的问题,请参考以下文章

Javascript(椭圆)上的 ECDSA 签名验证失败 [关闭]

算法2_非对称加密算法之ECDSA(椭圆曲线数字签名算法)

如何使用椭圆曲线私钥和 ECDSA 算法签署证书?

椭圆曲线数字签名算法(ECDSA)

ECDSA数字签名算法

密码技术--椭圆曲线EDCSA数字签名及Go语言应用