问题描述
首先,我是密码学的新手,我对一些加密算法及其工作原理(例如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。