Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RSA-OAEP不适用于任意输入长度_Javascript_Encryption_Rsa_Webcrypto Api - Fatal编程技术网

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

Javascript RSA-OAEP不适用于任意输入长度,javascript,encryption,rsa,webcrypto-api,Javascript,Encryption,Rsa,Webcrypto Api,我正在尝试使用SublecryPto在javascript(firefox)中加密字符串。问题是,加密只对短输入有效。一旦字符串(testdata)超过190个字符,它将失败并出现操作错误。 为什么SublecryPto会这样做?我如何解决它 代码: 经过一些研究,我发现您的问题可能有以下原因: 特定于浏览器: 错误的Firefox版本。v34支持该库,而且兼容性级别可能取决于您使用的浏览器版本。确保您有正确的版本: 加密数据时: normalizedAlgorithm的计数器成员没有长

我正在尝试使用SublecryPto在javascript(firefox)中加密字符串。问题是,加密只对短输入有效。一旦字符串(testdata)超过190个字符,它将失败并出现操作错误。 为什么SublecryPto会这样做?我如何解决它

代码:


经过一些研究,我发现您的问题可能有以下原因:

特定于浏览器:

  • 错误的Firefox版本。v34支持该库,而且兼容性级别可能取决于您使用的浏览器版本。确保您有正确的版本:

加密数据时:

  • normalizedAlgorithm的计数器成员没有长度为16字节
  • normalizedAlgorithm的长度成员为零或大于128
  • 密钥生成失败

考虑到这一点,我相信问题不在于要加密的文本,而在于如何调用函数

另一个可能的原因(尽管我不会把钱放在上面)是加密一个长字符串会产生一个对浏览器来说太长的变量。查看此讨论:


RSA不适用于批量加密。可以使用RSA加密的特定数据量取决于密钥大小和使用的填充

2048位密钥允许256字节,其中OAEP填充占用42字节,为加密数据保留约214字节


通常,您会使用RSA对对称密钥进行加密,然后使用对称密钥对实际数据进行加密。通常被称为。

它不适用于firefox 45/47或chrome 49。所有机具子机具PTO。密钥生成成功。我如何检查normalizedAlgorithm?恐怕我不知道=(那么,对于批量加密,您会推荐什么加密方案?下面是我在基于HTML5的JS中尝试这种混合方法的一个例子:。我不是密码专家,但它可以工作。
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'));