为什么我不能使用 RSASSA-PKCS1-v1_5 到 encrypt/decrypt?
Why I can't use RSASSA-PKCS1-v1_5 to encrypt/decrypt?
首先,我对密码学完全陌生,我只是对一些加密算法及其工作原理有基本的了解,例如 RSA、DES 等。
我想用 SubtleCrypto in JS 做一些事情,包括 signing, verifying, encrypting, decrypting
使用 RSA。
我只是无法生成完成所有这些操作的密钥对;例如,下面的代码可以很好地生成密钥对来执行 signing/verifying:
let keyPair = window.crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-512"
},
true,
['sign', 'verify']
);
keyPair.then((value)=>{
console.log("worked properly.");
})
.catch((error)=>{console.log("Error:", error)})
但是当我使用上面的代码为 encrypting/decrypting 生成密钥对时,我会得到一个 DOMException(在浏览器中)或 SyntaxError(在片段中):
let keyPair = window.crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-512"
},
true,
['encrypt', 'decrypt']
);
keyPair.then((value)=>{
console.log("worked properly.");
})
.catch((error)=>{console.log("Error:", error)})
注意: 我发现 RSA-OAEP 的行为完全不同,我的意思是它与 encrypting/decrypting 一起工作,但在 signing/verifying 时卡住并显示相同的错误.
问题:您能否提供一个link来解释这些RSA变体之间的区别以及我应该在什么时候使用其中的一个?我用谷歌搜索,但找不到任何内容,MDN
中也没有任何解释
抱歉,如果我的英语不是很好。
要回答的问题是:
Question: Can you please provide me a link which explain the
differences between these RSA variants and when should I use which one
of them?
你可以参考这个Documentation,在Supported algorithms部分的底部你可以找到table 它为您提供了关于哪种算法适用于哪种操作的完整指导table。
同一算法不能用于所有操作,因为在问题下方@Topaco ,它们使用不同的填充变体等等:
Encryption/decryption and signing/verifying use different padding
variants. This is explained in RFC8017. Encryption/decryption apply
the older RSAES-PKCS1-v1_5 and the more modern RSAES-OAEP. The
corresponding counterparts in the signing/verifying context are
RSASSA-PKCS1-v1_5 and RSASSA-PSS. The WebCrypto API does not use
RSAES-PKCS1-v1_5 anymore since 2014, see here.
现在使用这些算法进行解密似乎有点不安全。
但如果您仍在寻找使用 RSASSA-PKCS1-v1_5 来 encrypt/decrypt 的方法,请查看 https://www.npmjs.com/package/jsencrypt
更新:尚未证明使用RSASSA-PKCS1-v1_5是不安全的,但仍然不推荐。
首先,我对密码学完全陌生,我只是对一些加密算法及其工作原理有基本的了解,例如 RSA、DES 等。
我想用 SubtleCrypto in JS 做一些事情,包括 signing, verifying, encrypting, decrypting
使用 RSA。
我只是无法生成完成所有这些操作的密钥对;例如,下面的代码可以很好地生成密钥对来执行 signing/verifying:
let keyPair = window.crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-512"
},
true,
['sign', 'verify']
);
keyPair.then((value)=>{
console.log("worked properly.");
})
.catch((error)=>{console.log("Error:", error)})
但是当我使用上面的代码为 encrypting/decrypting 生成密钥对时,我会得到一个 DOMException(在浏览器中)或 SyntaxError(在片段中):
let keyPair = window.crypto.subtle.generateKey(
{
name: "RSASSA-PKCS1-v1_5",
modulusLength: 4096,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-512"
},
true,
['encrypt', 'decrypt']
);
keyPair.then((value)=>{
console.log("worked properly.");
})
.catch((error)=>{console.log("Error:", error)})
注意: 我发现 RSA-OAEP 的行为完全不同,我的意思是它与 encrypting/decrypting 一起工作,但在 signing/verifying 时卡住并显示相同的错误.
问题:您能否提供一个link来解释这些RSA变体之间的区别以及我应该在什么时候使用其中的一个?我用谷歌搜索,但找不到任何内容,MDN
中也没有任何解释抱歉,如果我的英语不是很好。
要回答的问题是:
Question: Can you please provide me a link which explain the differences between these RSA variants and when should I use which one of them?
你可以参考这个Documentation,在Supported algorithms部分的底部你可以找到table 它为您提供了关于哪种算法适用于哪种操作的完整指导table。
同一算法不能用于所有操作,因为在问题下方@Topaco
Encryption/decryption and signing/verifying use different padding variants. This is explained in RFC8017. Encryption/decryption apply the older RSAES-PKCS1-v1_5 and the more modern RSAES-OAEP. The corresponding counterparts in the signing/verifying context are RSASSA-PKCS1-v1_5 and RSASSA-PSS. The WebCrypto API does not use RSAES-PKCS1-v1_5 anymore since 2014, see here.
现在使用这些算法进行解密似乎有点不安全。
但如果您仍在寻找使用 RSASSA-PKCS1-v1_5 来 encrypt/decrypt 的方法,请查看 https://www.npmjs.com/package/jsencrypt
更新:尚未证明使用RSASSA-PKCS1-v1_5是不安全的,但仍然不推荐。