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
Может ли кто-нибудь указать мне, где я делаю это неправильно?