我正在尝试使用list在crypto.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位。
[是的,您应该坚持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
并且,为了向前保密,请不要忘记在使用后擦除密钥。