Da es nur sehr wenige asymmetrische Verschlüsselungsroutinen gibt, stelle ich Euch hier die zweite Variante vor. Es handelt sich um die El Gamal-Verschlüsselung, welche auf Basis der diskreten Algorithmen arbeiten („DSA“). Innerhalb der Standard-Java-Umgebung (zumindest bis Version 8 Build 191) ist dieses Verfahren nicht implementiert, daher benötigen wir hier eine separate Library und nutzen Bouncy Castle.
Sehr auffallend ist die deutliche Verlängerung des verschlüsselten Textes: bei einem Klartext von 29 Byte Länge und 2048-Bit Schlüsseln entsteht ein 512 Byte langer Ciphertext. Weiterhin dauert die Erzeugung eines El Gamal Schlüsselpaares deutlich länger als bei den symmetrischen Varianten. Ihr könnt ja einmal versuchen, statt der 2048-Variante (mein Programm) die 4096er- oder 9192er-Version zu nutzen – Eurer Rechner wird dann eine ganze Weile beschäftigt sein!
Verschlüsselungssteckbrief | |
Name des Verfahrens | El Gamal |
Langname | El Gamal Verschlüsselung |
Art der Chiffre | Kompletter Plaintext |
Blocklänge (Byte) | – |
Schlüssellänge (Byte/Bit) | 32/256, 64/512, 128/1024, 256/2048, 512/4096, 1024/9192 |
Padding genutzt | Nein |
Sicherheit | nur ab 2048 Bit Schlüssellänge |
Besonderes | Geeignet nur für kleine Datenmengen |
Bitte die nachfolgende Routine nicht für den Echteinsatz nutzen, da sie aus kryptographischer Sicht sehr angreifbar ist !
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 |
package net.bplaced.javacrypto.asymmetricencryption; /* * 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 * Datum/Date (dd.mm.jjjj): 26.12.2018 * Funktion: verschlüsselt einen Text mittels El Gamal (Asymmetrisch) * Function: encrypts a text string using El Gamal (asymmetric) * * 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 ! */ import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import java.security.Security; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.xml.bind.DatatypeConverter; import java.security.InvalidKeyException; import org.bouncycastle.jce.interfaces.ElGamalPrivateKey; import org.bouncycastle.jce.interfaces.ElGamalPublicKey; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class C04_ElGamal { public static void main(String[] args) throws Exception { System.out.println("C04 El Gamal Verschlüsselung"); // benötigt Bouncy Castle Security.addProvider(new BouncyCastleProvider()); String plaintextString = "Das ist die geheime Nachricht"; // String plaintextString ="12345678901234567890123456789012"; // max 32 byte byte[] plaintextByte = plaintextString.getBytes("utf-8"); byte[] ciphertextByte = null; byte[] decryptedtextByte = null; // erzeugung eines schlüsselpaares KeyPairGenerator egGenerator = KeyPairGenerator.getInstance("ElGamal", "BC"); SecureRandom random = new SecureRandom(); egGenerator.initialize(2048, random); KeyPair egKeyPair = egGenerator.generateKeyPair(); ElGamalPublicKey egPublicKey = (ElGamalPublicKey) egKeyPair.getPublic(); ElGamalPrivateKey egPrivateKey = (ElGamalPrivateKey) egKeyPair.getPrivate(); // verschlüsselung mit dem öffentlichen schlüssel ciphertextByte = EgEncrypt(plaintextByte, egPublicKey); // entschlüsselung mit dem privaten schlüssel decryptedtextByte = EgDecrypt(ciphertextByte, egPrivateKey); System.out.println(); System.out.println("El Gamal Schlüsselerzeugung"); System.out.println("egPrivateKey (Byte) Länge:" + egPrivateKey.getEncoded().length + " Bytes"); System.out.println(byteArrayPrint(egPrivateKey.getEncoded(), 33)); System.out.println("\negPublicKey (Byte) Länge:" + egPublicKey.getEncoded().length + " Bytes"); System.out.println(byteArrayPrint(egPublicKey.getEncoded(), 33)); System.out.println(); System.out.println("El Gamal Verschlüsselung"); System.out.println("plaintextString :" + plaintextString); System.out.println("plaintextByte Länge:" + plaintextByte.length + " Bytes Data:" + DatatypeConverter.printHexBinary(plaintextByte)); System.out.println("ciphertextByte Länge:" + ciphertextByte.length + " Bytes"); System.out.println(byteArrayPrint(ciphertextByte, 33)); System.out.println("decryptedtextByte :" + DatatypeConverter.printHexBinary(decryptedtextByte)); System.out.println("decryptedtextString:" + new String(decryptedtextByte)); System.out.println(); } public static byte[] EgEncrypt(byte[] plaintextByte, ElGamalPublicKey publicKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException { byte[] ciphertextByte = null; Cipher encryptCipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"); encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey); ciphertextByte = encryptCipher.doFinal(plaintextByte); return ciphertextByte; } public static byte[] EgDecrypt(byte[] ciphertextByte, ElGamalPrivateKey privateKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException { byte[] decryptedtextByte = null; Cipher decryptCipher = Cipher.getInstance("ElGamal/None/NoPadding", "BC"); decryptCipher.init(Cipher.DECRYPT_MODE, privateKey); decryptedtextByte = decryptCipher.doFinal(ciphertextByte); return decryptedtextByte; } public static String byteArrayPrint(byte[] byteData, int numberPerRow) { String returnString = ""; String rawString = DatatypeConverter.printHexBinary(byteData); int rawLength = rawString.length(); int i = 0; int j = 1; int z = 0; for (i = 0; i < rawLength; i++) { z++; returnString = returnString + rawString.charAt(i); if (j == 2) { returnString = returnString + " "; j = 0; } j++; if (z == (numberPerRow * 2)) { returnString = returnString + "\n"; z = 0; } } return returnString; } } |
Hier die Ausgabe auf der Konsole:
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 |
C04 El Gamal Verschlüsselung El Gamal Schlüsselerzeugung egPrivateKey (Byte) Länge:808 Bytes 30 82 03 24 02 01 00 30 82 02 15 06 06 2B 0E 07 02 01 01 30 82 02 09 02 82 01 01 00 95 47 5C F5 D9 3E 59 6C 3F CD 1D 90 2A DD 02 F4 27 F5 F3 C7 21 03 13 BB 45 FB 4D 5B B2 E5 FE 1C BD 67 8C D4 BB DD 84 C9 83 6B E1 F3 1C 07 77 72 5A EB 6C 2F C3 8B 85 F4 80 76 FA 76 BC D8 14 6C C8 9A 6F B2 F7 06 DD 71 98 98 C2 08 3D C8 D8 96 F8 40 62 E2 C9 C9 4D 13 7B 05 4A 8D 80 96 AD B8 D5 19 52 39 8E EC A8 52 A0 AF 12 DF 83 E4 75 AA 65 D4 EC 0C 38 A9 56 0D 56 61 18 6F F9 8B 9F C9 EB 60 EE E8 B0 30 37 6B 23 6B C7 3B E3 AC DB D7 4F D6 1C 1D 24 75 FA 30 77 B8 F0 80 46 78 81 FF 7E 1C A5 6F EE 06 6D 79 50 6A DE 51 ED BB 54 43 A5 63 92 7D BC 4B A5 20 08 67 46 17 5C 88 85 92 5E BC 64 C6 14 79 06 77 34 96 99 0C B7 14 EC 66 73 04 E2 61 FA EE 33 B3 CB DF 00 8E 0C 3F A9 06 50 D9 7D 39 09 C9 27 5B F4 AC 86 FF CB 3D 03 E6 DF C8 AD A5 93 42 42 DD 6D 3B CC A2 A4 06 CB 0B 02 82 01 00 42 DE BB 9D A5 B3 D8 8C C9 56 E0 87 87 EC 3F 3A 09 BB A5 F4 8B 88 9A 74 AA F5 31 74 AA 0F BE 7E 3C 5B 8F CD 7A 53 BE F5 63 B0 E9 85 60 32 89 60 A9 51 7F 40 14 D3 32 5F C7 96 2B F1 E0 49 37 0D 76 D1 31 4A 76 13 7E 79 2F 3F 0D B8 59 D0 95 E4 A5 B9 32 02 4F 07 9E CF 2E F0 9C 79 74 52 B0 77 0E 13 50 78 2E D5 7D DF 79 49 79 DC EF 23 CB 96 F1 83 06 19 65 C4 EB C9 3C 9C 71 C5 6B 92 59 55 A7 5F 94 CC CF 14 49 AC 43 D5 86 D0 BE EE 43 25 1B 0B 22 87 34 9D 68 DE 0D 14 44 03 F1 3E 80 2F 41 46 D8 82 E0 57 AF 19 B6 F6 27 5C 66 76 C8 FA 0E 3C A2 71 3A 32 57 FD 1B 27 D0 63 9F 69 5E 34 7D 8D 1C F9 AC 81 9A 26 CA 9B 04 CB 0E B9 B7 B0 35 98 8D 15 BB AC 65 21 2A 55 23 9C FC 7E 58 FA E3 8D 72 50 AB 99 91 FF BC 97 13 40 25 FE 8C E0 4C 43 99 AD 96 56 9B E9 1A 54 6F 49 78 69 3C 7A 04 82 01 04 02 82 01 00 2D C0 17 7F E7 23 40 2B A1 C1 65 6B EB 63 AB E1 6D D1 E4 4E 9E E6 F9 72 B1 78 7F A3 1E 66 DF 2D 2B 72 D4 63 9A A7 9D C8 53 C7 6F F0 15 FC 0E D1 7E 2F 9A C7 BE 42 97 C6 30 B3 A0 21 0E 62 CF AB 3B D3 06 3E 49 06 B3 61 DB A8 C3 B9 B6 67 4A CE 92 C3 AA 29 21 F4 FF C4 D8 75 03 FA 7F 80 95 EF 4A 1B C5 D9 EC B8 C8 AD 14 11 33 24 81 BC CE A3 3F F1 5B 33 2E 50 A7 01 24 B1 99 3D 64 47 9A F8 43 46 1A E1 C0 B1 9A 65 4A AC 88 B5 E2 57 DD E6 39 4B 40 9C 33 86 AC 28 85 13 4B B3 27 0C E6 B6 25 6C 72 DD 3C F3 E8 74 86 DA 47 9D 2A 52 53 D1 D3 2A F4 15 E7 3D 75 62 E4 42 3E 64 DE AF 50 D3 73 E9 1C 97 29 0B D7 14 C3 DE DA 5F C3 05 92 37 44 85 DF 73 4A 07 67 E8 35 2E 1E 77 5A 3F FE AC D7 5B DE C4 87 CB F7 39 4D 38 41 75 CB 90 02 FE D2 EA EC 65 A0 32 37 A1 5C 19 5E C3 18 45 6E 7C egPublicKey (Byte) Länge:806 Bytes 30 82 03 22 30 82 02 15 06 06 2B 0E 07 02 01 01 30 82 02 09 02 82 01 01 00 95 47 5C F5 D9 3E 59 6C 3F CD 1D 90 2A DD 02 F4 27 F5 F3 C7 21 03 13 BB 45 FB 4D 5B B2 E5 FE 1C BD 67 8C D4 BB DD 84 C9 83 6B E1 F3 1C 07 77 72 5A EB 6C 2F C3 8B 85 F4 80 76 FA 76 BC D8 14 6C C8 9A 6F B2 F7 06 DD 71 98 98 C2 08 3D C8 D8 96 F8 40 62 E2 C9 C9 4D 13 7B 05 4A 8D 80 96 AD B8 D5 19 52 39 8E EC A8 52 A0 AF 12 DF 83 E4 75 AA 65 D4 EC 0C 38 A9 56 0D 56 61 18 6F F9 8B 9F C9 EB 60 EE E8 B0 30 37 6B 23 6B C7 3B E3 AC DB D7 4F D6 1C 1D 24 75 FA 30 77 B8 F0 80 46 78 81 FF 7E 1C A5 6F EE 06 6D 79 50 6A DE 51 ED BB 54 43 A5 63 92 7D BC 4B A5 20 08 67 46 17 5C 88 85 92 5E BC 64 C6 14 79 06 77 34 96 99 0C B7 14 EC 66 73 04 E2 61 FA EE 33 B3 CB DF 00 8E 0C 3F A9 06 50 D9 7D 39 09 C9 27 5B F4 AC 86 FF CB 3D 03 E6 DF C8 AD A5 93 42 42 DD 6D 3B CC A2 A4 06 CB 0B 02 82 01 00 42 DE BB 9D A5 B3 D8 8C C9 56 E0 87 87 EC 3F 3A 09 BB A5 F4 8B 88 9A 74 AA F5 31 74 AA 0F BE 7E 3C 5B 8F CD 7A 53 BE F5 63 B0 E9 85 60 32 89 60 A9 51 7F 40 14 D3 32 5F C7 96 2B F1 E0 49 37 0D 76 D1 31 4A 76 13 7E 79 2F 3F 0D B8 59 D0 95 E4 A5 B9 32 02 4F 07 9E CF 2E F0 9C 79 74 52 B0 77 0E 13 50 78 2E D5 7D DF 79 49 79 DC EF 23 CB 96 F1 83 06 19 65 C4 EB C9 3C 9C 71 C5 6B 92 59 55 A7 5F 94 CC CF 14 49 AC 43 D5 86 D0 BE EE 43 25 1B 0B 22 87 34 9D 68 DE 0D 14 44 03 F1 3E 80 2F 41 46 D8 82 E0 57 AF 19 B6 F6 27 5C 66 76 C8 FA 0E 3C A2 71 3A 32 57 FD 1B 27 D0 63 9F 69 5E 34 7D 8D 1C F9 AC 81 9A 26 CA 9B 04 CB 0E B9 B7 B0 35 98 8D 15 BB AC 65 21 2A 55 23 9C FC 7E 58 FA E3 8D 72 50 AB 99 91 FF BC 97 13 40 25 FE 8C E0 4C 43 99 AD 96 56 9B E9 1A 54 6F 49 78 69 3C 7A 03 82 01 05 00 02 82 01 00 19 1A 3B E9 FE 24 E7 66 CA B6 A1 00 39 70 CE B4 B0 DD 40 48 E2 2F 0A 16 D9 33 C8 5C 1B 77 01 D0 66 02 C4 45 96 9A A8 37 5E F0 AF 1F 7E F8 A6 59 D7 9C D6 91 A8 69 6F 22 F5 B5 C7 01 B9 EB 8D 05 EA DE 0B 18 F8 11 E2 CF 2F E9 9C F9 F9 00 59 90 32 B9 D0 5C 45 09 10 79 69 52 F5 6C F4 13 80 13 28 C6 E1 2B E9 3B 61 87 BD F2 5B 44 3C EE 6B 9A 23 C1 20 CC A2 23 21 88 AA E2 0A 2B 1D 6C 88 8E F4 D9 09 8D 25 A2 8E B2 72 F5 04 56 59 46 9E 1F CF 4A AC D1 C9 B5 82 6A 5D 8E 11 08 55 52 D7 A7 55 34 9A 2D 76 D1 1E E6 B8 72 34 40 F5 C8 1C 82 E6 D7 2C 0E 43 AC 09 FD B6 5A 83 F6 54 41 64 24 15 75 2D A5 FA CB 48 6F B3 4F 62 D6 8A A1 A7 89 F7 14 8A BE D1 A1 40 23 6B 0D ED C7 29 8D B4 57 65 52 95 C7 5E EA 81 33 C0 3B DF 1B C7 DC 42 8C E7 E4 F2 B0 28 BC CE 94 AC 55 64 DE B8 2C A4 74 El Gamal Verschlüsselung plaintextString :Das ist die geheime Nachricht plaintextByte Länge:29 Bytes Data:44617320697374206469652067656865696D65204E6163687269636874 ciphertextByte Länge:512 Bytes 36 AC 72 62 5B 74 FE 1F 01 7C BC A0 80 97 84 99 DD B4 C2 E3 A2 CE 3A EF AE C9 D1 8E 38 AC A0 46 88 32 3D EE A8 D4 84 2F F4 88 88 F3 FF CD 4A FC E3 90 27 35 74 D2 51 15 F1 5A 61 D7 1F 02 27 25 9B 84 1C 81 20 C3 B2 66 3B FC 10 FA 11 12 A6 EC 24 D5 39 A0 8B D6 BE 8C AF 8E EC AB A7 78 D6 ED A5 29 38 93 D3 9C 58 50 CF B1 0D 4C 8A 45 BF 3E 7C C7 E5 DF D1 57 1A 3D 06 FC 75 41 A0 5F 5C 91 9D 44 FB 8C C3 FC 44 26 7F 5C 2C DC 17 F1 2C 7A 58 0D D3 2B B3 BE F7 76 D9 79 E7 1C FE BA 28 6B F1 27 8D 22 C4 3C 19 49 B6 85 76 5C B0 63 22 EF 5E B5 0E 07 0A 67 E4 12 D5 15 D5 4E AB A5 2C 97 DE 1F 6D 9B 2E 85 58 A4 BE F6 79 13 DC 3A 43 4B 15 0C F0 87 58 EA AD 29 80 AF 4F 8A A7 A5 42 EA 8B 3D 35 BA 32 BD E2 A6 49 2C 46 08 1F 55 6F AF 84 A4 8A D7 E9 EF CF 3D 9A BA B0 79 57 48 9C C8 2E 44 AB 83 9F 53 D4 D3 48 51 D6 D4 F0 CF 0A B3 29 04 F3 C0 4D 76 D5 31 80 69 81 D1 1C 40 D2 8B B2 5B E7 00 33 B0 4C 51 B2 6E B7 4F 0B 5D 7C F7 53 61 EB 40 12 9D 95 57 8B 37 0A D6 5B 64 F1 8B 61 6D 18 AA BE 21 D6 CD CB D1 98 5F 66 F2 A3 E2 04 3F 80 BB 76 3F 7B 29 F6 E4 C2 B7 0F 07 D4 D5 21 1C C1 B1 DD 4F 12 4A E1 5B DF 81 A2 0C E7 DA 35 17 A7 6C EB 8A BD 5E 8E C7 A3 72 42 03 7A 2A 7C E9 41 35 C3 F0 CB 9A C4 B6 CA AC 6C 88 86 BB 23 58 78 50 54 34 BB 4D A5 7A 60 85 C3 9A 7F A2 B5 FC D2 63 55 2D 53 A6 E4 7D 77 41 28 8D F3 F5 B8 43 66 C5 BA 16 09 F4 ED 3E 0B 15 B5 D0 15 1A 16 BA C1 14 38 81 41 B2 DA 3A 40 05 CC CA 31 10 16 2F 97 9A 11 E6 E6 C1 51 6F 79 DF E1 28 DC C1 4A 7D A0 A0 CB 4C C7 E3 47 08 39 62 59 6A F0 A2 B3 5A 59 31 ED 46 54 E1 24 6C 97 3D EB 3D 7F 06 decryptedtextByte :44617320697374206469652067656865696D65204E6163687269636874 decryptedtextString:Das ist die geheime Nachricht |
Die Lizenz zum obigen Beispiel findet Ihr auf der eigenen Lizenz-Seite.
Letzte Aktualisierung: 26.12.2018