Модульное возведение в степень для RSA C++

Я пытаюсь реализовать 64-битное шифрование RSA в качестве случайного эксперимента.

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

result = (result * msg) % mod; //Repeat exponent number of times

К сожалению, это занимает смехотворно много времени.

Как быстрее выполнить эту операцию?

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

Я удалил этот вопрос, потому что на него не было ответов, и теперь я понимаю, что это был неразумный шаг. В любом случае, мне удалось найти решение, и вот быстрая реализация модульного возведения в степень с C++:

include <cstdint>

uint64_t modular_mul(uint64_t a, uint64_t b, uint64_t mod) {
    uint64_t result = 0;
    for (uint64_t current_term = a; b; b >>= 1) {
        if (b & 1) {
            result = (result + current_term) % mod;
        }
        current_term = 2 * current_term % mod;
    }
    return result;
}

uint64_t modular_pow(uint64_t base, uint64_t exp, uint64_t mod) {
    uint64_t result = 1;
    for (uint64_t current_factor = base; exp; exp >>= 1) {
        if (exp & 1) {
            result = modular_mul(result, current_factor, mod);
        }
        current_factor = modular_mul(current_factor, current_factor, mod);
    }
    return result;
}

Я получил это решение от пользователя, который ответил на мой вопрос здесь - это просто то же самое вопрос, но переспросил, лол.


person Maurice Kasomwung    schedule 19.08.2020    source источник
comment
Существует способ сделать это за O(log(exponent)) времени вместо O(exponent).   -  person cigien    schedule 19.08.2020