NodeJS 不是我的母语,所以我在使用给定的私钥解码 Base64 编码的字符串时遇到了麻烦。
使用 Java RSA 算法和
RSA/ECB/OAEPWithSHA-1AndMGF1Padding
转换对字符串进行加密。
我设法得到以下代码:
import forge from "node-forge";
function decryptWithPrivateKey(encryptedBase64String: string, privateKeyString: string) {
try {
// Remove spaces and newlines from the privateKeyString
privateKeyString = privateKeyString.replace(/\s/g, '');
console.log('encryptedBase64String: ' + encryptedBase64String);
console.log('privateKeyString: ' + privateKeyString);
const privateKey = forge.pki.privateKeyFromPem(privateKeyString);
const encryptedBuffer = Buffer.from(encryptedBase64String, 'base64');
const encryptedBytes = forge.util.createBuffer(encryptedBuffer.toString('binary'));
const decryptedBytes = privateKey.decrypt(encryptedBytes.bytes(), 'RSA-OAEP', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
return decryptedBytes.toString();
} catch (error: any) {
console.log(error.message);
//throw new Error('Error: ' + error.message);
}
}
const decryptedString = decryptWithPrivateKey(encryptedPassword, privateKey);
console.log(decryptedString);
但我得到的只是错误:
Invalid PEM formatted message.
我确信我的私钥是正确的并且我的字符串是正确生成的。我在 Java 中可以很好地使用它。
我的代码有什么问题?
我要解码的字符串是:
FfKZ2sKQO6sCndb4orGYVIPGBNNsh/eWHu8Ay4MOFfess3B7IBaxBIqq6CUbmgwCbl2D0I38h7OEIO4VI1aC0lH4wMESzxPF5N6724e1SAXPEi0f/F3SA8sMy+mApZtWoUUwmeMPmDap7JII0DxuOngWwiRzwBK7KXc1ww2JLv9aPisBeTWme6QxAMgBpHREQJ9ymxVxRdxa3OyiwsrtgUDORp+z8+cvSLBQwEnjc228YJ0P1n/ggX1O6U/ytzogtVjVniw+TbSHNnZhcjHzPHs6sjYTOZFx3yoYfbh08hiUk3l7jRDXeGYNEgiBUAWY/zhn97VEgcuEYS9TQIEePw==
我的私钥如下:
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDNZQq9bWwqyFKnheZOhGabLpPDWKbJeIz6YoJNDF8VlzjVnPIgr5ft5iEanvEl7qYBojq1GKzwa7vTxrLt6AHZXCB7ITfhGp4iMtVVtA+vJgBurSKkPBhVoRpewv1YbAsdEKMZ2wkopHEEuRVi5ngUEV6klccuqGiYZHapzbrw06Wpx7+dmMkB56RuWm18kKx9sMclEBk84LyGuVvkR8W86axy3MWTBPq1wHw8YDG77vBFKgOTdwfp+QsYDoZ+Eph0s9RB6Re1kyX97nXthaLJPi44knnA02VmwwDEGjX7cli2TllRwhs9SOdBheA8iNltU7erXGo9MkSLJwu3Xae5AgMBAAECggEBAKMV2KpCKQHrX52+tvifLm2HVTJlwMD2JFJnR3jwGsuk8C7E2IhVhHgUIzLlAysQS+W+L4k914tqr4/fFJHMhzNUcEH0RU9KeEdFP5k2SMHUlcFLXdc0FEphifO2Nb0wxL5GSIsuHR6VO1v5rd6CitO8Wv6qIqaMd8iQ9JutTAMNTjNG/FWCLkjkWBdtulUOrprlNAmJ4KTKG2ZXVMdjuYFq7++w5Bhouo038jZIDfCksan4CNUAccg03cW9OKl3Vkw6jPCBKWxk/fZChzReb3kot1YQEq8+DDlSTT8xEss9FuF6caX6PRFHgNaeHOq3Eza616dgS87uJbZ8uycbU8UCgYEA5ylrb3GVVALsqI3i+yLF+SaKCxTXwZfpbZes9sUiCaDI0GP3EsJAolrBcA3/io08FTUXpqxLEH7VojJa7oPKTSmo75T5amjp3Xx4NbweFVN4R4oxfR9tgJGnnGCOF2EaLVr3ofWMQK5ObU4VqMXbaKe0dX6vvKrYAHETPuBHlBcCgYEA43bYYICjNN51ez7rHe/RsqYbRbgj8eT504OgOQdkqWAcHEe5YQu1k6bAGXfC9bmVw8ZxITLoQmjJ2ph1lJbw/1UD6VvToXwdC0U/sf4+ICdrA7Al3BS74D2caQBBAy9AL5My7PtECCBBcNCPDMg9PDPLtbv6JAiyugfkdLdzdK8CgYAy1mQfTT6HDGGZrCKoEnyxj606RKoylEMs6/eJCc+ziF3Bnsp+oKPwUL9L8ngps2fsThHWgPu9M/etxR9EZ019bNUPY5b6tPoB0NbrEmUXUZUZPqYlm1zMsrvG42E8eQl1whTF1Ke0reDnnw2aYXEgcgl48ZSajIQWjMerw01anwKBgCsag0hOOB81pKeVNbK3llI3PeXJTi5xiJH3WG5WI1IhX1JQmSV1tZPkPnTVCAHOiD3QJfH3lqG2/8FHsMhWjhakgpg/CWyJe2t+VOKi3hzzu0i4oYQB/dQxeKlBHhC/bHdXeogD2VF840nAi8sNSuVUn16x32XirBOqmTUw6lULAoGBAK41Wu99ZlLRpqRuWTSqyuF2H46Vq3fa0spm4OsULMMZZgVYVev11sFtakQUp4AUw/QsgnEjtZdzg05dUZDDOBsYvyUVYUi1AMGDYI3Zw8UsmzqqH9dNjweO1zAGgVAvh1/HIgi8pwpIyaDOPx9NJnXhOO+pUU3C0z1kSBo9uiLM
正如 @Topaco 所指出的,我的密钥是 Base64 编码的 ASN.1/DER 编码的私有 RSA 密钥(采用 PKCS#8 格式),我不想更改它。
@President Jame K. Polk 建议使用
privateKeyFromAsn1()
所以我将代码更改为以下内容:
function decryptWithPrivateKey(encryptedBase64String: string, privateKeyBase64String: string) {
try {
// Remove spaces and newlines from the privateKeyBase64
privateKeyBase64String = privateKeyBase64String.replace(/\s/g, '');
console.log('encryptedBase64String: ' + encryptedBase64String);
console.log('privateKeyBase64String: ' + privateKeyBase64String);
// Decode Base64 encoded private key to binary
const privateKeyBinary = forge.util.decode64(privateKeyBase64String);
// Parse ASN.1/DER encoded private key
const privateKeyPem = forge.pki.privateKeyToPem(forge.pki.privateKeyFromAsn1(forge.asn1.fromDer(privateKeyBinary)));
// Convert PEM-formatted private key to Forge's private key object
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
const encryptedBuffer = Buffer.from(encryptedBase64String, 'base64');
const encryptedBytes = forge.util.createBuffer(encryptedBuffer.toString('binary'));
const decryptedBytes = privateKey.decrypt(encryptedBytes.bytes(), 'RSA-OAEP', {
md: forge.md.sha1.create(),
mgf1: {
md: forge.md.sha1.create()
}
});
return decryptedBytes.toString();
} catch (error: any) {
console.log(error.message);
//throw new Error('Error: ' + error.message);
}
}
这成功解决了我的问题!