Я пытаюсь зашифровать строку из ключа 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 за разъяснение моего замешательства.