Как мне расшифровать файл, используя node-rsa с открытым и закрытым ключами? - PullRequest
0 голосов
/ 09 мая 2019

Я следовал этому уроку на medium . Однако учебник не объясняет, как расшифровать зашифрованный файл. Это также не объясняет, как используются открытый / закрытый ключи.

Простое выполнение расшифровки не работает с ошибкой ниже.

enter image description here

Соответствующая документация находится на npmjs.com .

Актуальный код

// node modules
const fs = require('fs');

// npm modules
const parseArgs = require('minimist');
const NodeRSA = require('node-rsa');

// get command line arguments
const argv = parseArgs(process.argv.slice(2));
// console.dir(argv);

// read a file
const file = fs.readFileSync('' + argv.file, 'utf8');

// generate keys
const key = new NodeRSA().generateKeyPair();
const publicKey = key.exportKey('pkcs8-public-pem');
const privateKey = key.exportKey('pkcs1-pem');

// write public key
fs.openSync('keys/public.pem', 'w');
fs.writeFileSync('keys/public.pem', publicKey, 'utf8');

// write private key
fs.openSync('keys/private.pem', 'w');
fs.writeFileSync('keys/private.pem', privateKey, 'utf8');

// write encrypted file
const encrypted = key.encrypt(file, 'base64');
fs.openSync('encrypted.txt', 'w');
fs.writeFileSync('encrypted.txt', encrypted, 'utf8');

// read encrypted file
const fileEncrypted = fs.readFileSync('encrypted.txt', 'utf8');
const decrypted = key.decrypt(fileEncrypted, 'base64'); // error here
// has to do with key generation?

default.txt

тест

encrypted.txt

qLs0dUez + LzhlNBGnvEzLRdYF0HUHoRignMxT2MZO7Qs8tMvkmWbiA1oxJbT7ZC5bPS + dHvFgbiWbdje / 3 / Y17JT8JxflryJU6394UPfsTDLmtZZroemTtTzJxVnGZlw0IyQtfn79eysQaEoKMQ9hKjDySxO1gLwJJZ1DoxW7CNu0BqfcGUMcREQ + ozrhKpMRK0piWUWqHYwX0EIxQT8 / rh5ER + tCdh4lR7N5 + FPA4VOde3z / 36DvQ9KOMChS7m91aH0QXUqhMaHtjslvcoj4i1Rwzd0qn1imHPc8LncZz6hv2deRqU65rS + M6UeC9LWJjblVf2er25x8B1yszaV + А * == +1032 *

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы неправильно расшифровываете данные, аргумент encoding для NodeRSA.prototype.decrypt(buffer, encoding) - это требуемая кодировка результата, а не входная кодировка.

Хотя говорят, что метод расшифровки принимает буфер через JSDoc:

/**
 * Decrypting data method with private key
 *
 * @param buffer {Buffer} - buffer for decrypting
 * @param encoding - encoding for result string, can also take 'json' or 'buffer' for the automatic conversion of this type
 * @returns {Buffer|object|string}
 */

Вы можете проследить код, чтобы увидеть, что если buffer является строкой, предполагается, что она находится вbase64 кодировка:

buffer = _.isString(buffer) ? Buffer.from(buffer, 'base64') : buffer;

Мы можем упростить вашу проблему, проигнорировав взаимодействия с файловой системой, чтобы увидеть, как работает круговая передача:

const key = new NodeRSA().generateKeyPair();

// Encrypt the utf8 encoded input string and output a base64 encoded string
const encrypted = key.encrypt('test', 'base64');
console.log(encrypted);

// Decrypt the base64 encoded input string and output a utf8 encoded string
const decrypted = key.decrypt(encrypted, 'utf8');
console.log(decrypted);

В качестве альтернативы вы можете явно преобразовать входные данныеи вывод в и из буферов соответственно, это может помочь вам понять, что происходит под капотом:

const key = new NodeRSA().generateKeyPair();

const input = Buffer.from('test', 'utf8');

const encrypted = key.encrypt(input);
console.log(encrypted.toString('base64'));

const decrypted = key.decrypt(encrypted);
console.log(decrypted.toString('utf8'));
0 голосов
/ 09 мая 2019

Вы пытаетесь расшифровать текстовый файл .. Попробуйте расшифровать зашифрованный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...