Das zweite Beispiel für Google Tink ist schon etwas umfangreicher, zeigt es Euch nämlich die derzeit in Tink eingebauten symmetrischen Verschlüsselungen. An diesem Beispiel wird deutlich, wie einfach Ihr zwischen den verschiedenen Verschlüsselungen wechseln könnt, ohne einen zusätzlichen Programmieraufwand zu haben.
Bemerkenswert ist es für mich, dass auch ungewöhnliche oder seltene Verfahren wie AES EAX (wird häufig für die Verschlüsselung eines gesamten Dateisystems genutzt) und CHACHA 20 POLY 1305 (ist das einzige neben AES GCM zugelassene Verfahren im kommenden Internetstandard TLS 1.3) angeboten werden.
Dieses Beispiel gibt zusätzlich die jeweiligen Schlüsseldaten als JSON-Datensatz aus und wir werden einen Datensatz in einem anderen Beitrag analysieren.
Ich spare mir bei diesem Beispiel den Verschlüsselungssteckbrief, um die Seite nicht unnötig zu füllen.
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
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): 23.01.2019 * Funktion: verschlüsselt einen String mit Google Tink Routinen * Function: encrypts a String using Google Tink Encryption * * 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 * jar-Datei: https://mvnrepository.com/artifact/org.json/json */ import java.io.ByteArrayOutputStream; import com.google.crypto.tink.Aead; import com.google.crypto.tink.CleartextKeysetHandle; import com.google.crypto.tink.JsonKeysetWriter; 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 H02_AllSymmetricEncryptionsTinkString { public static void main(String[] args) throws Exception { System.out.println("H02 Alle Symmetrischen Verschlüsselungen 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"); KeysetHandle keysetHandle = null; // wir probieren alle 6 möglichen verfahren aus for (int i = 1; i < 7; i++) { if (i == 1) { System.out.println("\nVerfahren: 128-bit AES GCM"); keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_GCM); } else if (i == 2) { System.out.println("\nVerfahren: 128-bit AES EAX"); keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_EAX); } else if (i == 3) { System.out.println("\nVerfahren: 128-bit AES CTR HMAC SHA256"); keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES128_CTR_HMAC_SHA256); } else if (i == 4) { System.out.println("\nVerfahren: CHACHA 20 POLY 1305"); keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.CHACHA20_POLY1305); } else if (i == 5) { System.out.println(" \nVerfahren: 256-bit AES EAX"); keysetHandle = KeysetHandle.generateNew(AeadKeyTemplates.AES256_EAX); } else if (i == 6) { System.out.println("\nVerfahren: 256-bit AES GCM"); 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("Ausgabe 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)); // ausgabe des schlüssels System.out.println("\nAusgabe des Schlüssels:"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); CleartextKeysetHandle.write(keysetHandle, JsonKeysetWriter.withOutputStream(outputStream)); System.out.println(new String(outputStream.toByteArray())); } } 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 Konsolenausgabe ist etwas länger, daher bitte durchscrollen:
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
H02 Alle Symmetrischen Verschlüsselungen Tink mit einem String Verfahren: 128-bit AES GCM Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :0151CC662ABA05DFEED4C06B6FD712AED2C6ABCEAC01CAD1356DCB0DCA7820B2B25E444A318D832CDE0905D43EC84B02E86F5658EFD73CD918042E6D14995C3CFF7A132092DB4954 = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 1372349994, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey", "keyMaterialType": "SYMMETRIC", "value": "GhDmyI0tCM5AnFMRWH2Ut++L" }, "outputPrefixType": "TINK", "keyId": 1372349994, "status": "ENABLED" }] } Verfahren: 128-bit AES EAX Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :01686BAFF7D4A59CE5C46D6EB61691268FA5EE7003DA9A428D824F6BAA84166AD9BE0C9C621B8B9BB03FC9F157613D51855DE916D3DBBDDD25701B95E78892E0CA381EE142DE234FCCF1678B = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 1751887863, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesEaxKey", "keyMaterialType": "SYMMETRIC", "value": "EgIIEBoQTqGIIZJcGizqQxQPWLCVBA==" }, "outputPrefixType": "TINK", "keyId": 1751887863, "status": "ENABLED" }] } Verfahren: 128-bit AES CTR HMAC SHA256 Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :0103D9843B9DB44C6D5376CF9997B438A177AA4AC7821989D13810FCBD683E6E8B01E2096FBD27AD248F4234ADB3AAA481C30169C69B58457B0DB59232F58DF4451B1FA797BEAF545A8272EA = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 64586811, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesCtrHmacAeadKey", "keyMaterialType": "SYMMETRIC", "value": "EhYSAggQGhD91u0ZEwEGUZ8fCds9/DsjGigSBAgDEBAaIAiq3DzcBpov9mV8CXKD0sySWRC6ZDOgOvXrzI6Ocqy2" }, "outputPrefixType": "TINK", "keyId": 64586811, "status": "ENABLED" }] } Verfahren: CHACHA 20 POLY 1305 Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :013806438AC553D283FC3972F7777B2BC78CC0D0CACB58BA8AD0539E3D94F47743E5E910DBE2BE0FC8D3744CCF5BC8B2B02B7F07FF9D43A62CDF1B2641C26E7855B49C7EE506D58A = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 939934602, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.ChaCha20Poly1305Key", "keyMaterialType": "SYMMETRIC", "value": "EiBUSVNCDnYGeGpnSWYHmX+84X/lg1iY6/15lLzoU8Ty9g==" }, "outputPrefixType": "TINK", "keyId": 939934602, "status": "ENABLED" }] } Verfahren: 256-bit AES EAX Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :0179556CCE23F522D652DE4D7B2978B887232418B47E5A05CD086F0A694277DEA6E26655B6B1FDB15F2C72ACE5CFB348621AC048D1F8EBB5833D6324DD7B284758184BB2C51D76507BF7E861 = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 2035641550, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesEaxKey", "keyMaterialType": "SYMMETRIC", "value": "EgIIEBogYEEvKImH21srdGRKctYll7yiBJTUf8ZJfbMpSOyiXlM=" }, "outputPrefixType": "TINK", "keyId": 2035641550, "status": "ENABLED" }] } Verfahren: 256-bit AES GCM Ausgabe der Variablen plaintextString :Das ist der zu verschluesselnde String. aadtextString :Hier stehen die AAD-Daten plaintextByte (hex) :4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E = = = Verschlüsselung = = = ciphertextByte (hex) :011A398658BC1027AF3EF753F0B9674C9810117CC9F6C1E06DB7557C22BD3AA26C42D9DE5B5C42EF70EE0F08E36BD731D918E043F0B91D902358191F1E173B2F216E46C8C5FE090C = = = Entschlüsselung = = = decryptedtextByte (hex):4461732069737420646572207A75207665727363686C75657373656C6E646520537472696E672E decryptedtextString :Das ist der zu verschluesselnde String. Ausgabe des Schlüssels: { "primaryKeyId": 439977560, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.AesGcmKey", "keyMaterialType": "SYMMETRIC", "value": "GiD9tjhE4+dH/GAyoAxtpKnhgZtHGHci1KQuGEb5+oK6Kw==" }, "outputPrefixType": "TINK", "keyId": 439977560, "status": "ENABLED" }] } |
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: 23.01.2019