如何使用具有2048位的Diffie-Hellman创建密码?

问题描述 投票:0回答:1

我正在尝试使用listcrypto.createDiffieHellman(2048)中找到一种可容纳2048位长度的算法。换一种说法,我让爱丽丝和鲍勃使用它们相应的秘密密钥来相互加密/解密消息。

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的密钥,并在256的长度上进行切片,但这与执行256位DH有什么不同。基本上,攻击者必须猜测前/后256位。

node.js encryption diffie-hellman
1个回答
0
投票

[是的,您应该坚持DHKE的建议大小。一种常见的方法是在Diffie-Hellman密钥交换的输出上使用密钥派生功能。

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是您的派生密钥,请不要将其称为密码。不仅如此。 sharedKey或exchangeedKey更好。

可选上下文可用于域分离,以便您可以为不同的应用程序派生不同的密钥。在这里看到datils; Multiple AES Key Derivation from a master key

并且,为了向前保密,请不要忘记在使用后擦除密钥。

© www.soinside.com 2019 - 2024. All rights reserved.