gpt4 book ai didi

node.js - 如何使用 2048 位的 Diffie-Hellman 来创建密码?

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:39 25 4
gpt4 key购买 nike

我正在尝试在 list 中找到一种算法使用 crypto.createDiffieHellman(2048) 可容纳 2048 位长度。换句话说,我让 Alice 和 Bob 使用他们相应的 key 来加密/解密彼此的消息。

const crypto = require('crypto'),
assert = require('assert'),
algorithm = 'aes-256-cbc',
IV_LENGTH = 16,
DH_LENGTH = 2048;

const alice = crypto.createDiffieHellman(DH_LENGTH);
const aliceKey = alice.generateKeys();

const bob = crypto.createDiffieHellman(alice.getPrime(), alice.getGenerator());
const bobKey = bob.generateKeys();

const aliceSecret = alice.computeSecret(bobKey);
const bobSecret = bob.computeSecret(aliceKey); // should be same as aliceSecret

const password = aliceSecret;
const iv = crypto.randomBytes(IV_LENGTH).toString('hex').slice(0, IV_LENGTH);

function encrypt(text){
const cipher = crypto.createCipheriv(algorithm, password, iv)
const crypted = `${cipher.update(text,'utf8','hex')}${cipher.final('hex')}`
return crypted;
}


function decrypt(text){
const decipher = crypto.createDecipheriv(algorithm, password, iv)
const dec = `${decipher.update(text,'hex','utf8')}${decipher.final('utf8')}`
return dec;
}

const msg = encrypt('Test');

const decryptedMsg = decrypt(msg)

console.log(msg, decryptedMsg);

这会引发错误 Invalid key length 。解决此问题的一种方法是执行 DH_LENGTH = 256 。然而,这不是一个好主意,建议的最小长度为 2048 位。现在,我可以使用 2048 创建 key 并在长度为 256 上执行切片,但这与执行 256 位 DH 有什么不同。基本上攻击者必须猜测第一个/最后一个 256 位。

最佳答案

你是对的,你应该坚持DHKE推荐的尺寸。一种常见的方法是在 Diffie-Hellman key 交换的输出上使用 key 派生函数。

HKDF 很适合您。 HKDF 遵循“提取然后扩展”范例,通常,如果您找到并实现了可以访问这些函数的方法,那么 expand 就足够了。以下来自futoin-hkdf ;

const hkdf = require('futoin-hkdf');

// Parameter overview
//-------------------
// initial keying material
const ikm = 'string-or-buffer';
// required output length in bytes
const length = 32;
// can be empty string or false equivalent
const salt = 'strongly-encouraged';
// optional parameter
const info = 'optional-context';
// HMAC hashing algorithm to use
const hash = 'SHA-256';

// Generic derivation
//-------------------
hkdf(ikm, length, {salt, info, hash}); // Buffer(length) - derived key

IKM 是您的派生 key ,请不要将其称为密码。不仅如此。像 sharedKeyexchangedKey 这样的命名会更好。

可选上下文可用于域分离,以便您可以为不同的应用程序派生不同的 key 。请参阅此处的详细信息; Multiple AES Key Derivation from a master key

并且,为了实现前向保密,请不要忘记在使用后删除 key 。

  • Why should we process the result of the Diffie-Hellman Key Exchange?

Diffie-Hellman key 交换的安全性基于决策 Diffie-Hellman 假设。这个假设表明,交换的 key 是一个组元素,在计算上与组中的随机/均匀分布元素无法区分。

必须注意的是,结果不是均匀分布的元素,即每个位有 1/2 的概率为 0 或 1。MSB 可能不是均匀分布的。

提取熵的推荐方法是使用哈希或更好的方法由 key 导出函数处理。 HKDF 在这里就可以了。

关于node.js - 如何使用 2048 位的 Diffie-Hellman 来创建密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60493194/

25 4 0
文章推荐: c - SVD(奇异值分解)的不同结果
文章推荐: c# - 是否可以解决 .Net 3.5 中的 "Default parameter specifiers are not permitted"错误?
文章推荐: c - 使用引擎生成随机数
文章推荐: css -
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com