使用 forge(或其他 JavaScript 方法)生成随机大素数

2024-05-16

我需要在 JavaScript 中生成一个随机大(大约 4096 位)素数,并且我已经在使用 forge。 Forge 必须有某种生成器来完成此类任务,因为它实现了 RSA,而 RSA 也依赖于随机素数。然而,当你只想获得一个随机素数(类似于var myRandomPrime = forge.random.getPrime(4096);那就太好了)。

那么在 JavaScript 中获得这样的素数(有或没有伪造)的最佳方法是什么?


更新 06/11/2014:现在,在 forge 版本 0.6.6 中,您可以使用以下命令:

var bits = 1024;
forge.prime.generateProbablePrime(bits, function(err, num) {
    console.log('random prime', num.toString(16));
});

在 JavaScript 中查找大素数很困难——它很慢,而且您不想阻塞主线程。它需要一些相当定制的代码才能正确执行,并且 forge 中的代码专门用于 RSA 密钥生成。没有 API 调用来简单地生成一个大的随机素数。

Forge 中的 RSA 代码会运行一些额外的操作,如果您只是寻找单个素数,则不需要这些操作。话虽这么说,这个过程中最慢的部分是实际找到素数,而不是那些额外的操作。然而,RSA 代码也会生成两个素数(当您只需要一个素数时),并且它们与您正在寻找的位数不同。因此,如果您使用 Forge API,则必须传递 8196 位大小(我相信……这超出了我的想象,因此可能不准确)才能获得 4096 位素数。

查找大随机素数的一种方法如下:

  1. 生成具有所需位数的随机数(确保设置了 MSB)。
  2. 将数字对齐 30k+1 边界,因为所有素数都具有此属性。
  3. 对您的号码运行素性测试(缓慢的部分);如果通过,则完成,如果未通过,则添加该数字以到达下一个 30k+1 边界并重复。 “快速”素数测试是检查低素数,然后使用 Miller-Rabin(请参阅应用密码学手册 4.24 http://cacr.uwaterloo.ca/hac/about/chap4.pdf).

步骤 #3 可能会运行很长时间——这对于 JavaScript(w/node 或在浏览器中)来说通常是非常不可取的。为了缓解这种情况,您可以尝试将进行素性测试所花费的时间限制在某个可接受的时间段(N 毫秒)内,或者您可以使用 Web Workers 来后台处理该过程。当然,这两种方法都会使代码变得复杂。

下面是一些用于生成 4096 位随机素数的代码,该素数不应阻塞主线程:

var forge = require('node-forge');
var BigInteger = forge.jsbn.BigInteger;

// primes are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29
var GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];
var THIRTY = new BigInteger(null);
THIRTY.fromInt(30);

// generate random BigInteger
var num = generateRandom(4096);

// find prime nearest to random number
findPrime(num, function(num) {
  console.log('random', num.toString(16));
});

function generateRandom(bits) {
  var rng = {
    // x is an array to fill with bytes
    nextBytes: function(x) {
      var b = forge.random.getBytes(x.length);
      for(var i = 0; i < x.length; ++i) {
        x[i] = b.charCodeAt(i);
      }
    }
  };
  var num = new BigInteger(bits, rng);

  // force MSB set
  var bits1 = bits - 1;
  if(!num.testBit(bits1)) {
    var op_or = function(x,y) {return x|y;};
    num.bitwiseTo(BigInteger.ONE.shiftLeft(bits1), op_or, num);
  }

  // align number on 30k+1 boundary
  num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0);

  return num;
}

function findPrime(num, callback) {
  /* Note: All primes are of the form 30k+i for i < 30 and gcd(30, i)=1. The
  number we are given is always aligned at 30k + 1. Each time the number is
  determined not to be prime we add to get to the next 'i', eg: if the number
  was at 30k + 1 we add 6. */
  var deltaIdx = 0;

  // find prime nearest to 'num' for 100ms
  var start = Date.now();
  while(Date.now() - start < 100) {
    // do primality test (only 2 iterations assumes at
    // least 1251 bits for num)
    if(num.isProbablePrime(2)) {
      return callback(num);
    }
    // get next potential prime
    num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);
  }

  // keep trying (setImmediate would be better here)
  setTimeout(function() {
    findPrime(num, callback);
  });
}

可以进行各种调整来根据您的需要进行调整,例如设置运行素性测试程序的时间(这只是估计),然后再尝试下一个计划的刻度。每次退出时您可能都需要某种 UI 反馈。如果您使用的是节点或支持的浏览器setImmediate你可以用它来代替setTimeout以及避免夹紧以加快速度。但是,请注意,在 JavaScript 中生成 4096 位随机素数需要一段时间(至少在撰写本文时)。

Forge 还有一个用于生成 RSA 密钥的 Web Worker 实现,旨在通过让多个线程使用不同的输入运行素性测试来加速该过程。您可以查看伪造源(prime.worker.js例如)来看看它的实际情况,但这本身就是一个项目,需要它才能正常工作。不过,在我看来,这是加快速度的最佳方法。

无论如何,希望上面的代码能对您有所帮助。我会用较小的位大小运行它来测试它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 forge(或其他 JavaScript 方法)生成随机大素数 的相关文章

