javascript - 使用加密模块进行 RSA 解密给出 "rsa OAEP sha512"

标签 javascript node.js

我无法使用加密模块解密使用 RSA OAEP sha512 加密的字符串。它给了我 oaep 解码错误。

我正在使用 NodeJS 和加密模块,我已经尝试使用这些 key 加密和解密示例文本,但我无法使用提供的 key 。我从移动客户端收到 toDecrypt 字符串,该客户端之前使用 RSA OAEP sha512 pcks1 对其进行了加密。

const crypto = require('crypto');

const privateKey = `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAz30HY5UIK1J/POyjNEqYDrcWPtgPckVLAHkqxshIgaGjJDI1
63ZkUVIbFnmMjmkmZqL74Ba3dg2BNH/CxvKgqLE1gfiWDg2kZr6JhPAzXvP+jaIf
SY8or3MaTUUlyniRtlaISAqXbmYGmyHgpJkHeLiG7jrpQD5roEFAuefrBdC8hM2i
tRUnGtauW063uM8bITKYctSQ3Yi1bGdOi+Guegi/1OE7QWSMTvRD/NRC50ig/sKR
uCftLkm+TvjADwEC1//6mwg5ijtEEaVQJWkQS4e8r5oP/Mus8N0L/iKW0EHMvTpz
B0hdrBaWXy+fAZtj7jYWPS4DXjdZZVH/XoiqxwIDAQABAoIBAQDMbugk2eYeqT3s
jUuQbh68APDOIpu1f0iSws++4/9smhHfzAkMYq4c4cUGs+QlPL01S0jYVgmVK2Eu
lOMYml5pV5Dc6k0Os6pUAVAFx5UV7VnVuvMQyxjPJZ24nHTLtVf8S+4i7Sye/a9s
kkiAZLbT3xwzBaBkSBxK3YAkq7kJFAXas6akZ3YrOkNMxDbnsAdUFg6gAab7IwGn
z3E9dw6I91jPyH7ABbPWKVS70Rn2uDCgAfkSPddSK7g9byAgAmIA2kbrfLou02wq
QwJvBkhH1QOt2lJhMwo6ch6Pc2UwiH/yWIUH4f+KBpTGpln0AldnFqfQCSiArpe5
ia1vNbwhAoGBAPlMOSJ+W/Dk3fS+xgLOEbI/FTheFH7P0NYla8RjSKB83uRxryOt
/WFHk2S4FO4/yuGdbsxIsCWHGVzw1HBaDhRfH2sgFcuWQi1IFY53YjMr2iS21p6d
c97xGx0Jh1/6Fys+zrszENCL4KbKL+iOvJWNz4AVLyZdwhGQDSXfKtWzAoGBANUR
Dij+Ol39EgZafHs1iB0s6aaYNtZL6A/zc+ZWzsQ/dZ7oUhWDHWFP7OOgASKrcn2l
mkXWxeArf5Ek5WErkx+u8+iQpHrAnhkoz0AT9f5KdWTVVAGClxz3owF80jE5GXx0
GF6XyPVASJcGSzYlXqx3RqsQB6WJwzjtANJbl/SdAoGAf2LDjyyiLmXERNt2stg5
kqtJXJQ2RNZMECDvAFr7MYadHn440DKH1r2MQ1sM1vEh6kdX5mr+Fy8BdsxYwVBD
AYXZuBOdD3qoNhsvaKz4MM2nmjsTT9mE69an1B6aXiCc1iwx1tYxMV9IW/HUqTDG
jGT6MqigfypJkE/baA6xBKECgYEAv3QQ3kL7HYOOk8jxPCExCs5VsY3rEIqqntKq
3Vo5d1xyi3TEdXIYj12rRip7erTGLyMESicgLTvI6BpYRwVJsVma7+ow8eBs77yc
5j5Jd9NeQ1nxn13B/ZSDk42erf5Z6VvEnhMTz1SRJavRH3la5exTwtinllcA5gEJ
EPyewX0CgYBQhKLGdY4qnk7G9feKp/m8SMeoiVqr392z5hUY+akolSe29k9HH4rr
FiE9PBFbZLTwQyJx+uG28oagae8N7RrPl3ACSvea8RGrQWoExm/CyCKXteaZtvwM
O3TWhEGE3wq+O3IxzIUOCyM6MritJ57c2K4Yav/dtOTgQBQ2gaohmA==
-----END RSA PRIVATE KEY-----`;

