Как использовать Diff ie -Hellman с 2048 битами для создания шифра? - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь найти алгоритм в списке , который поддерживает длину 2048 бит с использованием crypto.createDiffieHellman(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 бит.

1 Ответ

1 голос
/ 02 марта 2020

Вы правы, вам следует придерживаться рекомендуемого размера для DHKE. Распространенным способом является использование функции вывода ключей на выходе обмена ключами Diff ie -Hellman.

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 - ваш производный ключ, и, пожалуйста, не называйте его паролями. Это больше, чем это. Называйте, например, sharedKey или exchangedKey.

Дополнительный контекст может использоваться для разделения домена, так что вы можете получить разные ключи для разных приложений. Посмотрите на детали здесь; Многократное получение ключа AES из мастер-ключа

И, для дальнейшей секретности, не забудьте стереть ключ после использования.

  • Почему мы должны обработать результат обмена ключами Диффа ie -Хеллмана?

Безопасность обмена ключами Диффа ie -Хеллмана основана на Deciffal Diff ie -Хеллмана предположение. Это предположение говорит о том, что обмененный ключ является групповым элементом, который в вычислительном отношении неотличим от случайного / равномерно распределенного элемента в группе.

Следует отметить, что результат не является равномерно распределенным элементом, т.е. каждый бит имеет 1 / 2. Вероятность того, что он равен 0 или 1. MSB может быть неравномерно распределен.

Рекомендуемый способ извлечения экстропии - использовать га sh или лучше для обработки с помощью функции получения ключа. HKDF будет хорошо здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...