{"id":19527,"date":"2022-08-14T09:00:16","date_gmt":"2022-08-14T07:00:16","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=19527"},"modified":"2023-08-20T14:55:21","modified_gmt":"2023-08-20T12:55:21","slug":"elliptische-kurve-curve25519-mit-java-auf-dem-raspberry-pi-4","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=19527","title":{"rendered":"Elliptische Kurve Curve25519 mit Java auf dem Raspberry Pi 4"},"content":{"rendered":"<p>Elliptische Kurven mit Java auf dem Raspberry Pi nutzen. <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/curve25519-1536x1030-1.png\" alt=\"\" width=\"1536\" height=\"1030\" class=\"aligncenter size-full wp-image-19528\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/curve25519-1536x1030-1.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/curve25519-1536x1030-1-300x201.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/curve25519-1536x1030-1-1024x687.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/curve25519-1536x1030-1-768x515.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><br \/>\nDas geht mit der <a href=\"https:\/\/github.com\/IT-Berater\/curve25519-java\" rel=\"noopener\" target=\"_blank\">curve25519-java<\/a> implementation auch auf einem Raspberry Pi.<\/p>\n<p>Wir erstellen mal ein kleines Beispiel, mit dieser Lib.<!--more--><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/wenzlaff.de-2022-08-14-um-08.44.49.png\" alt=\"\" width=\"864\" height=\"896\" class=\"aligncenter size-full wp-image-19529\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/wenzlaff.de-2022-08-14-um-08.44.49.png 864w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/wenzlaff.de-2022-08-14-um-08.44.49-289x300.png 289w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2022\/08\/wenzlaff.de-2022-08-14-um-08.44.49-768x796.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/> <\/p>\n<p>Das ganze Projekt gibt es <a href=\"https:\/\/gitlab.com\/IT-Berater\/twcurve25519\" rel=\"noopener\" target=\"_blank\">auf GitLab<\/a>.<\/p>\n<p>Zuerst muss die Lib in der pom.xml eingetragen werden:<\/p>\n<pre class=\"theme:mm-dark-blue lang:xhtml decode:true \" >&lt;dependencies&gt;\r\n\t\t&lt;dependency&gt;\r\n\t\t\t&lt;groupId&gt;org.whispersystems&lt;\/groupId&gt;\r\n\t\t\t&lt;artifactId&gt;curve25519-java&lt;\/artifactId&gt;\r\n\t\t\t&lt;version&gt;0.5.0&lt;\/version&gt;\r\n\t\t&lt;\/dependency&gt;\r\n\t&lt;\/dependencies&gt;<\/pre>\n<p>Eine Beispiel Klasse sieht so aus:<\/p>\n<pre class=\"lang:java decode:true \" >\/**\r\n * Curve 25519 Sample https:\/\/github.com\/IT-Berater\/curve25519-java.git\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\npublic class Check {\r\n\r\n\tpublic static void main(String[] args) {\r\n\r\n\t\tSystem.out.println(\"Ist Native   : \" + Curve25519.getInstance(Curve25519.BEST).isNative());\r\n\r\n\t\t\/\/ BEST -&gt; This is a provider that attempts to use NATIVE, but falls back to\r\n\t\t\/\/ JAVA if the former is unavailable\r\n\t\t\/\/ A Curve25519 interface for generating keys, calculating agreements, creating\r\n\t\t\/\/ signatures, and verifying signatures\r\n\t\tCurve25519KeyPair keyPair = Curve25519.getInstance(Curve25519.BEST).generateKeyPair();\r\n\r\n\t\tbyte[] publicKey = keyPair.getPublicKey();\r\n\t\tbyte[] privateKey = keyPair.getPrivateKey();\r\n\t\tSystem.out.println(\"Public Key   : \" + Format.byteArrayToHex(publicKey));\r\n\t\tSystem.out.println(\"Private Key  : \" + Format.byteArrayToHex(privateKey));\r\n\r\n\t\tCurve25519 cipher = Curve25519.getInstance(Curve25519.BEST);\r\n\t\t\/\/ Calculates an ECDH agreement - sharedSecret = A 32-byte shared secret\r\n\t\tbyte[] sharedSecret = cipher.calculateAgreement(publicKey, privateKey);\r\n\t\tSystem.out.println(\"Shared Secret: \" + Format.byteArrayToHex(sharedSecret));\r\n\r\n\t\tbyte[] message = \"Test Nachricht von kleinhirn.eu\".getBytes();\r\n\t\t\/\/ signature = A 64-byte signature - Calculates a Curve25519 signature\r\n\t\tbyte[] signature = cipher.calculateSignature(privateKey, message);\r\n\t\tSystem.out.println(\"Signatur     : \" + Format.byteArrayToHex(signature));\r\n\r\n\t\t\/\/ Verify a Curve25519 signature - true if valid, false if not\r\n\t\tboolean validSignature = cipher.verifySignature(publicKey, message, signature);\r\n\t\tPrint.ergebnis(validSignature);\r\n\t}\r\n}\r\n<\/pre>\n<p>Wie kann es nun auf einen Raspberry Pi ausprobiert werden? Ein <\/p>\n<p><strong>mvn clean install <\/strong><\/p>\n<p>erzeugt im target Verzeichnis das <\/p>\n<p><strong>de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar<\/strong> <\/p>\n<p>Jar mit allen Abh\u00e4ngigkeiten. Dieses einfach auf den Raspberry Pi 4 kopieren und das Programm starten mit: <\/p>\n<p><strong>java -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar<\/strong><\/p>\n<p>Das Ergebnis ist der Public und der Private Key mit der Signatur \u00fcberpr\u00fcfung.<\/p>\n<pre class=\"theme:vs2012-black lang:default decode:true \" >pi@pi-vier:~ $ \r\n\r\njava -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar\r\n\r\nIst Native   : false\r\nPublic Key   : 8c8bf2764f5dfb89713726acc39476acdfc1df8a86314ff30f56ec99034dad06\r\nPrivate Key  : e8ba2e4560eff57d953b8af14f3593b45b25b7e4c50c54d760745361f8af8359\r\nShared Secret: 17c4e6edec5d2a933817f0e4d3d13a6914df8020ddea3a362f465afb18542d0a\r\nSignatur     : 6463d0fa2744764fdad20b523c72c7ecd2742e95814e9e75d0775de2432bcad5bc4219bd9bdbe7989434c2fe7fdf49b489d7c4feea34d11aae45adf8c59a8500\r\nOK: Die Signatur passt zur Nachricht\r\n\r\n<\/pre>\n<p>Auf einem Pi Zero l\u00e4uft es leider nicht:<\/p>\n<pre class=\"lang:default decode:true \" >\r\npi@pi-zero:~ $ java -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar\r\nError occurred during initialization of VM\r\nServer VM is only supported on ARMv7+ VFP<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Elliptische Kurven mit Java auf dem Raspberry Pi nutzen. Das geht mit der curve25519-java implementation auch auf einem Raspberry Pi. Wir erstellen mal ein kleines Beispiel, mit dieser Lib.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4606,5,3163,1023],"tags":[5264,451,4597,2178,4969,176,2401,449],"class_list":["post-19527","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-crypto","category-java","category-maven","category-raspberry-pi","tag-5264","tag-crypt","tag-crypto","tag-java","tag-kurven","tag-sicherheit","tag-signatur","tag-verschluesseln"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/19527","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=19527"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/19527\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=19527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=19527"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=19527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}