我如何使用 nodejs 中的 Diffie-Hellman api 实际加密某些内容?
How do I actually encrypt something with the Diffie-Hellman apis in nodejs?
我在这里查看 nodejs 加密文档中的非常简单的演示:
https://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name
他们非常轻松地演示了如何获取共享密钥...现在怎么办?
如何使用上述共享密钥加密和解密数据?
Diffie-Hellman 是一种密钥交换算法。它本身不提供加密。
双方通过D-H建立共同的秘密后,就可以将其作为AES等对称加密算法的密钥。
密码可以用作例如
https://nodejs.org/api/crypto.html#crypto_crypto_createcipher_algorithm_password
注意最后的安全提示。
虽然问题是如何用DH api加密。我想解决整个问题。
虽然接受的答案很好,但问题是如果您不知道 e2e 是如何工作的,那么该教程将无法帮助您实现您真正想要的,我想这就是如何端到-使用 DH 密钥交换作为过程的一部分结束加密。所以我把它分解成可以理解的部分。
它是这样的:
按照这个概念,Alice 和 Bob 都应该就 a generator
和一个 prime number
给 bob 达成一致,这样 key 就可以生成他的密钥。
完成后,他们都需要彼此共享 public 密钥。
所以首先,让爱丽丝生成密钥并将它们发送给鲍勃:
JSON.stringify({ type: 'keyxchange_alice', from: from, to: to, prime: alice.sharedPrime, generator: alice.generator, key: alice.getPublicKey() })
然后鲍勃需要生成他的 public 密钥并将其发送给爱丽丝
const bob = new DeffMan(Buffer.from(msg.prime), Buffer.from(msg.generator))
const bob_key = bob.getPublicKey()
JSON.stringify({ type: 'keyxchange_bob', key: bob_key })
你还需要存储这些对应用户的密钥,这可以通过存储它来完成(在这种情况下,在 javascript hash/object 中),就像爱丽丝可以存储:
{ bob: bobMessage.key }
.
现在假设他们有彼此的 public 密钥,alice 可以 bob 可以生成一个共享密钥,
共享秘密,对于鲍勃,广义时是 alicePublicKey ^ bobPrivateKey
。 (从 Wikipedia and a Plain English version here 阅读更多关于 DiffeHelman 密钥交换的信息)
然后,此共享机密将用作密码,使用 aes-256-cbc
加密将通过 tcp 发送的消息。
上面的东西可以修改更多,通过每次重新生成秘密,这将涉及每条消息的更多往返
或者可以使用双棘轮方案。
我的原创文章在this link as a gist
我在这里查看 nodejs 加密文档中的非常简单的演示: https://nodejs.org/api/crypto.html#crypto_crypto_getdiffiehellman_group_name
他们非常轻松地演示了如何获取共享密钥...现在怎么办?
如何使用上述共享密钥加密和解密数据?
Diffie-Hellman 是一种密钥交换算法。它本身不提供加密。
双方通过D-H建立共同的秘密后,就可以将其作为AES等对称加密算法的密钥。
密码可以用作例如 https://nodejs.org/api/crypto.html#crypto_crypto_createcipher_algorithm_password
注意最后的安全提示。
虽然问题是如何用DH api加密。我想解决整个问题。
虽然接受的答案很好,但问题是如果您不知道 e2e 是如何工作的,那么该教程将无法帮助您实现您真正想要的,我想这就是如何端到-使用 DH 密钥交换作为过程的一部分结束加密。所以我把它分解成可以理解的部分。
它是这样的:
按照这个概念,Alice 和 Bob 都应该就 a generator
和一个 prime number
给 bob 达成一致,这样 key 就可以生成他的密钥。
完成后,他们都需要彼此共享 public 密钥。
所以首先,让爱丽丝生成密钥并将它们发送给鲍勃:
JSON.stringify({ type: 'keyxchange_alice', from: from, to: to, prime: alice.sharedPrime, generator: alice.generator, key: alice.getPublicKey() })
然后鲍勃需要生成他的 public 密钥并将其发送给爱丽丝
const bob = new DeffMan(Buffer.from(msg.prime), Buffer.from(msg.generator))
const bob_key = bob.getPublicKey()
JSON.stringify({ type: 'keyxchange_bob', key: bob_key })
你还需要存储这些对应用户的密钥,这可以通过存储它来完成(在这种情况下,在 javascript hash/object 中),就像爱丽丝可以存储:
{ bob: bobMessage.key }
.
现在假设他们有彼此的 public 密钥,alice 可以 bob 可以生成一个共享密钥,
共享秘密,对于鲍勃,广义时是 alicePublicKey ^ bobPrivateKey
。 (从 Wikipedia and a Plain English version here 阅读更多关于 DiffeHelman 密钥交换的信息)
然后,此共享机密将用作密码,使用 aes-256-cbc
加密将通过 tcp 发送的消息。
上面的东西可以修改更多,通过每次重新生成秘密,这将涉及每条消息的更多往返 或者可以使用双棘轮方案。
我的原创文章在this link as a gist