2015-10-23 9 views
5
umgehen

Ich schreibe einen RSA-Verschlüsselungsalgorithmus in C. Ich plane nicht, es überall in Produktion zu bringen, es ist hauptsächlich nur so, dass ich mein Verständnis von Verschlüsselung erweitern kann.Wie mit massiven Zahlen in C

Wie gehe ich mit den riesigen Zahlen um, die RSA generiert? Selbst wenn die Entschlüsselung mit einem relativ kleinen privaten Schlüsseln wie 103 durchgeführt wird, ich habe immer noch das Problem mit Dingen wie dies zu tun:

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

Was ist der beste Weg, um eine Nummer dieser Größe zu speichern? Gibt es eine Möglichkeit, dies mit Standardbibliotheken zu tun? .

+2

Sie können all große Zahl Arithmetik selbst implementieren, aber es ist einfacher, nur eine bestehende Multi-Präzision Bibliothek wie GMP zu verwenden. –

+0

@ ArtjomB. Ich dachte, ich könnte möglicherweise eine mit Arrays zum Speichern von Zahlen in Base 2^64 implementieren. Ich wusste nicht, ob das praktisch wäre. – mstagg

+0

Das würde funktionieren. Vorsichtig mit Überlauf obwohl. Sie müssen Multiplikation und dann Division (für Modulo) implementieren. Aber im Ernst, benutzen Sie einfach GMP. –

Antwort

4

Falsche Annäherung. 67^103 mod 143 muss nicht zuerst 67^103 berechnen.

Berechnen Sie die modulo in einer Schleife, 1 Bit des Exponenten zu einem Zeitpunkt.

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)); 
} 

Ausgabe

89 
+0

Der _trick_, um "mit den massiven Zahlen umzugehen, die RSA generiert", besteht nicht darin, Mathe auf die übliche Art und Weise zu tun - verwenden Sie Abkürzungen wie oben. – chux

+1

Oh Ach ja, schon mal diese Kraftübung gemacht, indem du jedes Bit der Kraft behandelst: Q nicht sorgfältig genug lesen, +1. –

+0

@ Weather Vane Ja - der ganze Sinn von [RSA] (https: //en.wikipedia.org/wiki/RSA_ (cryptosystem)) soll Rechentricks verwenden, wenn man den Schlüssel hat, um ein mathematisches Black-Box-Problem zu lösen, das sonst durch Brute-Force-Berechnungen nicht durchführbar ist. – chux