使用sjcl解密非JSON格式ArrayBuffer密文及JWK转PKCS8问题
问题解答
1. 能否使用sjcl解密?
不能。sjcl.decrypt是为sjcl自带对称加密方案输出的封装JSON格式密文设计的,且sjcl本身没有内置RSA-OAEP算法实现,完全不匹配你的加密场景。
2. JWK格式私钥转PKCS8及解密方案
jsrsasign原生支持JWK格式密钥的导入,也支持直接导出PKCS8格式密钥,你可以按以下步骤操作:
- 第一步:导入JWK私钥(可按需导出PKCS8)
// 解析你拿到的JWK格式私钥字符串 const jwk = JSON.parse(privateKeyJsonStr); // 直接导入JWK生成RSA密钥实例,无需手动转PKCS8 const rsaPrivateKey = KEYUTIL.getKey(jwk); // 若确实需要PKCS8格式的PEM文件,执行下行即可导出 const pkcs8PrivateKeyPem = KEYUTIL.getPEM(rsaPrivateKey, "PKCS8PRV");
- 第二步:使用RSA-OAEP解密数据
// 将Uint8Array格式的密文转为base64 const cipherBase64 = btoa(String.fromCharCode(...cipherUint8Array)); // 用SHA-256对应配置执行RSA-OAEP解密,得到十六进制格式的明文 const decryptedHex = RSAOAEP.decrypt(cipherBase64, rsaPrivateKey, "sha256"); // 十六进制转Uint8Array后解析为原始数据 const decryptedBytes = new Uint8Array(decryptedHex.match(/../g).map(h => parseInt(h, 16))); const originalData = JSON.parse(new TextDecoder().decode(decryptedBytes));
注意事项
- 请使用完整功能版的jsrsasign库,精简版可能会缺失RSAOAEP、KEYUTIL相关模块
- 解密时指定的哈希算法必须和加密时的SHA-256完全一致,否则会解密失败
内容的提问来源于stack exchange,提问作者Neneil
相关产品推荐
相关产品推荐

