为什么我不能使用RSASSA-PKCS1-v1_5进行加密/解密?

问题描述

首先,我是密码学的新手,我对一些加密算法及其工作原理(例如RSA,DES等)有基本的了解。

我想使用SubtleCrypto in JS做一些事情,包括使用RSA的signing,verifying,encrypting,decrypting

我只是无法生成用于完成所有操作的密钥对;例如,以下代码可以很好地生成用于进行签名/验证的密钥对:

let keyPair = window.crypto.subtle.generateKey(
    {
        name: "RSASSA-PKCS1-v1_5",modulusLength: 4096,publicExponent: new Uint8Array([1,1]),hash: "SHA-512"
    },true,['sign','verify']
  );
  
  keyPair.then((value)=>{
    console.log("worked properly.");
  })
  .catch((error)=>{console.log("Error:",error)})

但是当我使用上面的代码生成用于加密/解密的密钥对时,我会得到一个DOMException(在浏览器中)或SyntaxError(在代码段中):

let keyPair = window.crypto.subtle.generateKey(
    {
        name: "RSASSA-PKCS1-v1_5",['encrypt','decrypt']
  );
  
  keyPair.then((value)=>{
    console.log("worked properly.");
  })
  .catch((error)=>{console.log("Error:",error)})

注意:我发现RSA-OAEP的行为完全不同,我的意思是它可以与加密/解密配合使用,但卡在签名/验证上并显示相同的错误

问题::能否请您提供一个链接,以解释这些RSA变体之间的区别,何时应使用其中之一?我用Google搜索,但找不到任何内容MDN

中没有解释

对不起,如果我的英语不太好。

解决方法

回答以下问题:

问题:能否请您提供一个链接来解释 这些 RSA 变体之间的差异以及我应该何时使用哪一个 其中?

您可以参考此Documentation,在支持的算法部分的底部,您可以找到一个表格,该表格为您提供有关哪种算法适合的完整指南用于哪个操作。

不能对所有操作使用相同的算法,因为正如问题下方的@Topaco commented,它们使用不同的填充变体等等:

加密/解密和签名/验证使用不同的填充 变种。这在 RFC8017 中有解释。加密/解密适用 较旧的 RSAES-PKCS1-v1_5 和更现代的 RSAES-OAEP。这 签名/验证上下文中的对应对应物是 RSASSA-PKCS1-v1_5 和 RSASSA-PSS。 WebCrypto API 不使用 自 2014 年起不再使用 RSAES-PKCS1-v1_5,请参阅 here