RSAES-PKCS1- V1_5 Публичное шифрование с использованием криптографии NodeJs

Я сталкиваюсь с небольшим количеством стены, пытающейся отправить зашифрованные данные на удаленный сервер, используя криптомодуль NodeJs.

Согласно документации API, полезная нагрузка должна быть зашифрована с использованием алгоритма AES-256 со случайно сгенерированными ключами и ключами.

Случайно сгенерированные KEY и IV [выше] затем шифруются с помощью общего закрытого ключа с использованием стандарта RSAES-PKCS1-V1_5.

Наконец, зашифрованная полезная нагрузка подписывается закрытым ключом, используя схему подписи RSASSA-PKCS1-V1_5, а затем хэшируется SHA1.

Как только это будет сделано, я создаю HTTP-запрос и передаю зашифрованный KEY, IV, зашифрованные данные и подпись на сервер удаления.

Я не эксперт по криптографии, поэтому я убежден, что где-то что-то делаю не так.

Сервер может проверить подпись, что дает мне уверенность в том, что нет проблем с файлом общего закрытого ключа.

Однако серверу не удается расшифровать зашифрованные KEY и IV, которые необходимы для расшифровки полезной нагрузки.

Я использую код ниже для тестирования:

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

//Generate random KEY and IV
const randomKey = crypto.randomBytes(32);
const randomIV = crypto.randomBytes(16);

//Load private key from disk
const privateKey = fs.readFileSync(__dirname + '/private.key');

//Get data payload that should be encrypted with AES-256
const payload = 'Payload to be sent';

//Encrypt payload with AES-256
const cipher = crypto.createCipheriv('aes-256-cbc', randomKey, randomIV);
const encryptedPayload = Buffer.concat([cipher.update(payload), cipher.final()]);

//Sign the encrypted payload using the RSASSA-PKCS1-V1_5 algorithm
const signer = crypto.createSign('RSA-SHA1');
signer.update(encryptedPayload);
signer.end();
const signature = signer.sign(privateKey); //Sign with the private key

//Encrypt both KEY and IV
const encryptOptions = {
  key: privateKey,
  padding: constants.RSA_PKCS1_PADDING
}
const encryptedKey = crypto.publicEncrypt(encryptOptions, randomKey);
const encryptedIV = crypto.publicEncrypt(encryptOptions, randomIV);

//A function that encodes Buffer type data to base64
const encode = buffer => buffer.toString('base64');

const request = {
  encryptedKey: encode(encryptedKey),
  encryptedIV: encode(encryptedIV),
  encryptedPayload: encode(encryptedPayload),
  signature: encode(signature)
};

const endPoint = require('./end-point');
endPoint.call(request);
//-> Server successfully verifies signature but fails to decrypt encrypted KEY and IV

Может ли кто-нибудь указать мне, где я делаю это неправильно?

0 ответов

Другие вопросы по тегам