const publicKey = `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz30HY5UIK1J/POyjNEqY
DrcWPtgPckVLAHkqxshIgaGjJDI163ZkUVIbFnmMjmkmZqL74Ba3dg2BNH/CxvKg
qLE1gfiWDg2kZr6JhPAzXvP+jaIfSY8or3MaTUUlyniRtlaISAqXbmYGmyHgpJkH
eLiG7jrpQD5roEFAuefrBdC8hM2itRUnGtauW063uM8bITKYctSQ3Yi1bGdOi+Gu
egi/1OE7QWSMTvRD/NRC50ig/sKRuCftLkm+TvjADwEC1//6mwg5ijtEEaVQJWkQ
S4e8r5oP/Mus8N0L/iKW0EHMvTpzB0hdrBaWXy+fAZtj7jYWPS4DXjdZZVH/Xoiq
xwIDAQAB
-----END PUBLIC KEY-----`;


const toDecrypt = "zdbqTu8oQozUre039ytYvkWL+U3AAMhdZbstNWVOnmnmmie9B+R7d+AFM7dJRX8eAEl4+3lSat/MuX0Qgkd6VteXRQDLfNMWxb6ficf6jS4QPNtXwUopoSI7CLKRSrgeyGcnmTBwkhP/MFMWFW1KFCO3qgnxVPCNH9YC31XdJb4bv8akk+AG1f6MDE4Tt8onx0a2ioS7l/upMRBf+lqGrJhMuSh6Qw9B4LiiL2dNGpmpx7jceD5eXDLrJjqYo2O8HdK360RK6pLckhSltaRcZy+15ANSfHuMCbZq8zlLa2A+J8GSD0T0hBZIkFNIkP0VWV5nPGXCxTnws/RYCaie/Q==";
const buffer = Buffer.from(toDecrypt, 'base64');

console.log("-------------------------------------");
const result = crypto.privateDecrypt(privateKey, buffer);
console.log("result", result);

在线const result = crypto.privateDecrypt(privateKey, buffer); 我得到:错误:错误:04099079:rsa例程:RSA_padding_check_PKCS1_OAEP_mgf1:oaep解码错误

但它应该解密字符串。

最佳答案

NodeJS 的 RSA-OAEP 加密存在问题 https://github.com/nodejs/help/issues/1726

您可以使用@peculiar/webcrypto npm 模块,实现 WebCrypto 接口(interface)并支持 RSA-OAEP 机制。它基于 NodeJS Crypto API。

RSA-OAEP-SHA512解密示例

import { Crypto } from "@peculiar/webcrypto";

const crypto = new Crypto();

