使用 ECDH 和 Nodejs 加密解密秘密

Nic*_*lle 5 encryption cryptography node.js

这是nodejs文档示例:

const crypto = require('crypto');
const alice = crypto.createECDH('secp256k1');
const bob = crypto.createECDH('secp256k1');

// Note: This is a shortcut way to specify one of Alice's previous private
// keys. It would be unwise to use such a predictable private key in a real
// application.
alice.setPrivateKey(
  crypto.createHash('sha256').update('alice', 'utf8').digest()
);

// Bob uses a newly generated cryptographically strong
// pseudorandom key pair bob.generateKeys();

const alice_secret = alice.computeSecret(bob.getPublicKey(), null, 'hex');
const bob_secret = bob.computeSecret(alice.getPublicKey(), null, 'hex');

// alice_secret and bob_secret should be the same shared secret value
console.log(alice_secret === bob_secret);
Run Code Online (Sandbox Code Playgroud)

我不明白秘密从何而来。假设我想解密foo-bar来自 Bob 的消息(使用 Alice 公钥加密)。我有爱丽丝的私钥和公钥,以及鲍勃的加密消息,我如何解密包含所有这些的消息?

Ros*_*ith 7

上述步骤构成了 ECDH 密钥协商协议,用于在 Alice 和 Bob 之间建立共享秘密(对称密钥),随后他们可以使用该共享秘密进行安全通信。

秘密密钥 alice_secret是在 Alice 端使用 Alice 的私钥和 Bob 的公钥计算得出的。
密钥bob_secret是使用 Bob 的私钥和 Alice 的公钥在 Bob 端计算得出的。

两个密钥将是相同的。现在爱丽丝和鲍勃有一个共享秘密(alice_secret = bob_secret),他们可以使用它来加密/解密消息。

请注意,此处仅交换公钥,中间人无法获取 Alice 或 Bob 的私钥。

理想情况下,应使用密钥派生函数将共享密钥转换为适合 AES 等算法的适当对称密钥。参考KDF

伪代码

-Bob 使用 bob_secret 和 AES 进行加密:

  var crypto = require('crypto'),
  algo = 'aes-256-ctr',
  var cipher = crypto.createCipher(algo,bob_secret)
  var encrypted = cipher.update("foo-bar",'utf8','hex')
  encrypted += cipher.final('hex');
Run Code Online (Sandbox Code Playgroud)

-爱丽丝解密:

 var decipher = crypto.createDecipher(algo,alice_secret)
 var decrypted = decipher.update(encrypted,'hex','utf8')
 decrypted += decipher.final('utf8');
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果此代码用于具有相同对称密钥(“bob_secret”或“alice_secret”)的多个消息,则该代码是**完全不安全的**。CTR 模式是一种流模式,当使用 IV+密钥组合两次时会显示多次填充(密钥和 IV 是从传递的“xxx_secret”中确定性导出的)。最好使用“crypto.createCipheriv”为每次加密随机生成一个 12 字节的 IV。 (4认同)
  • @NicolasDelValle 不,我的意思是每一方都应该通过哈希函数运行计算出的秘密来获取实际的密钥。 (4认同)
  • @NicolasDelValle 有一个链接讨论答案中的密钥推导。 (2认同)