node.js - 使用 npm `threads` 模块生成 Diffie Hellman 对象:getPrime 未定义
问题描述
使用来自 npmthreads
库的我尝试使用单独的线程而不是主线程以非阻塞方式创建一个 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
吗?
解决方案
确实,如果不提供生成器和启动密钥,在 node.js 中提供的实现上,密钥生成速度很慢。但它让它变慢的是创建正确的素数和生成器,其中素数将是2048位。
因此,您可以执行以下操作:
- 在线程内生成素数和生成器
- 通过完成回调将主要 abd 生成器传递给
message
事件 - 使用生成的素数和生成器在那里重新创建一个 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.
正如您所看到的,没有prime 和generator 的diffie hellman 生成花费了太长时间,而不是提供了prime 和generator。
推荐阅读
- javascript - 如何在nodejs中将请求文件转换为base64字符串
- javascript - 为什么我不能将纹理加载到材质中?
- python - return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args) PermissionError: [WinError 5] Access is denied
- powershell - 静默安装软件的 Power shell 脚本
- angular - 未找到模块:错误:包路径 ./index 未从包 node_modules/rxjs 导出(请参阅 /node_modules/rxjs/package.json 中的导出字段)
- python - Python Regex:如何在两个模式之间选择行
- r - 如何在保持其余数据完整的同时将 unnest_tokens 应用于数据框(Tibble)?
- javascript - 在 2D 画布 js 上移动 3D 空间中的对象
- vue.js - Vue Antd 无法更改 ant-input-suffix 样式
- tensorflow - AttributeError:模块 'keras.engine.sequential' 没有属性 'add'