async function main() {
  const encryptedMessage = Buffer.from("zdbqTu8oQozUre039ytYvkWL+U3AAMhdZbstNWVOnmnmmie9B+R7d+AFM7dJRX8eAEl4+3lSat/MuX0Qgkd6VteXRQDLfNMWxb6ficf6jS4QPNtXwUopoSI7CLKRSrgeyGcnmTBwkhP/MFMWFW1KFCO3qgnxVPCNH9YC31XdJb4bv8akk+AG1f6MDE4Tt8onx0a2ioS7l/upMRBf+lqGrJhMuSh6Qw9B4LiiL2dNGpmpx7jceD5eXDLrJjqYo2O8HdK360RK6pLckhSltaRcZy+15ANSfHuMCbZq8zlLa2A+J8GSD0T0hBZIkFNIkP0VWV5nPGXCxTnws/RYCaie/Q==", "base64");
  const pkcs8 = Buffer.from("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDPfQdjlQgrUn887KM0SpgOtxY+2A9yRUsAeSrGyEiBoaMkMjXrdmRRUhsWeYyOaSZmovvgFrd2DYE0f8LG8qCosTWB+JYODaRmvomE8DNe8/6Noh9JjyivcxpNRSXKeJG2VohICpduZgabIeCkmQd4uIbuOulAPmugQUC55+sF0LyEzaK1FSca1q5bTre4zxshMphy1JDdiLVsZ06L4a56CL/U4TtBZIxO9EP81ELnSKD+wpG4J+0uSb5O+MAPAQLX//qbCDmKO0QRpVAlaRBLh7yvmg/8y6zw3Qv+IpbQQcy9OnMHSF2sFpZfL58Bm2PuNhY9LgNeN1llUf9eiKrHAgMBAAECggEBAMxu6CTZ5h6pPeyNS5BuHrwA8M4im7V/SJLCz77j/2yaEd/MCQxirhzhxQaz5CU8vTVLSNhWCZUrYS6U4xiaXmlXkNzqTQ6zqlQBUAXHlRXtWdW68xDLGM8lnbicdMu1V/xL7iLtLJ79r2ySSIBkttPfHDMFoGRIHErdgCSruQkUBdqzpqRndis6Q0zENuewB1QWDqABpvsjAafPcT13Doj3WM/IfsAFs9YpVLvRGfa4MKAB+RI911IruD1vICACYgDaRut8ui7TbCpDAm8GSEfVA63aUmEzCjpyHo9zZTCIf/JYhQfh/4oGlMamWfQCV2cWp9AJKICul7mJrW81vCECgYEA+Uw5In5b8OTd9L7GAs4Rsj8VOF4Ufs/Q1iVrxGNIoHze5HGvI639YUeTZLgU7j/K4Z1uzEiwJYcZXPDUcFoOFF8fayAVy5ZCLUgVjndiMyvaJLbWnp1z3vEbHQmHX/oXKz7OuzMQ0Ivgpsov6I68lY3PgBUvJl3CEZANJd8q1bMCgYEA1REOKP46Xf0SBlp8ezWIHSzpppg21kvoD/Nz5lbOxD91nuhSFYMdYU/s46ABIqtyfaWaRdbF4Ct/kSTlYSuTH67z6JCkesCeGSjPQBP1/kp1ZNVUAYKXHPejAXzSMTkZfHQYXpfI9UBIlwZLNiVerHdGqxAHpYnDOO0A0luX9J0CgYB/YsOPLKIuZcRE23ay2DmSq0lclDZE1kwQIO8AWvsxhp0efjjQMofWvYxDWwzW8SHqR1fmav4XLwF2zFjBUEMBhdm4E50Peqg2Gy9orPgwzaeaOxNP2YTr1qfUHppeIJzWLDHW1jExX0hb8dSpMMaMZPoyqKB/KkmQT9toDrEEoQKBgQC/dBDeQvsdg46TyPE8ITEKzlWxjesQiqqe0qrdWjl3XHKLdMR1chiPXatGKnt6tMYvIwRKJyAtO8joGlhHBUmxWZrv6jDx4GzvvJzmPkl3015DWfGfXcH9lIOTjZ6t/lnpW8SeExPPVJElq9EfeVrl7FPC2KeWVwDmAQkQ/J7BfQKBgFCEosZ1jiqeTsb194qn+bxIx6iJWqvf3bPmFRj5qSiVJ7b2T0cfiusWIT08EVtktPBDInH64bbyhqBp7w3tGs+XcAJK95rxEatBagTGb8LIIpe15pm2/Aw7dNaEQYTfCr47cjHMhQ4LIzoyuK0nntzYrhhq/9205OBAFDaBqiGY", "base64");

  const key = await crypto.subtle.importKey("pkcs8", pkcs8, { name: "RSA-OAEP", hash: "SHA-512" }, true, ["decrypt"]);

  const message = await crypto.subtle.decrypt("RSA-OAEP", key, encryptedMessage);
  console.log("Message (HEX):", Buffer.from(message).toString("hex"));
}

main().catch(err => console.error(err));

输出

Message (HEX): 60b1575b7aba7ca0b0880fed7fcf1f4a

我只对传入参数进行了一项更改。我将 RSA 私钥重新编码为 PKCS8 格式

enter image description here

而不是

enter image description here

关于javascript - 使用加密模块进行 RSA 解密给出 "rsa OAEP sha512",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56058153/

相关文章:

javascript - Google Sheet 脚本编辑器 - 报告格式的多个 Sumif

javascript - Sequelize bulkCreate 不包括新添加的列

node.js - AWS Lambda nodejs 函数中的事件对象为空

javascript - 如果在 JavaScript 中它是空对象,如何将最深对象更改为字符串值

javascript - 使用 Socket.io 错误的 HTTP 通知

javascript - Javascript注入(inject)和XSS的区别

javascript - 为什么点击div时会触发focusout事件

python - 如何在大型Python应用程序中使用NodeJS作为前端?

node.js - 收到错误 "Could not find preset ' react 服务器'相对于目录...”

javascript - crypto.rng 从哪里来