使用私有解密(publicEncrypt、privateDecrypt)解密时出现错误解密错误

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

我是NodeJs v10.14.2的crypto来创建非对称密钥对。 公钥和私钥已成功生成。之后,我想使用公钥加密一个字符串,并想使用私钥解密,但在这种情况下,加密可以与 publicEncrypt 一起正常工作,但之后使用 privateDecrypt 会给出错误解密的错误

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt.

这是我的代码

const { writeFileSync } = require('fs')
const { generateKeyPairSync, publicEncrypt, publicDecrypt, privateEncrypt, privateDecrypt } = require('crypto')
const passphrase = "1234567890"
function generateKeys() {
    const {
        privateKey,
        publicKey
    } = generateKeyPairSync('rsa', {
        modulusLength: 1024,
        publicKeyEncoding: {
            type: 'pkcs1',
            format: 'pem',
        },
        privateKeyEncoding: {
            type: 'pkcs1',
            format: 'pem',
            cipher: 'aes-256-cbc',
            passphrase,
        },
    })

    encryptD(publicKey, privateKey) 
}
let string = "Hello this string will be encrypted"
function encryptD(publicKey, privateKey)
{
    let buf = Buffer.from(string)
    console.log(buf)
    //<Buffer 48 65 6c 6c 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20 77 69 6c 6c 20 62 65 20 65 6e 63 72 79 70 74 65 64>
    let encData = publicEncrypt(publicKey, buf)
    console.log("Encrypted Buffer", encData)
    //Encrypted Buffer <Buffer 1b bc fb ee ba c3 90 ca 87 37 3c 6a 0b 38 4b bd 92 8a 7c 1e 7c dd 06 26 58 5f 0b 35 f6 81 8f 55 58 03 db e2 a5 4d 2b d2 41 32 31 5e 6b 2a 62 e7 d6 b6 ... >
    let dncData = privateDecrypt(privateKey, encData)
    //Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    console.log("decrypted ", dncData)
}
generateKeys()

我不知道我哪里做错了 感谢您的帮助

node.js cryptojs encryption-asymmetric
1个回答
0
投票

依赖关系:

 const crypto = require('crypto');
    const fs = require('fs');
    const { RSA_PKCS1_PADDING } = require('constants');
    const { privateKeyDecrypt } = require('crypto');

加密:

// Encrypting the pased string
function encryptString(publicKeyFile, plaintext) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");
  
    // Encrypting data using publicEncrypt() method and a public key
    const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(plaintext));
  
    return encrypted.toString("base64");
  }
  
// Usagge
const publicKeyFile = '../public_key.pem';
const decryptedData = 'Hello World';

// Encriptar los datos
const encryptedData = encryptString(publicKeyFile, decryptedData);
console.log('Encrypted data:', encryptedData);

解密:

function decryptString(privateKeyFile, ciphertext) {
  const privateKey = fs.readFileSync(privateKeyFile, "utf8");

  // Convert the private key to a KeyObject
  const privateKeyObject = crypto.createPrivateKey({
    key: privateKey,
    format: "pem",
    type: "pkcs8",
  });

  // Decrypt the ciphertext using privateDecrypt() method
  const decrypted = crypto.privateDecrypt(
    {
      key: privateKeyObject,
    },
    Buffer.from(ciphertext, "base64")
  );

  return decrypted.toString("utf8");
}

// Ussage
const privateKeyFile = "../private_key.pem";
const encryptedData = readTextFile("encrypted_data.txt");

// Decrypting
const decryptedData = decryptString(privateKeyFile, encryptedData);
console.log("Decrypted data:", decryptedData);

我通常会选择这样的东西。也许你可以检查一下,希望能找到一些灵感或线索。

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