RSA расшифровка текста с использованием закрытого ключа, возвращаемого API

Вопрос или проблема

Я потратил часы, ища ответы в интернете, но все еще застрял с той же проблемой.

Я работаю с 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 может возникнуть по нескольким причинам:

  1. Неверное декодирование: Убедитесь, что вы декодируете строку Base64, как показано в примере. Возможно, вы пытаетесь декодировать не ту строку или строка неправильно сформирована.

  2. Неверный формат строки: Убедитесь, что вы передаете правильно отформатированные строки в метод Buffer.from().

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...