2015-10-23 10 views
5

Sto scrivendo un algoritmo di crittografia RSA in C. Non sto pianificando di metterlo in produzione da nessuna parte, è principalmente solo così posso ampliare la mia comprensione della crittografia.Come gestire massicci numeri in C

Come si gestiscono i numeri massicci generati da RSA? Anche durante l'esecuzione di decrittazione con un relativamente piccolo chiave privata come 103, ho ancora il problema di affrontare le cose in questo modo:

67^103 mod 143 = (1,21816096336830017301951805581 x 10^188) mod 143

Qual è il modo migliore per memorizzare un numero di tale dimensione? C'è un modo per farlo usando le librerie standard? .

+2

è possibile implementare tutti i grandi numero di aritmetica da soli, ma è più facile utilizzare solo una libreria multi-precisione esistente come GMP. –

+0

@ArtjomB. Stavo pensando che potrei implementarne uno usando gli array per memorizzare numeri nella base 2^64. Non sapevo se sarebbe stato pratico. – mstagg

+0

Ciò funzionerebbe. Attento con overflow però. Devi implementare la moltiplicazione e quindi la divisione (per modulo). Ma seriamente, usa semplicemente GMP. –

risposta

4

Approccio errato. 67^103 mod 143 non ha bisogno di calcolare prima 67^103.

Calcolare il modulo in un ciclo, 1 bit di esponente alla volta.

uint32_t powmod(uint32_t base, uint32_t expo, uint32_t mod) { 

    // % mod need only for the cases expo==0, mod<=1 
    uint32_t y = 1u % mod; 

    while (expo) { 
    if (expo & 1u) { 
     y = ((uint64_t) base * y) % mod; 
    } 
    expo >>= 1u; 
    base = ((uint64_t) base * base) % mod; 
    } 

    return y; 
} 

int main(void) { 
    printf("%lu",(unsigned long) powmod(67, 103, 143)); 
} 

uscita

89 
+0

Il _trick_ per "gestire i massicci numeri che RSA genera" è non fare la matematica nel modo usuale - usa scorciatoie come sopra. – chux

+1

Oh Oh sì, anche fatto questo esercizio di potere prima, trattando ogni singolo po 'del potere: non leggere Q con sufficiente attenzione, +1. –

+0

@Weather Vane Sì - l'intero punto di [RSA] (https: //en.wikipedia.org/wiki/RSA_ (cryptosystem)) utilizza trucchi computazionali, se uno ha la chiave, per risolvere un problema di black box matematico che altrimenti non è possibile calcolare con la forza bruta. – chux