ИСПРАВЛЕНО ДЕКОДИРОВАНИЕМ БАЗЫ64 Я ПОЛУЧИЛ
privateDec({key: this.privateKey, padding: utils.constants.RSA_PKCS1_OAEP_PADDING}, Buffer.from(body, 'base64'));
Примечание Buffer.from(body, 'base64')
. Я забыл декодировать полученную строку, которая была закодирована в base64.
Извините!
Я пытаюсь защитить сокетное соединение с помощью асимметричного шифрования. Шифрование работает нормально, но когда я пытаюсь расшифровать строку, отправленную клиентом, я получаю следующую ошибку:
Error: error:0406706C:rsa routines:rsa_ossl_public_decrypt:data greater than mod len
Дело в том, что строка не длиннаядостаточно, чтобы «переполнить» ограничение, налагаемое длиной используемого мной модуля (которая равна 4096).
Вот как я это реализую:
// client.js
const enc_text = publicEncrypt(
{
key: serverPublicKey, // I'm using the server's public key to encrypt the message
padding: constants.RSA_PKCS1_PADDING
}, Buffer.from('test string', 'utf-8')).toString('base64');
// the buffer is sent with an header (0x0001) because of the messaging system I've implemented
var message = Buffer.alloc(6 + enc_text.length);
message.writeInt16BE(0x0001, 0);
message.writeInt32BE(enc_text.length + 6, 2)
message.write(enc_text, 6);
client.write(message);
И здесь все работаетпросто хорошо. Ошибка возникает в этом фрагменте кода ниже:
// server.js
const header = data.readInt16BE(0), // 2B header
body_length = data.readInt32BE(2), // 4B is the number identifying the body length
body = data.toString('ascii', 6, body_length); // 2 + 4 = 6, the actual body starts from the 6th byte
var a = privateDecrypt(
{
key: this.privateKey, // and here I'm using the server's private key to decrypt the message
padding: constants.RSA_PKCS1_PADDING
},
Buffer.from(body));
Я уже пытался использовать constants.RSA_PKCS1_PADDING
для удаления заполнения, но я получил еще одну ошибку, говорящую прямо противоположное: данные слишком короткие, чтобы их можно было зашифровать.