It looks like JSEncrypt adds some random padding to the RSA-encrypted string, and thus I cannot decrypt it with OpenSSL.
My JS code looks like this:
const rsaEncrypt = new window.JSEncrypt();
rsaEncrypt.setKey(
`-----BEGIN PUBLIC KEY-----
MIICITANBgkqhkiG9w0BAQEFAAOCAg4AMIICCQKCAgBNuSrpc+p9fd9I3qSa6+nC
HeNHfagAlCfJisM3eglbNN1yvY8U2DqtrYdPhukxSefo4iFMj65ngt+ZXLaLp6po
4VsGguQtqmQH9HC3I5FQk5YQTdtaLr8cQM8rHta0OEmJgGWfG2YndaFnxshuFgtW
AD9cdXPCh/RmGlhDdmR6xpBeMbvco6YOqyNGfxBRJqiZeINcVWmoEzHmqTlt/L7d
AcBHQA4erxsrfwie9POwgJptYYpwn1mamQ/a2/oDRnttaRayASlN2GRUkUeeI+hZ
zNe4eCrizXyEd7uL0JQ/h7T5qLj/5WNn/cCyi2X9VLllxLdRGauZ77NiB8KKVocb
i6BJM2gX/NszrBDsR/nyP1q0tLNalNE0IXiw0hsv6WamN2YvDfQtKm7Y4giAqhHY
Er7kwxR//OuNuf6Mb5YZVk8c1oZwIT0Vs9q6rlpcPLjpsWN769C+Pu4TP4Pmxh6n
zihPxWSnPLc4VegkpTzN+qix4cFgn6cYBIlvLg11NS0Vb+xKxtQroL67QWq0+LB0
5nS9ao4jxWFM80puWT813ThJ3vt/kIw5a1R9gNEuXW/zOwKQxfddvEO84YprVRRX
0TI2eZcjjBI0P6qJHkn1/B7rjZ7P0afDwCOS4K1vB0RHuP6tPwUI6nC+4R/+emfB
BHapRHdVpO8uotDNoaDhIQIDAQAB
-----END PUBLIC KEY-----`);
const rsaDecrypt = new window.JSEncrypt();
rsaDecrypt.setKey(
`-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----`
);
const encryptedKey = rsaEncrypt.encrypt(key);
console.log(rsaDecrypt.decrypt(encryptedKey));
And the command I use to decrypt is this: (this is a command I use currently, but I've tried a million of different commands and none worked!)
openssl rsautl -in "$ENCRYPTED_FILE" -out "decrypted.txt" -inkey "private-key.pem"
I'm also open to using a different library that is compatible to be used with OpenSSL.