Elliptische Kurven sehen auf den ersten Blick aus wie geschwungene Linien, ähnlich einer Schlaufe, aber sie haben nichts mit Ellipsen zu tun, die wie Ovale aussehen. Ihr Name kommt aus der Mathematik, aber es ist nur ein Name, keine Beschreibung der Form. Habe hier schon einige Artikel zu Raspberry Pi und XCA geschrieben.
Man kann sich elliptische Kurven so vorstellen: Wenn du zwei Punkte auf der Kurve hast, kannst du eine Linie durch diese Punkte zeichnen. Diese Linie trifft die Kurve meistens an genau einem dritten Punkt. Diesen dritten Punkt spiegelt man dann an der x-Achse, und das Ergebnis ist eine Art Summe der beiden Punkte. So kann man mit Punkten auf der Kurve nach bestimmten Regeln rechnen.
Diese besondere Art zu rechnen macht elliptische Kurven für sichere Verschlüsselungen wichtig, weil es sehr schwer ist, aus einem Ergebnis die ursprünglichen Punkte zurückzurechnen.
Wollte auch noch, wie gestern, den Diffie-Hellman-Schlüsselaustausch mit Elliptische Kurven in Java zeigen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
package de.wenzlaff.crypto; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PublicKey; import java.security.spec.ECGenParameterSpec; import java.util.Arrays; import javax.crypto.KeyAgreement; /** * Beispiel zu ECDH, siehe auch http://blog.wenzlaff.de/?s=kurven * * @author Thomas Wenzlaff * */ public class ECDH { public static void main(String[] args) throws Exception { // ein Generator für Schlüsselpaaren erzeugen, der den Algorithmus "EC" // (Elliptische Kurven) verwendet KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC"); // "secp256r1" ist der Name einer standardisierten elliptischen Kurve. // Diese Kurve ist sehr verbreitet und wird als sicher und effizient angesehen. ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1"); kpg.initialize(ecSpec); // Alice erzeugt Schlüsselpaar KeyPair aliceKP = kpg.generateKeyPair(); KeyAgreement aliceKeyAgree = KeyAgreement.getInstance("ECDH"); System.out.println("\nAlice erzeugter public Key = " + aliceKP.getPublic()); System.out.println("\nAlice erzeugter private Key (Hex) = " + bytesToHex(aliceKP.getPrivate().getEncoded())); aliceKeyAgree.init(aliceKP.getPrivate()); // Bob erzeugt Schlüsselpaar KeyPair bobKP = kpg.generateKeyPair(); KeyAgreement bobKeyAgree = KeyAgreement.getInstance("ECDH"); bobKeyAgree.init(bobKP.getPrivate()); System.out.println("\nBob erzeugter public Key = " + bobKP.getPublic()); System.out.println("\nBob erzeugter private Key (Hex) = " + bytesToHex(bobKP.getPrivate().getEncoded())); // Öffentliche Schlüssel austauschen PublicKey alicePubKey = aliceKP.getPublic(); PublicKey bobPubKey = bobKP.getPublic(); // Alice berechnet das gemeinsame Geheimnis // die elliptische Kurvenoperation durchführen aliceKeyAgree.doPhase(bobPubKey, true); byte[] aliceSharedSecret = aliceKeyAgree.generateSecret(); // Bob berechnet das gemeinsame Geheimnis // die elliptische Kurvenoperation durchführen bobKeyAgree.doPhase(alicePubKey, true); byte[] bobSharedSecret = bobKeyAgree.generateSecret(); // Vergleich: beide Schlüssel sollten gleich sein System.out.println("\nSind beide Shared Secrets identisch? " + Arrays.equals(aliceSharedSecret, bobSharedSecret)); System.out.println("Shared Secret (Hex): " + bytesToHex(aliceSharedSecret)); } // Hilfsmethode für hexadezimale Ausgabe private static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) sb.append(String.format("%02x", b)); return sb.toString(); } } |
Ausgabe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Alice erzeugter public Key = Sun EC public key, 256 bits public x coord: 92043774897781879333491254740459260328163132048091793166643389614878912770758 public y coord: 22454072579967612515434179872226388437264810521555538147920659195864733836294 parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Alice erzeugter private Key (Hex) = 3041020100301306072a8648ce3d020106082a8648ce3d030107042730250201010420d8cf0fe15fdd7af204945d33198130ef712786e27bbd8a535eb632996386bf04 Bob erzeugter public Key = Sun EC public key, 256 bits public x coord: 97749955595661030289791544095983768972908172076979925384199022459611813647538 public y coord: 15384538490666098943522602953473983603479311079111923971035314608753736092274 parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7) Bob erzeugter private Key (Hex) = 3041020100301306072a8648ce3d020106082a8648ce3d03010704273025020101042008d53e27fd2fe980837c4803252c59d655e9e57808afa7cb80c0b704508e3cdc Sind beide Shared Secrets identisch? true Shared Secret (Hex): 56711760f962b88f9fca6e92f06985d0117b38f4e02cec977516cfab0a0f86e4 |
In diesem Sinne, #HeuteIstEinSchönerTag:
Die Kurven faszinieren mich sehr,
Ihre Form mag ich immer mehr.
Mathematisch, doch ganz genau,
Schützt es Daten, macht sie schlau.
Code siehe auch im Repo.