【问题标题】:Decrypt secret using ECDH and nodejs crypto使用 ECDH 和 nodejs 加密解密秘密
【发布时间】:2016-09-23 20:17:10
【问题描述】:

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

我不明白秘密的来源。假设我想解密来自 Bob 的消息 foo-bar(使用 Alice 公钥加密)。我有 Alice 的私钥和公钥,以及 Bob 的加密消息,我该如何解密拥有这一切的消息?

【问题讨论】:

    标签: node.js encryption cryptography


    【解决方案1】:

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

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

    两个键相等。现在,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');
    

    -Alice 解密:

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

    【讨论】:

    • 更新了答案。
    • 请注意,如果此代码用于具有相同对称密钥(bob_secretalice_secret)的多个消息,则此代码完全不安全。 CTR 模式是一种流模式,当 IV+key 组合被使用两次(key 和 IV 是从传递的xxx_secret 确定地派生的)时,它会显示多次填充。最好使用crypto.createCipheriv为每次加密随机生成一个12字节的IV。
    • @NicolasDelValle 由于alice_secretbob_secret 都是伪随机的,因此您可以使用简单的散列来根据散列函数获得特定的长度。 SHA-256 应该可以正常工作。
    • @NicolasDelValle 不,我的意思是每一方都应该通过哈希函数运行他们计算出来的秘密来获得实际的密钥。
    • @NicolasDelValle 在答案中有一个讨论密钥派生的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多