Node.js crypto publicEncrypt возвращает слишком длинное значение - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь зашифровать строку из ключа RSA Publi c, сгенерированного устройством iOS (в быстром). Я использую функцию crypto.publicEncrypt, но возвращаемая строка base64 слишком длинна для ключа.

В моем случае это 3072-битный ключ RSA, поэтому ожидаемая длина зашифрованного значения составляет 384 байта, но crypto .publicEncrypt () возвращает 512.

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

Если кто-то может сохранить мой уик-энд!?

Мой код:

// Dependencies
const crypto = require('crypto')

// The secret data
const message = Buffer.from("Secret message")

// Secret data encryption
const publicKey // Buffer from Binary Data of the public key, in PEM format
const pem = publicKey.toString('utf8')
const opts = {
    key: pem, // Public key
    oaepHash: 'RSA-SHA384', // Algorithm used by the client
    padding: crypto.constants.RSA_PKCS1_OAEP_PADDING // Every other paddings throw an exception
}
var bufferEncryption = crypto.publicEncrypt(opts, message)
const encryptedMessage = bufferEncryption.toString('base64')

// Sending encryptedMessage to the client...

// My issue
console.log(encryptedMessage.length) // 512 (expected: 384)

решено: Нет проблем с кодом. Функция шифрования имеет ожидаемое поведение. Моя ошибка возникла из-за кодировки ответа для клиента. Я перепутал ожидаемые байты и символы. Радость работать с разными языками одновременно. Спасибо @Maarten Bodewes за разъяснение моего замешательства.

1 Ответ

1 голос
/ 19 апреля 2020

Я не уверен, почему вы ожидаете, что ключ будет 384 символов. Base 64 использует 4 символа для кодирования 3 байтов (или 6 бит на символ, в конце концов 2 ^ 6 = 64). Если мы примем одинаковое количество байтов - для US-ASCII-совместимых схем, таких как Windows -1252 или действительно UTF-8 - тогда (384/3) * 4 = 512. Размер байта, о котором вы говорите, равен размеру без какой-либо кодировки для текста .

Здесь есть другой ответ, который указывает, что вы можете использовать binary в качестве кодировки . Если я не ошибаюсь, что преобразую в аналог байтового массива.

...