【问题标题】:custom private key with crypto in node.js在 node.js 中使用加密的自定义私钥
【发布时间】:2016-02-20 19:26:01
【问题描述】:

来自:https://nodejs.org/api/crypto.html#crypto_class_ecdh

const alice_key = alice.generateKeys();

会随机生成一个私钥和对应的公钥。

但我想设置自己的私钥:e8f32e723decf...

如果我使用:

alice.setPrivateKey("e8f32e723decf");

对象 alice_key 不受影响,所以稍后:

const bob_secret = bob.computeSecret(alice_key, 'hex', 'hex');

会错的。有没有办法做类似的事情:

const alice_key = alice.generateKeys("e8f32e723decf");

【问题讨论】:

    标签: node.js cryptography diffie-hellman


    【解决方案1】:

    首先我想你的十六进制字符串缺少前导0,所以它应该是0e8f32e723decf

    那就要看你的node.js版本了,ECDH.setPrivateKey()的实现从5.1改成了5.2


    node.js 5.0

    
    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));
    

    【讨论】:

    • @jfjobidon 如果这回答了你的问题,你应该接受答案 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多