【问题标题】:Decrypting RSA with JavaScript使用 JavaScript 解密 RSA
【发布时间】:2021-04-14 11:09:38
【问题描述】:

我正在编写一个从服务器接收 RSA 加密响应的网络应用程序。它需要解密这个文件。

到目前为止,我已经尝试使用 JSEncrypt 在前端解密文件。问题似乎是后端没有正确加密文件。如果我将私钥和公钥都放在前端,我可以成功加密和解密。问题似乎是我加密响应的方式。当我在 nodeJS 中读取文件并使用以下代码加密文件时:

fs.readFile("rsaPublicKey", "utf8", (err, data) => {
  if (err) throw err;

  pubKey = data;
});
encryptedMessage = crypto.publicEncrypt(
  {
    key: pubKey,
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
    oaepHash: "sha256",
  },
  Buffer.from(message)
);

res.send({"response": encryptedMessage.toString("base64")});

该消息大于使用 JSEncrypt 加密的同一消息。

Node.JS 消息:WLptALzMMws/Qj8qzeYkQ1NyRknoBGX0+oHmtzd0Cwl/RmWnwt6wSJ1qdbk5GMPcEML5iqCISqTfPTSEC6M37KIJAgGLViPENKcvonT7qQbMsn0yftFMl9grn1oLQz567t3lWpdyuCa99xqG+tGsAAOK84HHCW+nprSH6+7olysTnSzzZWvvBl6VGTpmwtoBEGOnZ5C/XLwiW7b2UuzHsksIA1s55OkJMOOUA6neZiJIzHsJSHZGgigKvKwYNQbjhmEBbdNVSvCPIE/d9dpTtWNABcnQX7SCA6/sTZH/f0OnGGXOyYabhq84fdw/WwpouUBWsRQLQYJgKy3EqY/y/w==

JSEncrypt 消息: Sq9KQyp7KDqy1CBFRLtXm4ZAdxidgUNlp0d6X6xm3m+aBXKv4H7DVu0O40EMWeSWl3dQcBBC/oguJsoAz/GY//77ElIPIRuvPK4YIWPNq2fjoIgIs3Ew4I5TKAP4rph//NSlDLPc4ppXQjj/YO2238EHney9Wxxa9EZzE/p48arkxuEjB0gakWyVgTlF8x6H7LGsD4epS7RWJ0ua1kG1J6ZuMB82qBvq2MugLEuQamAfml4LtwWYFTJ/dIcAqVqrtHe6/F2oNGwXsE2GDEeZcFr4vTkejCs5dFcbbcgg/KVnROdGQHJlDGl0uUBy/2UNml3cT3FocjXkPGJa0zu3/g==

有什么方法可以尝试让它工作吗?

【问题讨论】:

  • 消息比用JSEncrypt加密的消息大:两条消息大小相同,Base64解码后为32字节。
  • JSEncrypt 仅支持 PKCS#1 v1.5 填充,但不支持 OAEP,here。在 NodeJS 代码中应用了 OAEP。双方必须使用相同的填充才能兼容。 PKCS#1 v1.5 填充可以在 NodeJS 代码中应用crypto.constants.RSA_PKCS1_PADDING
  • @Topaco 谢谢你!它现在可以工作了,但我想知道是否有任何 Javascript 库可以解密 OAEP 填充?很抱歉,我对加密很陌生,在尝试实施之前我应该​​阅读 RSA。
  • 一种可能性是Web Crypto API。该库不好用,但有examples。通常,图书馆推荐与 SO 无关。因此,您还应该在网上查看是否可以找到最适合您需求的库。

标签: javascript node.js encryption rsa jsencrypt


【解决方案1】:

你可以试试我最近修改的 jsencrypt 版本。

我遇到了相反的问题:.net 后端没有使用 bouncycastle 解密使用私钥客户端进行的加密。

我进行了一些代码清理并重新访问了填充,以便与展位案例互操作。

试试看,告诉我:https://github.com/michaeldisaro/JSEncrypt

【讨论】:

    【解决方案2】:

    原来 JSEncrypt 不支持我在后端使用的填充。我将后端的填充更改为crypto.constants.RSA_PKCS1_PADDING,如 cmets 中的 Topaco 所示。另一种可能的选择是使用 https://github.com/michaeldisaro/JSEncrypt 并再次使用 OAEP 填充。

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多