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

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

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

Затем случайно сгенерированные 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

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

...