0

我一直很难弄清楚如何从多个库中存储一个 Secp256k1 私钥(目前在这个用于 ECIES 加密的库中:https ://npm.io/package/@toruslabs/eccrypto )。

我尝试过使用 base64 进行编码和解码,许多函数的实现将输入编码字符串的数组缓冲区复制到 localStoarge 并从 localStorage 相应的输出 Uint8Array,我尝试使用 IndexedDB,JSON.stringify 和解析不适用于二进制数据,等等更多的变化。

当我单独遍历数组缓冲区元素以将其复制到新的 Uint8Array 中时,我得到了一个类似的私钥,但缺少两个键/字段(父项和偏移量),我相信这就是我迄今为止尝试过的每个库都返回一些内容的原因当我尝试从它们生成公钥时,会出现很长的“坏私钥”行。

我已经筋疲力尽了,我想要一些专业的见解,因为我在这个特定的主题上缺乏技能。那么如何存储(只要它是客户端/本地的)Secp256k1 私钥,如果我从该持久客户端数据库调用它,它们可以用于生成公钥?

4

1 回答 1

1

显然,使用私钥/公钥的库(在本例中为@toruslabs/eccrypto)需要密钥的缓冲区参数。

一个简单的解决方案是通过 browserify 使NodeJS 缓冲区在浏览器中可用。在创建 browserify 文件时,您只需要将 NodeJS Buffer 类包含到 window 对象中,如下所示:

const eccrypto = require('./index');
window.eccrypto = eccrypto;
window.Buffer = Buffer;

然后,使用 browserify 生成捆绑文件:browserify main.js -o bundle.js

在此之后,您将能够在浏览器中使用 Buffer 类,这将使加载私钥/公钥成为可能。示例代码在这里:

<script src="bundle.js"></script>
<script>
  const eccrypto = window.eccrypto;

  const privateKey = eccrypto.generatePrivate();
  const publicKey = eccrypto.getPublic(privateKey);

  // hex string output of private key
  const hexPrivateKey = privateKey.toString('hex')
  console.log(hexPrivateKey); // we can do this as privateKey is a Buffer

  // load private key again
  const newPrivateKey = Buffer.from(hexPrivateKey, 'hex');
 
  const enc = new TextEncoder();

  // code referenced from @toruslabs/eccrypto README
  // Encrypting the message.
  eccrypto.encrypt(publicKey, enc.encode("my testing msg")).then(function (encrypted) {
    // Decrypting the message.
    eccrypto.decrypt(newPrivateKey, encrypted).then(function (plaintext) {
      console.log("Message:", plaintext.toString());
    });
  });
</script>

这应该足以将私钥的十六进制字符串存储在 localStorage 或您将使用的任何客户端数据库/存储中。

于 2021-01-10T11:40:58.367 回答