到目前为止,我使用的是 JSEncrypt,它能够从 PEM 格式的字符串中加载公钥。然后将其与 RSA 一起使用以加密字符串。例如 :
<textarea id="pubkey">-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+iOltdDtDdUq6u67L2Mb4HW5j
7E1scmYtg2mnnQD85LxFICZv3I3rQ4wMulfcH+n9VCrifdu4vN89lRLKgsb9Kzim
GUrbOWEZdKZ9D5Sfo90EXocM5NtHou14aN8xkRWbN7x/RK5o9jfJwKmrC1fCm6tx
2Qwvx5kypWQUN6UpCQIDAQAB
-----END PUBLIC KEY-----
</textarea>
接着:
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
我想对 WebCrypto 做同样的事情,但我不明白该怎么做。我尝试了以下步骤:
- 删除 PEM 标头
- 删除 PEM 页脚
- 删除 CR/LF
- 修剪字符串
- 解码 Base64 字符串
- 将结果转换为 ArrayBuffer
然后我尝试导入密钥:
cryptoSubtle.importKey("spki", publicKey, {name: "RSA-OAEP", hash: {name: "SHA-256"}}, false, ["encrypt"]);
我尝试了很多方法(解压 ASN/DER 格式等)但我得到了各种错误(DOMException 数据等)。我不知道 PEM 格式是否可以作为受支持的格式接受,或者我是否必须将密钥转换为 JSON Web Key 格式等。
没有 3rd-party JS 库有没有简单的方法?