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.
Das ganze Projekt gibt es auf GitLab.
Zuerst muss die Lib in der pom.xml eingetragen werden:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>org.whispersystems</groupId> <artifactId>curve25519-java</artifactId> <version>0.5.0</version> </dependency> </dependencies> |
Eine Beispiel Klasse sieht so aus:
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 |
/** * Curve 25519 Sample https://github.com/IT-Berater/curve25519-java.git * * @author Thomas Wenzlaff * */ public class Check { public static void main(String[] args) { System.out.println("Ist Native : " + Curve25519.getInstance(Curve25519.BEST).isNative()); // BEST -> This is a provider that attempts to use NATIVE, but falls back to // JAVA if the former is unavailable // A Curve25519 interface for generating keys, calculating agreements, creating // signatures, and verifying signatures Curve25519KeyPair keyPair = Curve25519.getInstance(Curve25519.BEST).generateKeyPair(); byte[] publicKey = keyPair.getPublicKey(); byte[] privateKey = keyPair.getPrivateKey(); System.out.println("Public Key : " + Format.byteArrayToHex(publicKey)); System.out.println("Private Key : " + Format.byteArrayToHex(privateKey)); Curve25519 cipher = Curve25519.getInstance(Curve25519.BEST); // Calculates an ECDH agreement - sharedSecret = A 32-byte shared secret byte[] sharedSecret = cipher.calculateAgreement(publicKey, privateKey); System.out.println("Shared Secret: " + Format.byteArrayToHex(sharedSecret)); byte[] message = "Test Nachricht von kleinhirn.eu".getBytes(); // signature = A 64-byte signature - Calculates a Curve25519 signature byte[] signature = cipher.calculateSignature(privateKey, message); System.out.println("Signatur : " + Format.byteArrayToHex(signature)); // Verify a Curve25519 signature - true if valid, false if not boolean validSignature = cipher.verifySignature(publicKey, message, signature); Print.ergebnis(validSignature); } } |
Wie kann es nun auf einen Raspberry Pi ausprobiert werden? Ein
mvn clean install
erzeugt im target Verzeichnis das
de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar
Jar mit allen Abhängigkeiten. Dieses einfach auf den Raspberry Pi 4 kopieren und das Programm starten mit:
java -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar
Das Ergebnis ist der Public und der Private Key mit der Signatur überprüfung.
1 2 3 4 5 6 7 8 9 10 |
pi@pi-vier:~ $ java -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar Ist Native : false Public Key : 8c8bf2764f5dfb89713726acc39476acdfc1df8a86314ff30f56ec99034dad06 Private Key : e8ba2e4560eff57d953b8af14f3593b45b25b7e4c50c54d760745361f8af8359 Shared Secret: 17c4e6edec5d2a933817f0e4d3d13a6914df8020ddea3a362f465afb18542d0a Signatur : 6463d0fa2744764fdad20b523c72c7ecd2742e95814e9e75d0775de2432bcad5bc4219bd9bdbe7989434c2fe7fdf49b489d7c4feea34d11aae45adf8c59a8500 OK: Die Signatur passt zur Nachricht |
Auf einem Pi Zero läuft es leider nicht:
1 2 3 |
pi@pi-zero:~ $ java -jar de.wenzlaff.curve25519-0.0.1-SNAPSHOT-jar-with-dependencies.jar Error occurred during initialization of VM Server VM is only supported on ARMv7+ VFP |