{"id":22824,"date":"2025-09-20T17:25:03","date_gmt":"2025-09-20T15:25:03","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=22824"},"modified":"2025-09-20T17:27:53","modified_gmt":"2025-09-20T15:27:53","slug":"elliptische-kurven-sind-fuer-sichere-verschluesselungen-wichtig-deshalb-hier-den-elliptic-curve-diffie-hellman-ecdh","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=22824","title":{"rendered":"Elliptische Kurven sind f\u00fcr sichere Verschl\u00fcsselungen wichtig deshalb hier den Elliptic Curve Diffie-Hellman (ECDH)"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/09\/ecc-1.mp4.gif\" alt=\"\" width=\"512\" height=\"288\" class=\"aligncenter size-full wp-image-20851\" \/><\/p>\n<p>Elliptische Kurven sehen auf den ersten Blick aus wie geschwungene Linien, \u00e4hnlich 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 <a href=\"http:\/\/blog.wenzlaff.de\/?s=kurven\" target=\"_blank\">hier<\/a> schon einige Artikel zu Raspberry Pi und XCA geschrieben.<\/p>\n<p>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 <strong>Summe<\/strong> der beiden Punkte. So kann man mit Punkten auf der Kurve nach bestimmten Regeln rechnen.<\/p>\n<p>Diese besondere Art zu rechnen macht elliptische Kurven f\u00fcr sichere Verschl\u00fcsselungen wichtig, weil es sehr schwer ist, aus einem Ergebnis die urspr\u00fcnglichen Punkte zur\u00fcckzurechnen.<\/p>\n<p>Wollte auch noch, wie <a href=\"http:\/\/blog.wenzlaff.de\/?p=22818\" target=\"_blank\">gestern, den Diffie-Hellman-Schl\u00fcsselaustausch<\/a> mit Elliptische Kurven in Java zeigen:<\/p>\n<p><!--more--><\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.crypto;\r\n\r\nimport java.security.KeyPair;\r\nimport java.security.KeyPairGenerator;\r\nimport java.security.PublicKey;\r\nimport java.security.spec.ECGenParameterSpec;\r\nimport java.util.Arrays;\r\n\r\nimport javax.crypto.KeyAgreement;\r\n\r\n\/**\r\n * Beispiel zu ECDH, siehe auch http:\/\/blog.wenzlaff.de\/?s=kurven\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\npublic class ECDH {\r\n\r\n\tpublic static void main(String[] args) throws Exception {\r\n\r\n\t\t\/\/ ein Generator f\u00fcr Schl\u00fcsselpaaren erzeugen, der den Algorithmus \"EC\"\r\n\t\t\/\/ (Elliptische Kurven) verwendet\r\n\t\tKeyPairGenerator kpg = KeyPairGenerator.getInstance(\"EC\");\r\n\t\t\/\/ \"secp256r1\" ist der Name einer standardisierten elliptischen Kurve.\r\n\t\t\/\/ Diese Kurve ist sehr verbreitet und wird als sicher und effizient angesehen.\r\n\t\tECGenParameterSpec ecSpec = new ECGenParameterSpec(\"secp256r1\");\r\n\t\tkpg.initialize(ecSpec);\r\n\r\n\t\t\/\/ Alice erzeugt Schl\u00fcsselpaar\r\n\t\tKeyPair aliceKP = kpg.generateKeyPair();\r\n\t\tKeyAgreement aliceKeyAgree = KeyAgreement.getInstance(\"ECDH\");\r\n\t\tSystem.out.println(\"\\nAlice erzeugter public Key  = \" + aliceKP.getPublic());\r\n\t\tSystem.out.println(\"\\nAlice erzeugter private Key (Hex) = \" + bytesToHex(aliceKP.getPrivate().getEncoded()));\r\n\r\n\t\taliceKeyAgree.init(aliceKP.getPrivate());\r\n\r\n\t\t\/\/ Bob erzeugt Schl\u00fcsselpaar\r\n\t\tKeyPair bobKP = kpg.generateKeyPair();\r\n\t\tKeyAgreement bobKeyAgree = KeyAgreement.getInstance(\"ECDH\");\r\n\t\tbobKeyAgree.init(bobKP.getPrivate());\r\n\t\tSystem.out.println(\"\\nBob erzeugter public Key  = \" + bobKP.getPublic());\r\n\t\tSystem.out.println(\"\\nBob erzeugter private Key (Hex)  = \" + bytesToHex(bobKP.getPrivate().getEncoded()));\r\n\r\n\t\t\/\/ \u00d6ffentliche Schl\u00fcssel austauschen\r\n\t\tPublicKey alicePubKey = aliceKP.getPublic();\r\n\t\tPublicKey bobPubKey = bobKP.getPublic();\r\n\r\n\t\t\/\/ Alice berechnet das gemeinsame Geheimnis\r\n\t\t\/\/ die elliptische Kurvenoperation durchf\u00fchren\r\n\t\taliceKeyAgree.doPhase(bobPubKey, true);\r\n\t\tbyte[] aliceSharedSecret = aliceKeyAgree.generateSecret();\r\n\r\n\t\t\/\/ Bob berechnet das gemeinsame Geheimnis\r\n\t\t\/\/ die elliptische Kurvenoperation durchf\u00fchren\r\n\t\tbobKeyAgree.doPhase(alicePubKey, true);\r\n\t\tbyte[] bobSharedSecret = bobKeyAgree.generateSecret();\r\n\r\n\t\t\/\/ Vergleich: beide Schl\u00fcssel sollten gleich sein\r\n\t\tSystem.out.println(\"\\nSind beide Shared Secrets identisch? \" + Arrays.equals(aliceSharedSecret, bobSharedSecret));\r\n\t\tSystem.out.println(\"Shared Secret (Hex): \" + bytesToHex(aliceSharedSecret));\r\n\t}\r\n\r\n\t\/\/ Hilfsmethode f\u00fcr hexadezimale Ausgabe\r\n\tprivate static String bytesToHex(byte[] bytes) {\r\n\t\tStringBuilder sb = new StringBuilder();\r\n\t\tfor (byte b : bytes)\r\n\t\t\tsb.append(String.format(\"%02x\", b));\r\n\t\treturn sb.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>Ausgabe:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nAlice erzeugter public Key  = Sun EC public key, 256 bits\r\n  public x coord: 92043774897781879333491254740459260328163132048091793166643389614878912770758\r\n  public y coord: 22454072579967612515434179872226388437264810521555538147920659195864733836294\r\n  parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)\r\n\r\nAlice erzeugter private Key (Hex) = 3041020100301306072a8648ce3d020106082a8648ce3d030107042730250201010420d8cf0fe15fdd7af204945d33198130ef712786e27bbd8a535eb632996386bf04\r\n\r\nBob erzeugter public Key  = Sun EC public key, 256 bits\r\n  public x coord: 97749955595661030289791544095983768972908172076979925384199022459611813647538\r\n  public y coord: 15384538490666098943522602953473983603479311079111923971035314608753736092274\r\n  parameters: secp256r1 [NIST P-256,X9.62 prime256v1] (1.2.840.10045.3.1.7)\r\n\r\nBob erzeugter private Key (Hex)  = 3041020100301306072a8648ce3d020106082a8648ce3d03010704273025020101042008d53e27fd2fe980837c4803252c59d655e9e57808afa7cb80c0b704508e3cdc\r\n\r\nSind beide Shared Secrets identisch? true\r\nShared Secret (Hex): 56711760f962b88f9fca6e92f06985d0117b38f4e02cec977516cfab0a0f86e4<\/pre>\n<p>In diesem Sinne, #HeuteIstEinSch\u00f6nerTag:<\/p>\n<p><strong><br \/>\nDie Kurven faszinieren mich sehr,<br \/>\nIhre Form mag ich immer mehr.<br \/>\nMathematisch, doch ganz genau,<br \/>\nSch\u00fctzt es Daten, macht sie schlau.<\/strong><\/p>\n<p>Code siehe auch im <a href=\"https:\/\/gitlab.com\/IT-Berater\/twmathe\/-\/tree\/main\/src\/main\/java\/de\/wenzlaff\/crypto?ref_type=heads\" target=\"_blank\">Repo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Elliptische Kurven sehen auf den ersten Blick aus wie geschwungene Linien, \u00e4hnlich 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 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=22824\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eElliptische Kurven sind f\u00fcr sichere Verschl\u00fcsselungen wichtig deshalb hier den Elliptic Curve Diffie-Hellman (ECDH)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,4606,5811,3897,79,1319],"tags":[5800,6224,6223,6221,819,4924,3613,6222],"class_list":["post-22824","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-crypto","category-elliptische-kurven","category-java-programmierung","category-programmierung","category-sicherheit-2","tag-ec","tag-ecdh","tag-elliptic-curve-diffie-hellman","tag-elliptische-kurven","tag-key","tag-private","tag-public","tag-secp256r1"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22824"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/22824\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22824"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}