crypto.privateDecrypt работает на Windows, но не в Ubuntu - PullRequest
2 голосов
/ 12 июня 2019

У меня есть код, который читает privateKey (в формате PEM) и зашифрованный текст, который я хочу расшифровать. Когда я запускаю код в Windows, все работает, и он расшифровывает текст с помощью

let buffer = Buffer.from(encryptedData,'base64');
crypto.privateDecrypt(privatekey, buffer);

Однако, когда я запускаю тот же код в Ubuntu, я получаю следующую ошибку:

"'Passphrase required for encrypted key.TypeError: Passphrase ' +
  'required for encrypted key    at Object.privateDecrypt ' +
  '(internal/crypto/cipher.js:53:12)    at e1c2 ' +...

"

Я использовал console.log (encryptedData, privatekey, buffer) в обоих окнах и системе Ubuntu, и они идентичны. Также в privatekey я не использовал пароль. У кого-нибудь есть идея, почему в Ubuntu я получаю такую ​​ошибку, а в Windows она работает нормально? Может ли это быть связано с форматом privatekey, который на самом деле является форматом .pam, и из-за пробелов linux не может его обработать?

EDIT:

Мой закрытый ключ имеет этот формат

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIJrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIdq79fP1MZogCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDMX/L46fPKcSQkgXrwpLtqBIIJ
..

Я в основном сгенерировал это через

crypto.generateKeyPairSync('rsa', {
    modulusLength: 4096,
    publicKeyEncoding: {
      type: 'spki',
      format: 'pem'
    },
    privateKeyEncoding: {
      type: 'pkcs8',
      format: 'pem',
      cipher: 'aes-256-cbc',
      passphrase: ''
    }
  });

Когда я проверял больше в интернете, я видел пример на введите описание ссылки здесь что заголовок закрытого ключа «----- НАЧАТЬ RSA PRIVATE KEY -----», и на самом деле я мог запустить этот код в Ubuntu, и никакой ошибки не происходит. Таким образом, похоже, что проблема связана с заголовком, который изменяется из-за типа 'pkcs8' внутри privateKeyEncoding. Также я заметил, что моя версия узла на Windows 10.15.3 и на Ubuntu 12.4 Может ли это быть также связано с изменением версии узла?

1 Ответ

0 голосов
/ 12 июня 2019

Я пробовал что-то очень похожее как в Windows 10, так и в Ubuntu 18.04. В моем случае я генерирую файлы открытого / закрытого ключа, шифрую, а затем дешифрую, используя их. Работает хорошо на обеих платформах. Стоит попробовать, чтобы увидеть, работает ли это для вас. Версии узла: Windows: 10.15 Ubuntu 10.16.

const crypto = require('crypto');
const fs = require("fs");

function generateKeyFiles() {

    const keyPair = crypto.generateKeyPairSync('rsa', {
        modulusLength: 4096,
        publicKeyEncoding: {
            type: 'spki',
            format: 'pem'
        },
        privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem',
        cipher: 'aes-256-cbc',
        passphrase: ''
        }
    });

    fs.writeFileSync("public_key", keyPair.publicKey);
    fs.writeFileSync("private_key", keyPair.privateKey);
}

// Encrypt a string given a public key file. Encode the result in base64.
function encryptString (plaintext, publicKeyFile) {
    const publicKey = fs.readFileSync(publicKeyFile, "utf8");
    const encrypted = crypto.publicEncrypt(publicKey, Buffer.from(plaintext));
    return encrypted.toString("base64");
}

// Encrypt a string given a cipherText (in base64) and a private key file.
function decryptString (ciphertext, privateKeyFile) {
    const privateKey = fs.readFileSync(privateKeyFile, "utf8");
    const decrypted = crypto.privateDecrypt(privateKey, Buffer.from(ciphertext, "base64"));
    return decrypted.toString("utf8");
}

generateKeyFiles();

const plainText = "I have spread my dreams under your feet. Tread softly because you tread on my dreams.";

const cipherText = encryptString(plainText, "./public_key");

console.log();
console.log("Plaintext:", plainText);
console.log();
console.log("Ciphertext: ", cipherText);
console.log();
console.log("Decrypted Text: ", decryptString(cipherText, "private_key"));
console.log();

Вы также можете попробовать скопировать файлы ключей из Windows в Ubuntu (пропуская шаг создания файлов ключей). Это работает и для меня.

...