2014-08-29 79 views
0

我使用的是在http://www-cs-students.stanford.edu/~tjw/jsbn/处找到的JSBN库。我特别想使rsa.js的RSASetPublic()调用,就像这样:为JavaScript选择N和E使用JSBN的RSA密钥生成

publicPem = RSASetPublic(N,E); 

例如,当N =“667”和E =“327”我得到的警告“消息太长为RSA“。

功能是

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"); 
} 

它调用等功能...

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()函数...

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(文本),当文本被填充和加密时,n是重要的...

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)个长度不超过
  • pk信息比特的乘积q是两个大素数?
  • N被用于指定密钥长度
  • 典型比特长度是K = 1024,2048,3072,4096,...
  • 选择从parseBigInt第二参数{2,4,8,16,32,256}
  • e是公开指数,小于一个数量和互质(p-1)(q-1)
  • 选择e的从{3,5,17,257,65537}
的值

http://asecuritysite.com/encryption/rsa这样的网站有助于高度理解算法,但我仍然不知道他是如何转化为具体的参数分配,或者N和E(相对于n和e)明确的意思。那么N和E应该是什么?我如何选择这样的消息不是“RSA太长”?

+0

为什么你不能使用你在研究中发现的指导?例如,当你选择k = 1024和e = 65537时会发生什么? – 2014-08-29 20:15:31

+0

使用现有的库或OpenSSL生成一些密钥并调查或阅读更多密码。 – 2014-08-29 23:10:53

+0

@GregS我找不出N的值,因此选择E =“65537”不会产生相同的错误消息,“消息对于RSA太长”。 – kwills 2014-09-02 13:12:26

回答

1

因为很难找到1024位数字,是两个大素数p和q的产品,我找到了解决办法是:

  1. 下载OpenSSL的,启动​​在bin中的.exe文件,并使用产生的N值:

    $的openssl genrsa -out privatekey.txt 1024

    $ OpenSSL的猫privatekey.txt

  2. 使用JSB n2.js函数RSAGenerate(B,E)传入B = 1024,E =您的公开指数,可能是“10001”(base16),以便为您生成模数。

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