Javascript RSA-OAEP 不适用于任意输入长度

标签 javascript encryption rsa webcrypto-api

<分区>

我正在尝试使用 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'));

最佳答案

RSA 不适用于批量加密。可以使用 RSA 加密的具体数据量取决于 key 大小和您使用的填充。

2048 位 key 允许256 字节,其中OAEP 填充占用42 字节,剩下214 字节用于加密数据。

通常您会使用 RSA 来加密对称 key ,然后再使用该 key 来加密实际数据。通常称为 hybrid encryption .

关于Javascript RSA-OAEP 不适用于任意输入长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767296/

相关文章:

javascript - 在 ember.js 中递归期间设置全局变量时出现错误

javascript - 设置从 jQuery '.load()' 方法加载的链接的颜色

javascript - 如何安全地将数据从 php 表单传递到 html

java - BouncycaSTLe:如何创建 RSA 私钥的加密 PKCS8 表示?

https - 戈朗 : HTTPS request yields "crypto/rsa: verification error"

javascript - 在 Javascript 中将函数更改为同步执行

javascript - 正确的 Javascript 语法是什么

encryption - AES key 推导

node.js - 如何解码快速 session cookie?

licensing - 软件许可计划