2

我有一条可以用 openssl 解码的 RSA 加密消息:

openssl rsautl -inkey cert.pem -pubin -in encrypted -out plaintext

如何使用 WebCrypto API 实现这一点?尝试以下操作时出现错误:

window.crypto.subtle.importKey(
"spki",
new Uint8Array(pubKey),
{
  name: "RSA-OAEP",
  hash: {name: "SHA-256"}
},
true,
["verify"]
)
.then(function(publicKey){

  console.log(publicKey);

  window.crypto.subtle.decrypt(
    {
      name: "RSA-OAEP"
    },
    publicKey,
    new Uint8Array(encrypted)
    )
    .then(function(decrypted){
      console.log(new Uint8Array(decrypted));
    })
    .catch(function(err){
      console.error(err);
    });

})
.catch(function(err){
  throw(err);
});

(见https://jsfiddle.net/tz2cpze6/1/

4

1 回答 1

0

正如 Artjom B. 在他的评论中指出的那样,Webcrypto API 的验证操作就是这样做的。但是,在我的情况下,需要 PKCS#1 v1.5,因为我在评论中提到的 ASN.1 结构是 PKCS#1 v1.5 规范的一部分。

可以使用以下 OpenSSL 命令生成测试签名:

openssl dgst -sha1 -sign private_key.pem -out signature data

可以通过以下方式验证创建的签名:

openssl dgst -sha1 -verify public_key.pem -signature signature data

这个问题是由于没有真正理解 RFC 3477 造成的。

于 2016-04-26T11:00:15.630 回答