Crittografia RSA

Portale di allenamento
Soluzione corretta al 100%:
                
#include <stdlib.h> 

long long mod_pow(long long base, long long esponente, long long modulo) {
    long long risultato = 1;
    base = base % modulo;
    while (esponente > 0) {
        if (esponente % 2 == 1) {
            risultato = (risultato * base) % modulo;
        }
        base = (base * base) % modulo;
        esponente /= 2;
    }
    return risultato;
}

void decifra(int N, int d, int L, int messaggio[], char plaintext[]) {
    for (int i = 0; i < L; i++) {
        // Decifra c^d mod N utilizzando l'esponenziazione modulare rapida
        long long carattere_decifrato = mod_pow(messaggio[i], d, N);

        // Converte il carattere decifrato in char e lo aggiunge a plaintext
        plaintext[i] = (char)carattere_decifrato;
    }

    // Aggiunge il carattere di fine stringa '\0' alla fine di plaintext
    plaintext[L] = '\0';
}

        
                
              
Spiegazione del programma:

In questa implementazione, per ottimizzare il calcolo di c^d mod N, puoi utilizzare l'esponenziazione modulare rapida, che ridurrà notevolmente il tempo di esecuzione, specialmente per grandi valori di d. L'esponenziazione modulare rapida sfrutta le proprietà dell'aritmetica modulare per calcolare l'esponente in modo più efficiente.
Utilizzando la funzione mod_pow sopra, riduci notevolmente il tempo di esecuzione, soprattutto per grandi esponenti d. Questa funzione calcola base^esponente mod modulo in modo efficiente, evitando calcoli ridondanti e migliorando le prestazioni del tuo algoritmo.