Вопрос или проблема
Я потратил часы, ища ответы в интернете, но все еще застрял с той же проблемой.
Я работаю с API, который возвращает зашифрованные данные карточки пользователя с публичным ключом, который я передаю на сервер [RSA 2048]
Чтобы получить и отобразить конфиденциальную информацию на карточке, мне нужно создать публичный и приватный ключи RSA на стороне клиента, которые я передам в modulus
и Exponent
на сервер.
Поставщик зашифрует конфиденциальную информацию с помощью указанной информации о публичном ключе, переданной на сервер, и вернет base64EncryptedString
.
Ниже приведены параметры, ожидаемые сервером.
Тип | Значение |
---|---|
Алгоритм шифрования | RSA |
Размер ключа | 2048 |
Ниже приведен пример запроса API.
{
"exponent": "010001",
"identifier": "RSAKeyIdentifier",
"appName": "Мое имя приложения",
"keyId": 0,
"modulus": "d3e7c3608e0083b174ca9ec17d2bf9af873cf98a8272966c7c6fdcbb42d9b58d19c4531bbdd6897f8b96c419fdc33b1f58163a62ca2feaddeb6bef64574ed07c4f236773c99bf9a128a3f38da6109cfc917f93b83d1b2aa5c71b11dbb33e24a42aef7cdff45af9dd08c65913cacdc99942d6eb56b07068d0c8530850be0992b8a109a7504b908931169c183926c5c8864ca6a86549e1cce92f95b7963de1e167bc9f4da15c18d4693c30bed129caeb4bd21d1638f86cbe88004f4f7437a22457add478d056bef256e49071d9406ba0817731c678b904ce9b501f7abb306793f95e75df533004139f5c15e19b350de470422e94557c3aa26c9aac075851a74b6f",
}
Ниже приведен зашифрованный ответ, который я должен расшифровать, чтобы отобразить данные карточки пользователя.
"xDetails": {
"CardNumber": "{base64EncryptedString}",
"ExpiryDate": "{base64EncryptedString}",
"CVV2": "{base64EncryptedString}"
}
Я заметил из запроса данных на сервер, что modulus
кажется в ШЕСТНАДЦАТИЧНОМ
формате.
Пожалуйста, мне нужен эксперт, чтобы указать мне правильное направление по генерации пары приватного и публичного ключей, modulus в HEX и расшифровке ответа от сервера с помощью приватного ключа на стороне клиента.
В настоящее время я пытался сгенерировать пару публичного и приватного ключей через интернет, но я не смог расшифровать ответ от API сервера.
Я продолжаю получать следующую ошибку
InvalidCharacterError: Строка содержит недопустимый символ
Ответ или решение
Решение проблемы расшифровки текста RSA с использованием закрытого ключа, возвращенного API
Ваша задача заключается в том, чтобы получить и расшифровать зашифрованные данные, полученные от API, используя пару ключей RSA (открытый и закрытый). Ниже приводится подробное руководство по созданию пары ключей RSA, передаче их на сервер, а также расшифровке полученных зашифрованных данных с помощью закрытого ключа.
Шаг 1: Генерация пары ключей RSA
Чтобы сгенерировать пару ключей RSA на стороне клиента, вы можете использовать библиотеку, такую как node-rsa
, jsencrypt
в JavaScript или любую другую библиотеку на вашем предпочтительном языке. Ниже представлен пример на JavaScript с использованием библиотеки node-rsa
.
const NodeRSA = require('node-rsa');
// Генерация ключевой пары RSA
const key = new NodeRSA({ b: 2048 }); // 2048 бит
const publicKey = key.exportKey('public'); // Открытый ключ
const privateKey = key.exportKey('private'); // Закрытый ключ
console.log('Public Key:', publicKey);
console.log('Private Key:', privateKey);
// Извлечение модуля и экспоненты
const modulus = key.exportKey('components-public').n.toString(16); // Модуль в шестнадцатеричном формате
const exponent = key.exportKey('components-public').e.toString(16); // Экспонента
Шаг 2: Передача публичного ключа на сервер
Теперь, когда у вас есть открытый ключ, модуль и экспонента, вам нужно отправить их на сервер в нужном формате. Убедитесь, что вы правильно форматируете JSON-запрос.
{
"exponent": "010001",
"identifier": "RSAKeyIdentifier",
"appName": "My APP Name",
"keyId": 0,
"modulus": "d3e7c3608e0083b174ca9ec17d2bf9af873cf98a8272966c7c6fdcbb42d9b58d19c4531bbdd6897f8b96c419fdc33b1f58163a62ca2feaddeb6bef64574ed07c4f236773c99bf9a128a3f38da6109cfc917f93b83d1b2aa5c71b11dbb33e24a42aef7cdff45af9dd08c65913cacdc99942d6eb56b07068d0c8530850be0992b8a109a7504b908931169c183926c5c8864ca6a86549e1cce92f95b7963de1e167bc9f4da15c18d4693c30bed129caeb4bd21d1638f86cbe88004f4f7437a22457add478d056bef256e49071d9406ba0817731c678b904ce9b501f7abb306793f95e75df533004139f5c15e19b350de470422e94557c3aa26c9aac075851a74b6f"
}
Шаг 3: Дешифровка зашифрованного ответа
После того как вы получите зашифрованную строку в формате Base64 от API, вам потребуется преобразовать её и расшифровать с помощью закрытого ключа.
const encryptedCardNumber = "{base64EncryptedString}";
const encryptedExpiryDate = "{base64EncryptedString}";
const encryptedCVV2 = "{base64EncryptedString}";
// Декодирование Base64 и расшифровка
const decryptedCardNumber = key.decrypt(Buffer.from(encryptedCardNumber, 'base64'), 'utf8');
const decryptedExpiryDate = key.decrypt(Buffer.from(encryptedExpiryDate, 'base64'), 'utf8');
const decryptedCVV2 = key.decrypt(Buffer.from(encryptedCVV2, 'base64'), 'utf8');
console.log('Card Number:', decryptedCardNumber);
console.log('Expiry Date:', decryptedExpiryDate);
console.log('CVV2:', decryptedCVV2);
Решение проблемы InvalidCharacterError
Ошибка InvalidCharacterError: String contains an invalid character
может возникнуть по нескольким причинам:
-
Неверное декодирование: Убедитесь, что вы декодируете строку Base64, как показано в примере. Возможно, вы пытаетесь декодировать не ту строку или строка неправильно сформирована.
-
Неверный формат строки: Убедитесь, что вы передаете правильно отформатированные строки в метод
Buffer.from()
.
Заключение
Следуя приведенным шагам, вы сможете успешно создать пару ключей RSA, отправить открытый ключ на сервер и расшифровать полученные зашифрованные данные с использованием закрытого ключа. Рекомендуется также просмотреть документацию используемых библиотек для получения дополнительной информации и методов по обработке ошибок.