在nodeJS中使用RSA私钥解密base64字符串

问题描述 投票:0回答:1

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

node.js encryption rsa
1个回答
0
投票

正如 @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);
  }
}

这成功解决了我的问题!

© www.soinside.com 2019 - 2024. All rights reserved.