RSA加密字符串长于密钥

时间:2014-10-21 18:32:37

标签: javascript encryption rsa

Hei Guys,

我用JS和公钥加密字符串。我使用JSBN代码,但问题在于创建BigInt。

RSA.js:

// Copyright (c) 2005  Tom Wu
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3); // getting the Bigint
if(m == null) return null; // nullcheck
var c = this.doPublic(m); // encrypting the BigInt

问题出在" pkcs1pad2"。如果文本比密钥的BitLength更长,则该函数有一个检查。如果是这样,请返回,否则创建一个BigInt。

// Copyright (c) 2005  Tom Wu
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;
  } else if((c > 127) && (c < 2048)) {
    ba[--n] = (c & 63) | 128;
    ba[--n] = (c >> 6) | 192;
  } else {
    ba[--n] = (c & 63) | 128;
    ba[--n] = ((c >> 6) & 63) | 128;
    ba[--n] = (c >> 12) | 224;
  }
}
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
while(n > 2) { // random non-zero pad
  x[0] = 0;
  while(x[0] == 0) rng.nextBytes(x);
  ba[--n] = x[0];
}
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);

我无法弄明白,作者的意思是&#34; // TODO:修复utf-8&#34;。有谁能解释一下? &amp; /给出一个有效的答案?

1 个答案:

答案 0 :(得分:2)

这尝试实现PKCS#1中定义的PKCS#1 v1.5填充。用于加密must be 11 bytes smaller than the size of the modulus的PKCS#1 v1.5填充的输入:

  

M:要加密的消息,长度为mLen的八位字节串,               其中mLen <= k - 11

如果邮件较大,则RSA加密无法继续。通常这不是问题:使用带有随机密钥的对称密码进行加密,然后使用RSA加密该随机密钥。这称为hybrid cryptosystem

注释的原因在于JavaScript(就像许多脚本语言一样)在区分字节和文本方面存在一些问题。如果s是文本,那么s.length可能会返回字符数而不是字节数。这是针对实现weak typing的语言进行的,但它并不能让您更轻松地在JavaScript中创建和使用加密算法。

如果使用多字节编码(如UTF-8),则编码为2个字节的字符将增加总明文大小(以字节为单位)。因此,计算可能会失败。要么是这样,要么你将松开无法用单个字节编码的字符 - 如果我快速查看代码,如果超出ASCII(7位,值0..127)范围,可能会发生的代码字符。