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 中。
我一直很难弄清楚如何从多个库中存储 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 中。