Как выполнить базовое шифрование символов (TypeScript)?

Я хочу зашифровать строку с помощью открытых и закрытых ключей RSA. Однако, когда я пытаюсь расшифровать символы обратно в исходное ascii-значение, они возвращают что-то другое. Вот мои методы шифрования и дешифрования:

/**
 * Method to encrypt a string using associated public-key
 * @param plainText string to cipher
 * @returns string of encrypted plainText
 */
public encryptData(plainText: string): string {
    let cipher = "";
    for (let i = 0; i < plainText.length; i++) {
        console.log(plainText.charCodeAt(i));
        let temp: number = Math.pow(plainText.charCodeAt(i), this.e) % this.n;
        console.log(String.fromCharCode(temp).charCodeAt(i));
        cipher += String.fromCharCode(temp);
    }
    return cipher;
}

/**
 * Method to decrypt a string using associated private-key
 * @param cipherText string to decrypt
 * @returns string of encrypted plainText
 */
public decryptData(cipherText: string): string {
    let text = "";
    for (let i = 0; i < cipherText.length; i++) {
        console.log(cipherText.charCodeAt(i));
        let temp: number = Math.pow(cipherText.charCodeAt(i), this.d) % this.n;
        text += String.fromCharCode(temp);
    }
    return text;
}

n, e и d равны 15, 7 и 13 соответственно. Любой совет по этому поводу будет принят с благодарностью!

РЕДАКТИРОВАТЬ

Решение проблемы найдено, используйте следующий метод при создании переменной temp.

private modular_pow(base: number, expo: number, modulo: number) {
    base = base % modulo;
    var result = 1;
    var x = base;
    while(expo > 0){
        var leastSignificantBit = expo % 2;
        expo = Math.floor(expo / 2);
        if (leastSignificantBit == 1) {
            result = result * x;
            result = result % modulo;
        }
        x = x * x;
        x = x % modulo;
    }
    return result;
}

Так же, как вы сделали бы это в JavaScript. Вот и все, накатывать собственное шифрование — плохая идея. Используйте надежное и актуальное стороннее решение.

Aluan Haddad 17.05.2022 02:12
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
1
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Размер модуля N определяет максимальную полезную нагрузку для учебника RSA. Так как это значение 15, значение сообщения должно быть 14 или ниже.

Обычно символы находятся в диапазоне от 0 до 25, и это не значение символа, а индекс в алфавите. Таким образом, либо вы еще больше разбиваете символы, либо вам нужно использовать больший модуль (например, p = 7, q = 19 и все важные n = 133, которые могли бы обрабатывать любой символ ASCII (конечно, блуждающий за пределами печатного ASCII для некоторых значений).

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

Также обратите внимание, что вывод вашего учебника RSA должен быть помещен в (печатный) символ в вашей схеме. Для практики вы также можете использовать только числа, разделенные пробелом, игнорируя рост зашифрованного текста.

Что вы имеете в виду, когда говорите «необходимо выполнять модульное возведение в степень как единую операцию, вместо того, чтобы сначала выполнять возведение в степень, а затем вычислять модуль»? Должен ли я сделать message^e как одну переменную exponential, а затем выполнить операцию модуля exponential % n?

user17976264 17.05.2022 23:08

@user17976264 user17976264 Нет, вам следует выполнить специализированный алгоритм вместо обычного двухэтапного, см. Статья в Википедии, начиная с простого алгоритма с эффективным использованием памяти и включая часть «См. Также» на этой странице. В качестве альтернативы убедитесь, что ваши целые числа не переполняются, или используйте библиотеку «bignum» (которая обычно имеет специализированный метод «modPow» или аналогичный метод). Если вы делаете, например. 4123 x 56782, тогда какова младшая значащая цифра (т.е. значение по модулю 10)? Вы выполняете все умножения?

Maarten Bodewes 18.05.2022 00:03

Однако, перефразировав мой ответ, я согласен, что это было не слишком ясно.

Maarten Bodewes 18.05.2022 00:11

Получил работу! Благодарю вас!

user17976264 18.05.2022 01:15

Другие вопросы по теме