Генерация объекта Диффи-Хеллмана с помощью npm модуля `threads`: getPrime не определен - PullRequest
0 голосов
/ 10 января 2019

Используя библиотеку из npm threads Я пытаюсь создать diffie hellman неблокирующим образом, используя отдельный поток вместо основного:

const spawn = require('threads').spawn;

const thread = spawn(function(input, done) {
  const cryptot = require('crypto');
  const dh = cryptot.createDiffieHellman(2048);
  done({dh});
});

thread.send({p:null, g:null}).on('message', (response) => {
  console.log(response.dh.getPrime(), response.dh.getGenerator());
  thread.kill();
}).on('error', (err)=>{
  console.error(err);
}).on('exit', function() {
  console.log('Worker has been terminated.');
});

Но я получаю следующую ошибку:

/home/pcmagas/Kwdikas/master_thesis/custom_xmpp/dummy_src/thread_dh.js:10
  console.log(response.dh.getPrime(), response.dh.getGenerator());
                          ^

TypeError: response.dh.getPrime is not a function
    at Worker.thread.send.on (/home/pcmagas/Kwdikas/master_thesis/custom_xmpp/dummy_src/thread_dh.js:10:27)
    at Worker.emit (/home/pcmagas/Kwdikas/master_thesis/custom_xmpp/node_modules/eventemitter3/index.js:129:35)
    at Worker.handleMessage (/home/pcmagas/Kwdikas/master_thesis/custom_xmpp/node_modules/threads/lib/worker.node/worker.js:148:17)
    at ChildProcess.emit (events.js:182:13)
    at emit (internal/child_process.js:812:12)

Знаете ли вы, почему полученный dh объект не содержит метод getPrime, а с помощью предположения также getGenerator?

1 Ответ

0 голосов
/ 10 января 2019

Что ж, это правда, что без предоставления генератора и простого генерация ключа медленна в реализации, представленной в node.js. Но что делает его медленным, так это создание правильного простого числа и генератора, где простое число будет 2048 бит.

Таким образом, вы можете сделать следующее:

  1. Генерация прайма и генератора внутри нити
  2. Передать основной генератор abd через готовый обратный вызов в событие message
  3. Воссоздайте там объект diffie-hellman с сгенерированным простым числом и генератором.

Эти шаги будут получены из этого кода:

const spawn = require('threads').spawn;

const thread = spawn(function(input, done) {
  const cryptot = require('crypto');
  console.time('dh-thread');
  const dh = cryptot.createDiffieHellman(2048);
  console.timeEnd('dh-thread');
  done({prime: dh.getPrime().toString('hex'), generator: dh.getGenerator().toString('hex')});
});

thread.send({p:null, g:null}).on('message', (response) => {
  const cryptot = require('crypto');
  const dh =  cryptot.createDiffieHellman(response.prime, response.generator);
  // Do whatever you want there
  thread.kill();
}).on('error', (err)=>{
  console.error(err);
}).on('exit', function() {
  console.log('Worker has been terminated.');
});

Также, чтобы оправдать мое утверждение выше, позвольте мне немного изменить код, используя таймеры:

const spawn = require('threads').spawn;

const thread = spawn(function(input, done) {
  const cryptot = require('crypto');
  console.time('dh-thread');
  const dh = cryptot.createDiffieHellman(2048);
  console.timeEnd('dh-thread');
  done({prime: dh.getPrime().toString('hex'), generator: dh.getGenerator().toString('hex')});
});

thread.send({p:null, g:null}).on('message', (response) => {
  console.time('dh');
  const cryptot = require('crypto');
  const dh =  cryptot.createDiffieHellman(response.prime, response.generator);
  console.timeEnd('dh');
  thread.kill();
}).on('error', (err)=>{
  console.error(err);
}).on('exit', function() {
  console.log('Worker has been terminated.');
});

В результате выполнения кода выше:

dh-thread: 12815.747ms
dh: 6.733ms
Worker has been terminated.

Как вы видите, генерация Диффи-Хеллмана без простого и генератора занимает WAY слишком долго вместо предоставленного простого и генератора.

...