Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点rsa:使用以太坊帐户的公钥编码太长_Javascript_Node.js_Solidity - Fatal编程技术网

Javascript 节点rsa:使用以太坊帐户的公钥编码太长

Javascript 节点rsa:使用以太坊帐户的公钥编码太长,javascript,node.js,solidity,Javascript,Node.js,Solidity,我有以下问题: 主要目标是使用以太坊帐户(形成密钥库文件)的公钥对一些负载进行非对称加密,然后使用相应的私钥(也来自同一密钥库文件)对其进行解密 在这个包的帮助下,我已从帐户地址提取了私钥:keysthem节点 这将从特定帐户地址生成以下十六进制格式的私钥: 私钥:6dc5aeb2cf14c748da683d1c16491d5b468b5bb1eea3f98c511b6371fdcfb05f 我首先用私钥对随机选择的字符串进行签名,然后使用签名接收公钥(msgHash、v、r、s),从而从帐户中

我有以下问题:

主要目标是使用以太坊帐户(形成密钥库文件)的公钥对一些负载进行非对称加密,然后使用相应的私钥(也来自同一密钥库文件)对其进行解密

在这个包的帮助下,我已从帐户地址提取了私钥:keysthem节点

这将从特定帐户地址生成以下十六进制格式的私钥: 私钥:6dc5aeb2cf14c748da683d1c16491d5b468b5bb1eea3f98c511b6371fdcfb05f

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

这将产生以下十六进制格式的公钥: 公钥:9f9f445051e788461952124dc08647035c0b31d51f6b4653485723f04c9837adb275d41731309f6125c14ea1546d86a27158eec4164c00bab4724eed925e9c60

到目前为止还不错。现在我有两个密钥(公钥512比特和私钥256比特长)。 现在,我正试图通过以pem格式传递base64编码的公钥来生成NodesA密钥(节点Rsa包)

获取私钥:

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;
获取公钥:

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密钥:

var key = new nodeRsa("-----BEGIN RSA PUBLIC KEY-----\n" +
                          "n59EUFHniEYZUhJNwIZHA1wLMdUfa0ZTSFcj8EyYN62yddQXMTCfYSXBTqFUbYai\n" +
                          "cVjuxBZMALq0ck7tkl6cYA==\n" +
                          "-----END RSA PUBLIC KEY-----", "pkcs1-public");
执行脚本后,将引发以下错误:

{ 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.
{invalidasn1错误:编码太长
在NewInvalidasn1错误(/Users/milandavidovic/node_modules/asn1/lib/ber/errors.js:7:13)
在Reader.readLength(/Users/milandavidovic/node_modules/asn1/lib/ber/Reader.js:103:13)
在Reader.readSequence(/Users/milandavidovic/node_modules/asn1/lib/ber/Reader.js:136:16)
在Object.publicImport(/Users/milandavidovic/node_modules/node rsa/src/formats/pkcs1.js:122:14)
在Object.detectandport(/Users/milandavidovic/node_modules/node rsa/src/formats/formats.js:65:48)
位于NodeRSA.module.exports.NodeRSA.importKey(/Users/milandavidovic/node_modules/node rsa/src/NodeRSA.js:183:22)
在新节点上(/Users/milandavidovic/node_modules/node rsa/src/NodeRSA.js:73:18)
在getPublicKeyFromSignature(/Users/milandavidovic/masterthesis/Scripts/DeployContract.js:280:15)
在名称:“InvalidAsn1Error”处,消息:“编码太长”}
(节点:1101)未处理的PromiserEjectionWarning:InvalidaSN1错误:编码太长
在NewInvalidasn1错误(/Users/milandavidovic/node_modules/asn1/lib/ber/errors.js:7:13)
在Reader.readLength(/Users/milandavidovic/node_modules/asn1/lib/ber/Reader.js:103:13)
在Reader.readSequence(/Users/milandavidovic/node_modules/asn1/lib/ber/Reader.js:136:16)
在Object.publicImport(/Users/milandavidovic/node_modules/node rsa/src/formats/pkcs1.js:122:14)
在Object.detectandport(/Users/milandavidovic/node_modules/node rsa/src/formats/formats.js:65:48)
位于NodeRSA.module.exports.NodeRSA.importKey(/Users/milandavidovic/node_modules/node rsa/src/NodeRSA.js:183:22)
在新节点上(/Users/milandavidovic/node_modules/node rsa/src/NodeRSA.js:73:18)
在getPublicKeyFromSignature(/Users/milandavidovic/masterthesis/Scripts/DeployContract.js:280:15)
在
(节点:1101)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:1101)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
我不明白,为什么编码应该太长。我多次检查字符串


如果有人有线索,请随意写一个答案或建议。

经过进一步研究,我发现PEM格式的密钥不仅仅包括带页眉和页脚的base64编码原始密钥。 在我的情况下,我必须提供包含以下数据的DER结构:

    RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
    }
所以我上面的“pem格式”键不正确。
另外,我的密钥不是RSA密钥,它是一个secp256k1密钥

经过进一步研究,我发现,PEM格式的密钥不仅仅包括带页眉和页脚的base64编码原始密钥。 在我的情况下,我必须提供包含以下数据的DER结构:

    RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
    }
所以我上面的“pem格式”键不正确。
另外,我的密钥不是RSA密钥,而是secp256k1密钥

欢迎使用!这个问题问得很好。欢迎!这个问题问得很好。