随机推荐

  • 如何使用 hibernate 标准查询将两个属性连接成一个属性

    例如 有 2 个房产的门牌号和密码 我想要一个房产作为地址 例如门牌号是 10 pincode 是 110064 组合地址属性是 10 110064 这是我的代码 final Criteria criteria getDatabaseSes
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • 将 FragmentContainerView 与导航组件一起使用?

    更新为导航后2 2 0 beta01 https developer android com jetpack androidx releases navigation 2 2 0 beta01从以前的版本开始 lint 会发出有关替换的警告
  • 如何在 SQL Server 中保持数据行内

    我正在尝试找出如何检测数据是否在VARCHAR n SQL Server 2008 中的列存储在行内或行外 有谁知道如何做到这一点 另外 如果我们需要数据 有没有办法将数据保持在行中 要查看某个值是行内还是行外 您可以使用DBCC PAGE
  • Word通过vba宏删除tabe列出现错误

    我想将excel中的数据复制到word表中 然后从表中删除一些列 我可以将数据复制到表中 但是当我删除列时会出现错误 无法访问此集合中的各个列 因为该表具有混合的单元格宽度 我的代码 Public Tbl1 As Table Sub cal
  • 为什么 EF Core 一对多关系集合返回 null?

    这可能看起来像一个重复的问题EF Core 一对多关系列表返回 null https stackoverflow com questions 55210832 ef core one to many relationship list re
  • Pytest 固定装置的范围“类”在每个方法上运行

    我正在尝试使用 Pytest 创建一个测试环境 这个想法是将测试方法分组到类中 对于每个班级 小组 我想附上config将要参数化的夹具 这样我就可以使用 配置 A 运行所有测试 然后使用 配置 B 运行所有测试 依此类推 但同时 我也想要
  • Python 中使用 geoJSON 绘制多边形中的点

    我有一个包含大量多边形 特别是人口普查区 的 geoJSON 数据库 并且有很多长的纬度点 我希望存在一个有效的 Python 代码来识别给定坐标位于哪个人口普查区 但是到目前为止我的谷歌搜索还没有透露任何信息 Thanks 我发现了一个有
  • 将 < 或 > 运算符作为参数传递给函数?

    我的函数里面有一个if 像这样的声明 if passedValue lt staticValue 但我需要能够传递一个参数来指示 if 表达式是像上面那样还是 if passedValue gt staticValue 但我真的无法通过 l
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • Keycloak 无法使用服务帐户令牌获取具有权限的 RPT

    我正在使用Keycloak 4 8 3 Final 我在 Keycloak 中有以下客户 用户服务 库存服务 库存服务在 Keycloak 中定义了一些资源并启用了授权 用户服务 作为服务帐户 在中分配了必要的客户端角色服务帐户角色 tab
  • 使用正确的头打印文件名

    我想获取当前目录中的文件名 使得文件的第一行等于myWord 我想结合find type f命令与 exec选项与head 1 filename但无济于事 有没有一些聪明的 单行的解决方案来解决这个问题 您可以使用find with awk
  • hashmap包含键的复杂度

    我写了一个方法来查找列表中的重复项 它工作正常 但我担心使用 containsKey 的复杂性 当我们使用 containsKey 时 我们必须为每个键计算一个哈希函数 然后将每个键与我们的搜索项进行比较 对吗 那么复杂度不是 O n 吗
  • Spinner onItemSelected() 执行不当[重复]

    这个问题在这里已经有答案了 可能的重复 Android Spinner OnItemSelected 调用错误 打开微调器时没有用户操作 https stackoverflow com questions 5124835 android s
  • 为什么我的 Mongoose 3.8.7 架构 getter 和 setter 被忽略?

    在使用 Node js Mongoose 和 MongoDB 时 我发现当我执行 findOne 查询时 我的 Mongoose 模式 getter 和 setter 不会触发 我发现一个旧线程表明 2 x 版本中的 getter 和 se
  • 检测Android设备是否具有短信发送功能的程序是什么?

    检测Android设备是否具有短信发送功能的程序是什么 我希望我的应用程序在尝试实际发送短信之前知道设备是否能够发送短信 谢谢 if getPackageManager hasSystemFeature PackageManager FEA
  • firestore安全规则中更新字段的数量

    我正在从客户端进行批量操作以仅更新一个字段 但在进行批量操作和安全规则测试时 观察到多个字段正在被更新 我用这个检查了request resource data size gt 1 and request resource data key
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 如果浏览器关闭,GoogleWebAuthorizationBroker.AuthorizeAsync() 会挂起

    我正在编写一个 C 桌面应用程序 可以将其输出复制到用户的 Google Drive 但是 当我尝试使用 GoogleWebAuthorizationBroker AuthorizeAsync 授权访问 Google 时 如果用户关闭浏览器
  • 使用 forge(或其他 JavaScript 方法)生成随机大素数

    我需要在 JavaScript 中生成一个随机大 大约 4096 位 素数 并且我已经在使用 forge Forge 必须有某种生成器来完成此类任务 因为它实现了 RSA 而 RSA 也依赖于随机素数 然而 当你只想获得一个随机素数 类似于