c't 17/2019
S. 184
Know-how
RSA mit Android
Aufmacherbild
Bild: Albert Hulm

Hüpfburg für Krypto

RSA-Verschlüsselung unter Android

„Ich bin ein Server, wer schreibt mir da?“ Solche Fragen klären Computer automatisch mit asymmetrischer Verschlüsselung wie RSA. Das Prinzip ist einfach, die Mathematik übernimmt die Systembibliothek BouncyCastle. Bei der Implementierung stolperte ich aber über einige wenig intuitive Interfaces.

Asymmetrische Verschlüsselung wie RSA finde ich unglaublich praktisch und mathematisch faszinierend. Beispielsweise kann meine App in Millisekunden ein neues Schlüsselpaar erzeugen und den öffentlichen Schlüssel bedenkenlos durchs Internet verschicken. Mit diesem Schlüssel kann irgendein anderer Rechner, zum Beispiel der Server meines bereits in [1] erwähnten Cloud-Datenbank-Projekts „Pinyto“, zweifelsfrei überprüfen, dass eine Nachricht von meiner App kommen muss und kein Hacker sie manipuliert hat. Umgekehrt besitzt mein Server auch ein Schlüsselpaar, und mit dem Schlüssel sorgt meine App dafür, dass die Antwort-Nachricht nur von meinem Server gelesen werden kann. Dieses Prinzip nutzt die Authentifizierung bei Pinyto, meinem Beispiel für diesen Artikel (Code unter ct.de/ymm7).

Im Prinzip ist RSA ganz einfach: Schlüssel entstehen aus sehr großen Primzahlen (N=p·q beim öffentlichen Schlüssel und d beim Privaten) und einem Exponenten e (auch eine Primzahl). e muss nicht besonders groß sein, weshalb eigentlich immer 65537 gewählt wird. Mit diesen Werten kann man ziemlich schnell einen symmetrischen Schlüssel oder den Hash einer Nachricht potenzieren und das Ergebnis Modulo N rechnen. Um herauszufinden, wie das Ergebnis entstand, müsste man allerdings eine Primfaktorzerlegung für Zahlen mit 4096 Bit (N und d) berechnen, was auch mit Großrechnern Jahrzehnte dauert. In der Praxis heißt das, dass man Schlüssel in Form zweier dieser langen Zahlen speichern muss, plus das kleine e.