3

SubtleCrypto を使用して、javascript (firefox) で文字列を暗号化しようとしています。問題は、暗号化が短い入力に対してのみ機能することです。文字列 (testdata) が 190 文字を超えると、OperationError で失敗します。SubtleCrypto がそのように動作するのはなぜですか?どうすれば解決できますか?

コード:

function str2ab(str) {
  var encoder = new TextEncoder('utf-8');
  return encoder.encode(str);
}

function ab2str(buf) {
  var decoder = new TextDecoder('utf-8');
  return decoder.decode(buf);
}

var keypair;
var algorithmKeyGen = {
  name: 'RSA-OAEP',
  modulusLength: 2048,
  publicExponent: new Uint8Array([1,
    0,
    1
  ]), // Equivalent to 65537
  hash: {
    name: 'SHA-256'
  }
};
var crypter = window.crypto.subtle;

function encrypt(buffer) {
  return crypter.encrypt(algorithmKeyGen, keypair.publicKey, buffer).then(
    function(data) {
      alert(ab2str(data));
    },
    function(error) {
      alert(error);
    }
  );
}

var testdata = "aasasadasdaasasadasdaasazzzzzzzzzzzzzzzzzzzzuuuuuuuuuuuuuuuuuuuuuuuzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzuuuuudddsdfssssssssssdddddddddddzzzzzzzzzzzzzzzzzzzzzzzzzzzzzppppppggppppppppppppppppssssstt"

crypter.generateKey(algorithmKeyGen, true, [
  'sign',
  'encrypt',
  'decrypt',
  'verify',
  'deriveKey'
]).then(function(res) {
  keypair = res;
  encrypt(str2ab(testdata));
}, console.error.bind(console, 'Unable to generate a key'));
4

2 に答える 2

4

RSAは一括暗号化用ではありません。RSA で暗号化できる特定のデータ量は、使用しているキー サイズとパディングによって異なります。

2048 ビットのキーでは256 バイトが許可され、そのうちOAEP パディングに42 バイトが必要で、暗号化されたデータ用に約214 バイトが残ります。

通常、実際のデータの暗号化に使用される対称キーの暗号化にはRSAを使用します。多くの場合、ハイブリッド暗号化と呼ばれます。

于 2016-04-21T14:50:14.467 に答える
0

いくつかの調査の結果、問題の次の原因が考えられることがわかりました。

ブラウザ固有:

  • 間違った Firefox のバージョン。ライブラリは v34 でサポートされており、使用するブラウザーのバージョンによって互換性レベルが異なる可能性があります。適切なバージョンがあることを確認してください。

https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt

データを暗号化する場合:

  • normalizedAlgorithm のカウンター メンバーの長さは 16 バイトではありません
  • normalizedAlgorithm の長さのメンバーがゼロであるか、128 を超えています
  • 鍵の生成に失敗する

https://www.w3.org/TR/WebCryptoAPI/

これを念頭に置いて、問題は暗号化されるテキストにあるのではなく、関数を呼び出す方法にあると私は信じています。

もう 1 つの考えられる原因 (私はお金をかけませんが) は、長い文字列を暗号化すると、ブラウザにとって長すぎる変数が生成されるという事実です。この議論をチェックしてください:

于 2016-04-21T11:22:57.447 に答える