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 公钥加密)。我有爱丽丝的私钥和公钥,以及鲍勃的加密消息,我如何解密包含所有这些的消息?
上述步骤构成了 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)
归档时间: |
|
查看次数: |
4931 次 |
最近记录: |