首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点-rsa:编码时间太长,使用ethereum帐户的公钥。

节点-rsa:编码时间太长,使用ethereum帐户的公钥。
EN

Stack Overflow用户
提问于 2019-08-09 10:37:09
回答 1查看 1.2K关注 0票数 1

我有以下问题:

其主要目标是使用ethereum帐户的公钥(形成密钥库文件)对某些有效负载进行非对称加密,然后使用相应的私钥(也来自同一个密钥存储库文件)对其进行解密。

在这个包的帮助下,我从帐户地址提取了私钥:keythereum-node

这将导致来自特定帐户地址的以下十六进制privateKey:privateKey:

我首先用私钥对随机选择的字符串签名,然后使用签名接收公钥(msgHash,v,r,s),从而设法从帐户中获取公钥。为此,我使用了ethereumjs-util包中的package方法。

这将导致以下十六进制格式的9f9f445051e788461952124dc08647035c0b31d51f6b4653485723f04c9837adb275d41731309f6125c14ea1546d86a27158eec4164c00bab4724eed925e9c60:publicKey:

到目前一切尚好。现在我有两个键(公钥512位和私钥256位长)。现在,我试图通过传递pem格式的nodeRsa编码公钥来生成一个base64密钥(节点-Rsa包)。

获取PrivateKey:

代码语言:javascript
复制
var keyObject = await keythereum.importFromFile(address, keystorePath).then(keyObject => {
        return keyObject;
      }).catch(err => {
        console.log(err);
      });

      var privateKey = await keythereum.recover(password, keyObject).then(privateKey => {
        return privateKey;
      }).catch(err => {
        console.log(err);
      });

      return privateKey;

获取PublicKey:

代码语言:javascript
复制
var sig = await web3.eth.accounts.sign("Hello World", privateKey);
var msgHash = sig.messageHash;
var r = sig.r;
var s = sig.s;
var v = sig.v;
msg = recover.toBuffer(msgHash);
var publicKey = recover.ecrecover(msg,v,r,s);

使用rsa-节点生成rsa-键:

代码语言:javascript
复制
var key = new nodeRsa("-----BEGIN RSA PUBLIC KEY-----\n" +
                          "n59EUFHniEYZUhJNwIZHA1wLMdUfa0ZTSFcj8EyYN62yddQXMTCfYSXBTqFUbYai\n" +
                          "cVjuxBZMALq0ck7tkl6cYA==\n" +
                          "-----END RSA PUBLIC KEY-----", "pkcs1-public");

执行脚本后,将引发以下错误:

代码语言:javascript
复制
{ InvalidAsn1Error: encoding too long
    at newInvalidAsn1Error (/Users/milandavidovic/node_modules/asn1/lib/ber/errors.js:7:13)
    at Reader.readLength (/Users/milandavidovic/node_modules/asn1/lib/ber/reader.js:103:13)
    at Reader.readSequence (/Users/milandavidovic/node_modules/asn1/lib/ber/reader.js:136:16)
    at Object.publicImport (/Users/milandavidovic/node_modules/node-rsa/src/formats/pkcs1.js:122:14)
    at Object.detectAndImport (/Users/milandavidovic/node_modules/node-rsa/src/formats/formats.js:65:48)
    at NodeRSA.module.exports.NodeRSA.importKey (/Users/milandavidovic/node_modules/node-rsa/src/NodeRSA.js:183:22)
    at new NodeRSA (/Users/milandavidovic/node_modules/node-rsa/src/NodeRSA.js:73:18)
    at getPublicKeyFromSignature (/Users/milandavidovic/masterthesis/Scripts/DeployContract.js:280:15)
    at <anonymous> name: 'InvalidAsn1Error', message: 'encoding too long' }
(node:1101) UnhandledPromiseRejectionWarning: InvalidAsn1Error: encoding too long
    at newInvalidAsn1Error (/Users/milandavidovic/node_modules/asn1/lib/ber/errors.js:7:13)
    at Reader.readLength (/Users/milandavidovic/node_modules/asn1/lib/ber/reader.js:103:13)
    at Reader.readSequence (/Users/milandavidovic/node_modules/asn1/lib/ber/reader.js:136:16)
    at Object.publicImport (/Users/milandavidovic/node_modules/node-rsa/src/formats/pkcs1.js:122:14)
    at Object.detectAndImport (/Users/milandavidovic/node_modules/node-rsa/src/formats/formats.js:65:48)
    at NodeRSA.module.exports.NodeRSA.importKey (/Users/milandavidovic/node_modules/node-rsa/src/NodeRSA.js:183:22)
    at new NodeRSA (/Users/milandavidovic/node_modules/node-rsa/src/NodeRSA.js:73:18)
    at getPublicKeyFromSignature (/Users/milandavidovic/masterthesis/Scripts/DeployContract.js:280:15)
    at <anonymous>
(node:1101) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:1101) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

我不明白,为什么编码太长了。我检查了字符串好几次。

如果有人有线索,可以自由地写一个答案或建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-14 08:18:42

经过进一步的研究,我发现PEM格式的密钥不只是包含带有页眉和页脚的base64编码的原始密钥。在我的例子中,我必须提供一个具有以下数据的DER结构:

代码语言:javascript
复制
    RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
    }

所以我上面的“pem格式”键是不正确的。另外,我的密钥不是RSA密钥,而是Secp256k1密钥。

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

https://stackoverflow.com/questions/57428308

复制
相关文章

相似问题

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