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