Ich starte die Google Tink Beispiele mit einem sehr einfachen Programm, das aber dennoch voll einsatzfähig und kryptographisch anspruchsvoll ist (das bedeutet, das aus Gründen der Übersichtlichkeit Programmzeilen weggelassen wurden, die zum Beispiel die nicht mehr benötigten Byte Arrays löschen).
Dieses kleine Beispiel führt eine komplette symmetrische Verschlüsselung im AES GCM-Modus mit einer Zeichenkette durch. Zuerst wird ein Schlüssel erzeugt, damit dann die Zeichenkette verschlüsselt und anschließend wieder entschlüsselt. Zusätzlich werden AAD-Daten (additional authenticaed data oder „ergänzende mitauthentifizierte Daten“) benutzt. Am Programmende wird das AAD-Byte Array verändert und die Entschlüsselung scheitert mit einer Exception.
Hier der Steckbrief des Verfahrens:
Verschlüsselungssteckbrief | |
Name des Verfahrens | AES/GCM/NOPADDING |
Langname | GCM Galois_Counter Mode |
Art der Chiffre | Blockchiffre, auch Stream-Chiffre |
Blocklänge (Byte) | 16 |
Schlüssellänge (Byte/Bit) | 16/128, 32/256 |
Padding genutzt | Nein |
Sicherheit | durch Google sichergestellt |
Besonderes |
Bitte die nachfolgende Routine nur nach einer gründlichen Überprüfung für den Echteinsatz nutzen. Aus kryptographischer Sicht dürfte sie für viele Einsatzgebiete nutzbar sein.
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 71 72 73 74 75 76 77 78 79 80 81 |
package net.bplaced.javacrypto.tink; /* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: frei verwendbares Programm (Public Domain) * Copyright: This is free and unencumbered software released into the public domain. * Lizenttext/Licence: <http://unlicense.org> * getestet mit/tested with: Java Runtime Environment 8 Update 191 x64 * getestet mit/tested with: Java Runtime Environment 11.0.1 x64 * Datum/Date (dd.mm.jjjj): 22.01.2019 * Funktion: verschlüsselt einen String mit Google Tink AES GCM * Function: encrypts a String using Google Tink AES GCM * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Das Programm benötigt die nachfolgende Bibliotheken: * The programm uses these external libraries: * jar-Datei: https://mvnrepository.com/artifact/com.google.crypto.tink/tink * jar-Datei: https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java */ import com.google.crypto.tink.Aead; import com.google.crypto.tink.KeysetHandle; import com.google.crypto.tink.aead.AeadConfig; import com.google.crypto.tink.aead.AeadFactory; import com.google.crypto.tink.aead.AeadKeyTemplates; public final class H01_AesGcmEncryptionTinkString { public static void main(String[] args) throws Exception { System.out.println("H01 AES GCM Verschlüsselung Tink mit einem String"); AeadConfig.register(); String plaintextString = "Das ist der zu verschluesselnde String."; String aadtextString = "Hier stehen die AAD-Daten"; byte[] plaintextByte = plaintextString.getBytes("utf-8"); byte[] aadtextByte = aadtextString.getBytes("utf-8"); // schlüssel erzeugen KeysetHandle keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES256_GCM); // initialisierung Aead aead = AeadFactory.getPrimitive(keysetHandle); // verschlüsselung byte[] ciphertextByte = aead.encrypt(plaintextByte, aadtextByte); // entschlüsselung byte[] decryptedtextByte = aead.decrypt(ciphertextByte, aadtextByte); // ausgabe der variablen System.out.println("\nAusgabe der Variablen"); System.out.println("plaintextString :" + plaintextString); System.out.println("aadtextString :" + aadtextString); System.out.println("plaintextByte (hex) :" + printHexBinary(plaintextByte)); System.out.println("= = = Verschlüsselung = = ="); System.out.println("ciphertextByte (hex) :" + printHexBinary(ciphertextByte)); System.out.println("= = = Entschlüsselung = = ="); System.out.println("decryptedtextByte (hex):" + printHexBinary(decryptedtextByte)); System.out.println("decryptedtextString :" + new String(decryptedtextByte)); // veränderung der aadtextByte-Daten führt zu einer Tag mismatch exception System.out.println("\nDie Veränderung der AAD-Daten führt zu einer Exception:"); aadtextByte = new byte[1]; decryptedtextByte = aead.decrypt(ciphertextByte, aadtextByte); } public static String printHexBinary(byte[] bytes) { final char[] hexArray = "0123456789ABCDEF".toCharArray(); char[] hexChars = new char[bytes.length * 2]; for (int j = 0; j < bytes.length; j++) { int v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } } |
Die Konsole gibt diese Daten aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
H01 AES GCM Verschlüsselung Tink mit einem String Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :012094330D9B00245A0366862BD357035B5A8B95E2285ADA1C7E502A0E3F33A9A9E85BF3A76D051D5D255F8DCA8835FB2287F286B1A345F88B6956AD7D9D8CF94C323E37FCD40E7B = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Die Veränderung der AAD-Daten führt zu einer Exception: Jan 22, 2019 3:46:32 PM com.google.crypto.tink.aead.AeadFactory$1 decrypt INFORMATION: ciphertext prefix matches a key, but cannot decrypt: javax.crypto.AEADBadTagException: Tag mismatch! Exception in thread "main" java.security.GeneralSecurityException: decryption failed at com.google.crypto.tink.aead.AeadFactory$1.decrypt(AeadFactory.java:109) at net.bplaced.javacrypto.tink.H01_AesGcmEncryptionTinkString.main(H01_AesGcmEncryptionTinkString.java:69) |
Alle Quellcodes zu Google Tink findet Ihr zum Download in meinem Github-Repository, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/H-Google-Tink. Alle Programme sind sowohl unter Java 8 als auch unter Java 11 lauffähig.
Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.
Letzte Aktualisierung: 22.01.2019