Javascript。 ECIES方案如何高效存储secp256k1私钥

Javascript. How To Efficiently Store Secp256k1 Private Key for ECIES Scheme

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

我已经尝试使用 base64 进行编码和解码,许多函数的实现将输入编码字符串的数组缓冲区复制到 localStoarge 并从 localStorage 复制相应的输出 Uint8Array,我用 IndexedDB 进行了尝试,JSON.stringify 并且解析没有使用二进制数据,以及更多变体。

当我单独遍历数组缓冲区元素以将其复制到新的 Uint8Array 中时,我得到了一个类似的私钥,但缺少两个 key/field(父项和偏移量),我相信这就是原因到目前为止,我尝试过的每个库 returns 当我尝试从它们生成 public 密钥时,都会出现“错误的私钥”行。

我已经筋疲力尽了,由于我在这个特定主题上缺乏技能,我需要一些专业的见解。那么我如何存储(以任何方式只要它是 client/local)一个 Secp256k1 私钥,如果我从那个持久的客户端数据库调用它,它们可以用来生成 public 键?

显然,使用 private/public 键(在本例中为 @toruslabs/eccrypto)的库需要键的缓冲区参数。

一个简单的解决方案是通过 browserify 使 NodeJS Buffer 在浏览器中可用。你只需要在创建 browserify 文件时将 NodeJS Buffer class 包含到 window 对象中,如图:

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

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

在此之后,您将能够在浏览器中使用缓冲区 class,这将使加载 private/public 密钥成为可能。示例代码在这里:

<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 或您将使用的任何客户端 database/storage 中。