6

http://www-cs-students.stanford.edu/~tjw/jsbn/のrsa.js v1.0 を使用して、ブラウザーで ASCII 文字列を暗号化しています。文字列は、実際には倍長の TripleDes キーを含む 16 バイトの配列です。RSA v1.0 ではこれが機能します。バイト配列は、(Bouncy Castle または Thales HSM を使用して) サーバー上で 16 バイト配列として正しく復号化されます。

例えば

var zpk = hex2a("E0F8AD4092F81FC401E60ECB7F5B8F1A");
var rsa = new RSAKey();
rsa.setPublic(modulus, exponent);
var res = rsa.encrypt(zpk);
if (res) {
    document.rsatest.zpkrsa.value = hex2b64(res);
}

rsa.js v1.4 を移動すると、これは機能しなくなります。Bouncy Castle はデータを復号化しますが、16 バイト配列ではなく、25 バイト配列になりました。

rsa.js ライブラリで確認できる主な違いは、v1.1 リリース ノートにあります。

JavaScript 文字列の PKCS1 エンコードおよびデコード時の非 ASCII 文字の utf-8 エンコードのサポートが追加されました。

v1.0 の PKCS#1 パディングは次のとおりです。

// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
function pkcs1pad2(s, n) {
    if (n < s.length + 11) {
        alert("Message too long for RSA");
        return null;
    }
    var ba = new Array();
    var i = s.length - 1;
    while (i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--);
    ba[--n] = 0;
    var rng = new SecureRandom();
    ...
    return new BigInteger(ba);
}

v1.1 以降の PKCS#1 パディング機能は次のとおりです。

// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
function pkcs1pad2(s,n) {
  if(n < s.length + 11) { // TODO: fix for utf-8
    console.error("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;
  ...
  return new BigInteger(ba);
}

rsa.js v1.0 では、各文字を 1 バイト文字として扱いました。v1.1 以降の文字は、マルチバイト utf-8 かどうかを確認するためにテストされています。

私の唯一のオプションは次のいずれかのようです:

  1. rsa.js v1.0 に固執する
  2. utf-8 文字検出を無効にできる rsa.js (および rsa2.js) の修正バージョンを作成します。
  3. (編集済み) PKCS#1 v2 (oaep) をサポートする defensivejs.com を使用するようにコードを変更します。

アイデア?

4

1 に答える 1