简体   繁体   中英

RSA Decryption with crypto module gives “rsa OAEP sha512”

I can't decrypt a string encrypted with RSA OAEP sha512 with crypto module. It gives me oaep decoding error.

I'm using NodeJS and crypto module, I already tryed encrypting and decrypting a sample text with those keys but I cant't with the provided one. I receive toDecrypt string from a mobile client that previously encrypted it with 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);

On line const result = crypto.privateDecrypt(privateKey, buffer); I get: Error: error:04099079:rsa routines:RSA_padding_check_PKCS1_OAEP_mgf1:oaep decoding error

But it should decrypt the string.

NodeJS has a problem with RSA-OAEP encryption https://github.com/nodejs/help/issues/1726

You can use @peculiar/webcrypto npm module which implements WebCrypto interface and supports RSA-OAEP mechanism. It's based on NodeJS Crypto API.

RSA-OAEP-SHA512 decrypt example

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));

Output

Message (HEX): 60b1575b7aba7ca0b0880fed7fcf1f4a

There is only one change I made with incoming params. I reencoded RSA private key to PKCS8 format

在此处输入图片说明

instead of

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM