Mittwoch, 18. April 2012Erster eigener private KeyDie Überschrift täuscht etwas - private Schlüssel habe ich schon seit Jahren einige. Alle habe ich eigentlich auch selbst generiert, aber die spannende Frage in diesem Post wird sein wie ich sie generierte und was diesen neuen (den ich sicherlich nie verwenden werde) davon unterscheidet. Die Antwort ist natürlich ganz einfach: In der Regel generierte ich die private Schlüssel mit Programmen wie GnuPG oder OpenSSL - der normale Weg eben, so wie es quasi jeder tut. Den neuen Schlüssel hingegen habe ich mit komplett selbst geschriebener Software gebaut. Klingt auf den ersten Blick vielleicht einfach, andere mögen mit den Augen rollen, dass ich schon wieder so etwas getan habe - zweitere haben vermutlich recht: Um "so weit" zu kommen, habe ich zunächst eine Library geschrieben, die Dateien mit Objekten nach ASN.1 (X.680/X.690) lesen und schreiben kann. Als größte Herausforderung stellte sich hierbei der Umgang mit Integer-Objekten dar, da diese nicht auf 32- oder 64-Bit beschränkt sind, sondern von vorne herein "beliebig" groß sein können - da die Library aber auf möglichst vielen System laufen soll, abstrahiert sie an dieser Stelle einfach zwischen den "nativen" PHP-Erweiterungen GMP, BigInteger, BCMath und hat Fallbacks zu Math_BigInteger (PEAR) und - naja... - normalen Integern. Auf den ASN.1-Parser setzte ich anschließend eine Definition (genauer: Klassen-/Objekt-Definitionen) für X.509 Zertifikate und Keys - teilweise nach RFC 5280 (aber nicht komplett). Zu diesem Zeitpunkt konnte ich also recht leicht bestehende Daten (Zertifikate, Zertifikate-Anfragen und private Keys) einlesen und exakt die selben Daten wieder raus schreiben - eigentlich könnte ich sie auch "modifizieren", das würde bei signierten Zertifikaten allerdings kaum Sinn machen Viel Spannender wurde es dann aber als ich anfing neue Daten erstellen zu wollen - wie generiert man z.B. einen privaten Schlüssel? Wie funktioniert im Detail überhaupt asymmetrische Verschlüsselung? Wie findet man effizient geeignet große Primzahlen und verifiziert, dass diese überhaupt prim sind? Beim finden der Primzahlen, kam ich nach etwas Recherche zu dem Ergebnis: Gar nicht. Es gibt keinen "effizienten" Weg, um große zufällige Primzahlen zu finden. Das "zufällig" in der Aussage beschreibt vermutlich auch gleich recht schön, warum es nicht geht. Auch das Verifizieren der Primzahlen erwies sich als relativ deprimierend und ich blieb beim vermutlich allgemein anerkannten Miller-Rabin-Test. Letzten Endes habe ich ihn aber bekommen: Meinen eigenen privaten Schlüssel - komplett selbst gebaut. (Und kann DER-kodierte X.509-Daten quasi mit bloßem Auge lesen) Um wirklich sicher zu gehen, habe ich noch 10.000 private Schlüssel mit OpenSSL generiert und von meinem Programm nachbauen lassen (ohne eigene Zufallsprimzahlen) - erfolgreich. Private Schlüssel wird wohl weiterhin OpenSSL für mich bauen, dazu misstraue ich mir selbst dann doch genug, bei dem weiterführenden Rest hingegen bin ich sehr offen - mal schauen.
(Seite 1 von 1, insgesamt 1 Einträge)
|
SucheRead this blog!KategorienBlog abonnierenNotice this! |
Kommentare