我使用的是在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太长”?
为什么你不能使用你在研究中发现的指导?例如,当你选择k = 1024和e = 65537时会发生什么? – 2014-08-29 20:15:31
使用现有的库或OpenSSL生成一些密钥并调查或阅读更多密码。 – 2014-08-29 23:10:53
@GregS我找不出N的值,因此选择E =“65537”不会产生相同的错误消息,“消息对于RSA太长”。 – kwills 2014-09-02 13:12:26