node.js 中带有加密的自定义私钥
custom private key with crypto in node.js
来自:https://nodejs.org/api/crypto.html#crypto_class_ecdh
const alice_key = alice.generateKeys();
将生成随机私钥和对应的public密钥。
但我想设置自己的私钥:e8f32e723decf...
如果我使用:
alice.setPrivateKey("e8f32e723decf");
对象alice_key不受影响,所以稍后:
const bob_secret = bob.computeSecret(alice_key, 'hex', 'hex');
会出错。有没有办法做类似的事情:
const alice_key = alice.generateKeys("e8f32e723decf");
首先我想你的十六进制字符串缺少前导 0
,所以它应该是 0e8f32e723decf
。
那要看你的node.js版本了,ECDH.setPrivateKey()
的实现由5.1改为5.2
node.js 5.0
- 您需要生成密钥并覆盖它们
- 您需要public和私钥
- Working online example
const crypto = require('crypto');
// this is just to generate a private/public key pair
const warmup = crypto.createECDH('secp521r1');
warmup.generateKeys();
const warmup_private_key = warmup.getPrivateKey();
const warmup_public_key = warmup.getPublicKey();
// convert it to hex string to match the example
// you would store these strings somewhere I guess
private_key = warmup_private_key.toString('hex');
public_key = warmup_public_key.toString('hex');
// now let's create the ciphers
const alice = crypto.createECDH('secp521r1');
const bob = crypto.createECDH('secp521r1');
----------
// Bob gets created keys
bob.generateKeys();
// Generate Alice's keys - that's really annoying since you will override it
alice.generateKeys();
// now set the keys:
alice.setPrivateKey(private_key, "hex");
alice.setPublicKey(public_key, "hex");
// Exchange and generate the secret...
const alice_secret = alice.computeSecret(bob.getPublicKey());
const bob_secret = bob.computeSecret(alice.getPublicKey());
console.log("alice's shared secret: " + alice_secret.toString('hex') + "\n");
console.log("bob's shared secret: " + bob_secret.toString('hex') + "\n");
console.log('shared secrets match: ' + alice_secret.equals(bob_secret));
node.js >= 5.2
const crypto = require('crypto');
const alice = crypto.createECDH('secp256k1');
const bob = crypto.createECDH('secp256k1');
bob.generateKeys();
alice.setPrivateKey('0e8f32e723decf', 'hex');
const alice_secret = alice.computeSecret(bob.getPublicKey());
const bob_secret = bob.computeSecret(alice.getPublicKey());
console.log(alice_secret.equals(bob_secret));
来自:https://nodejs.org/api/crypto.html#crypto_class_ecdh
const alice_key = alice.generateKeys();
将生成随机私钥和对应的public密钥。
但我想设置自己的私钥:e8f32e723decf...
如果我使用:
alice.setPrivateKey("e8f32e723decf");
对象alice_key不受影响,所以稍后:
const bob_secret = bob.computeSecret(alice_key, 'hex', 'hex');
会出错。有没有办法做类似的事情:
const alice_key = alice.generateKeys("e8f32e723decf");
首先我想你的十六进制字符串缺少前导 0
,所以它应该是 0e8f32e723decf
。
那要看你的node.js版本了,ECDH.setPrivateKey()
的实现由5.1改为5.2
node.js 5.0
- 您需要生成密钥并覆盖它们
- 您需要public和私钥
- Working online example
const crypto = require('crypto');
// this is just to generate a private/public key pair
const warmup = crypto.createECDH('secp521r1');
warmup.generateKeys();
const warmup_private_key = warmup.getPrivateKey();
const warmup_public_key = warmup.getPublicKey();
// convert it to hex string to match the example
// you would store these strings somewhere I guess
private_key = warmup_private_key.toString('hex');
public_key = warmup_public_key.toString('hex');
// now let's create the ciphers
const alice = crypto.createECDH('secp521r1');
const bob = crypto.createECDH('secp521r1');
----------
// Bob gets created keys
bob.generateKeys();
// Generate Alice's keys - that's really annoying since you will override it
alice.generateKeys();
// now set the keys:
alice.setPrivateKey(private_key, "hex");
alice.setPublicKey(public_key, "hex");
// Exchange and generate the secret...
const alice_secret = alice.computeSecret(bob.getPublicKey());
const bob_secret = bob.computeSecret(alice.getPublicKey());
console.log("alice's shared secret: " + alice_secret.toString('hex') + "\n");
console.log("bob's shared secret: " + bob_secret.toString('hex') + "\n");
console.log('shared secrets match: ' + alice_secret.equals(bob_secret));
node.js >= 5.2
const crypto = require('crypto');
const alice = crypto.createECDH('secp256k1');
const bob = crypto.createECDH('secp256k1');
bob.generateKeys();
alice.setPrivateKey('0e8f32e723decf', 'hex');
const alice_secret = alice.computeSecret(bob.getPublicKey());
const bob_secret = bob.computeSecret(alice.getPublicKey());
console.log(alice_secret.equals(bob_secret));