0

http://www-cs-students.stanford.edu/~tjw/jsbn/にある JSBN ライブラリを使用しています。私は特に、次のように rsa.js で RSASetPublic() 呼び出しを作成しようとしています。

publicPem = RSASetPublic(N,E);

たとえば、N = "667" および E = "327" の場合、"Message too long for 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(text) などで使用するには、テキストがパディングされて暗号化されるときに 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 は法であり、長さが k ビットを超えない 2 つの素数 (N=pq) の積です。
  • p と q は 2 つの大きな素数ですか?
  • N はキーサイズを指定するために使用されます
  • 一般的なビット長は、k = 1024、2048、3072、4096、...
  • {2,4,8,16,32,256} から parseBigInt の 2 番目の引数を選択します
  • e は公開指数であり、(p-1)(q-1) よりも小さく互いに素である数値です。
  • {3、5、17、257、65537} から e の値を選択します

http://asecuritysite.com/encryption/rsaのようなサイトは、アルゴリズムの高レベルの理解に役立ちますが、彼が特定のパラメーター割り当てにどのように変換されるか、または N と E (対 n と e) が明示的にどのように変換されるかはまだわかりません平均。では、N と E は何であるべきでしょうか? メッセージが「RSA には長すぎない」ように選択するにはどうすればよいですか?

4

1 に答える 1

1

2 つの大きな素数 p と q の積である 1024 ビットの数値を見つけるのは難しいため、私が見つけた解決策は次のとおりです。

  1. openssl をダウンロードし、bin にある .exe を起動し、次を使用して N 値を生成します。

    $openssl genrsa -out privatekey.txt 1024

    $openssl cat privatekey.txt

  2. jsbn2.js 関数 RSAGenerate(B,E) を使用して、B=1024 および E=公開指数 (おそらく "10001" (base16)) を渡すと、モジュラスが生成されます。

また、jsbn は 10 進数ではなく 16 進数の入力を好み、それらを BigInteger 型に変換することにも注意しました。

于 2014-09-04T17:33:09.930 に答える