首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用JSBN选择N和E生成Javascript RSA密钥

利用JSBN选择N和E生成Javascript RSA密钥
EN

Stack Overflow用户
提问于 2014-08-29 15:49:21
回答 1查看 1.4K关注 0票数 0

我正在使用在http://www-cs-students.stanford.edu/~tjw/jsbn/中找到的JSBN库。我特别想让RSASetPublic()调用rsa.js,如下所示:

代码语言:javascript
复制
publicPem = RSASetPublic(N,E);

例如,当N= "667“和E= "327”时,我收到的警报“消息对RSA来说太长了”。

功能是

代码语言:javascript
复制
function RSASetPublic(N,E) {
  if(N != null && E != null && N.length > 0 && E.length > 0) {
    this.n = parseBigInt(N,16);
    this.e = parseInt(E,16);
  }
  else
    alert("Invalid RSA public key");
}

其他功能..。

代码语言:javascript
复制
function parseBigInt(str,r) {
  return new BigInteger(str,r);
}

function BigInteger(a,b,c) {
  if(a != null)
    if("number" == typeof a) this.fromNumber(a,b,c);
    else if(b == null && "string" != typeof a) this.fromString(a,256);
    else this.fromString(a,b);
}

BigInteger fromString()函数是..。

代码语言:javascript
复制
function bnpFromString(s,b) {
  var k;
  if(b == 16) k = 4;
  else if(b == 8) k = 3;
  else if(b == 256) k = 8; // byte array
  else if(b == 2) k = 1;
  else if(b == 32) k = 5;
  else if(b == 4) k = 2;
  else { this.fromRadix(s,b); return; }
  this.t = 0;
  this.s = 0;
  ....

然后,要使用生成的密钥(如RSAEncrypt( text ) ),当文本被填充和加密时,n是非常重要的。

代码语言:javascript
复制
function RSAEncrypt(text) {
  var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
  if(m == null) return null;
  var c = this.doPublic(m);
  if(c == null) return null;
  var h = c.toString(16);
  if((h.length & 1) == 0) return h; else return "0" + h;
}

function pkcs1pad2(s,n) {
  if(n < s.length + 11) { // TODO: fix for utf-8
    alert("Message too long for RSA");
    return null;
  }
  var ba = new Array();
  var i = s.length - 1;
  while(i >= 0 && n > 0) {
     var c = s.charCodeAt(i--);
     if(c < 128) { // encode using utf-8
        ba[--n] = c;
     }
     ....

因此,我从各种来源收集了以下建议:

  • N是模,两个素数(N=pq)的乘积长度不超过k位。
  • P和q是两个大素数?
  • N用于指定键大小。
  • 典型位长为k= 1024,2048,3072,4096,.
  • 从{2,4,8,16,32,256}中选择parseBigInt的第二个参数
  • E是公共指数,a小于(p-1)(q-1),并与(p-1)(q-1)相对应。
  • 从{3,5,17,257,65537}中选择e值。

http://asecuritysite.com/encryption/rsa这样的站点有助于对算法的高层次理解,但我仍然不知道his如何转换成特定的参数分配,也不知道N和E(相对于n和e)有何含义。那么N和E应该是什么呢?我如何选择这样的信息不是“太长的RSA"?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-04 17:33:09

由于很难找到一个1024位数,它是两个大素数p和q的乘积,所以我找到的解决方案如下:

  1. 要下载openssl,启动在bin中找到的.exe,并使用以下方法生成一个N值: $openssl genrsa -out privatekey.txt 1024 $openssl猫privatekey.txt
  2. 要使用jsbn2.js函数RSAGenerate(B,E)传递B=1024和E=your公共指数,可能是"10001“(base16),这样就可以为您生成模数。

我还注意到,jsbn喜欢它的十六进制输入,而不是十进制,然后将它们转换为BigInteger类型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25571801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档