Die Notwendigkeit der Geheimhaltung von Daten ist schon sehr alt. Die zum Transport genutzten Boten erhielten die geheime Nachricht mitgeteilt und eilten dann zum Empfänger – es war nur schlecht wenn der falsche Empfänger den Boten dann mehr oder weniger freiwillig zur Herausgabe der Nachricht „überreden“ konnte.
Die nachfolgende Geheimhaltungsroutine wurde von Julius Caesar benutzt, um die Nachricht vor den Boten zu verbergen. Es handelt sich um einen Verschiebe-Mechanismus, denn die Buchstaben wurden einfach durch einen (z.B. 3 Zeichen) versetzten Buchstaben ersetzt. So wird aus einem „A“ ein „E“ und bei der „Entschlüsselung“ wurde der „geheime“ Buchstabe „E“ um 3 Zeichen zurück gesetzt, so das wieder ein „A“ darauf wurde. Eine genauere Erläuterung bietet Euch der Wikipedia-Artikel.
Das nachfolgende Beispiel führt diese Verschiebungen durch, in dem es jeden Buchstaben des plaintextString um eine definierte Anzahl (hier ist es „3“) stellen nach rechts schiebt und bei der Entschlüsselung jeden Buchstaben des chiffretextStrings wieder um 3 Zeichen nach links schiebt.
Diese Lösung stößt an 2 Stellen an Ihre Grenzen – ich kann ein Alphabet (gezählt ohne Umlaute) mit 2 * 26 Buchstaben und 10 Ziffern maximal um 62 Positionen verschieben, dann bin ich wieder am unverschlüsselten Buchstaben angelangt. Das Programm selber nimmt daran keinen Anstoß und verschiebt die Zeichen auch an Stellen (da der ASCII-Code die Basis bildet) an den sich Steuerzeichen oder andere Zeichen befinden, welche schlecht per Bote übermittelt werden können.
So oder so – die Caesar-Chiffre soll Euch nur ein frühzeitliches Beispiel für eine Geheimhaltungsstrategie geben.
Bitte die nachfolgende Routine nicht für den Echteinsatz nutzen, da sie aus kryptographischer Sicht sehr angreifbar ist !
Hier der komplette Quellcode:
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 |
package net.bplaced.javacrypto.symmetricencryption; /* * 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 181 x64 * Datum/Date (dd.mm.jjjj): 25.09.2018 * Funktion: einfache Demonstration der Caesar Chiffre * Function: simple demonstration of the Caesar Chiffre * * 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.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; public class B01_CaesarChiffre { public static void main(String[] args) throws UnsupportedEncodingException { System.out.println("B01 Caesar Chiffre"); // es werden ein paar variablen benötigt: String plaintextString = "HalloWelt0123456"; int caesarKeyInt = 3; // drei zeichen verschieben // verschlüsselung int cipherInt = 0; String ciphertextString = ""; int plaintextLengthInt = plaintextString.length(); byte[] plaintextByte = new byte[plaintextLengthInt]; plaintextByte = plaintextString.getBytes("UTF-8"); byte[] ciphertextByte = new byte[plaintextLengthInt]; for (int i = 0; i < plaintextLengthInt; i++) { cipherInt = plaintextByte[i]; cipherInt = cipherInt + caesarKeyInt; ciphertextByte[i] = (byte) cipherInt; } ciphertextString = new String(ciphertextByte, "UTF-8"); // der ciphertextString wird übermittelt // entschlüsselung int ciphertextLengthInt = ciphertextString.length(); byte[] ciphertextDecByte = new byte[ciphertextLengthInt]; ciphertextDecByte = ciphertextString.getBytes("UTF-8"); byte[] decryptedtextByte = new byte[ciphertextLengthInt]; for (int i = 0; i < ciphertextLengthInt; i++) { cipherInt = ciphertextDecByte[i]; cipherInt = cipherInt - caesarKeyInt; decryptedtextByte[i] = (byte) cipherInt; } String decryptedtextString = ""; // enthält den entschlüsselten text decryptedtextString = new String(decryptedtextByte, "UTF-8"); // ausgabe der variablen System.out.println("caesarKeyInt :" + caesarKeyInt); System.out.println("plaintextString :" + plaintextString); System.out.println("plaintextByte (hex) :" + DatatypeConverter.printHexBinary(plaintextByte)); System.out.println("= = = Verschlüsselung = = ="); System.out.println("ciphertextByte (hex) :" + DatatypeConverter.printHexBinary(ciphertextByte)); System.out.println("ciphertextString :" + ciphertextString); System.out.println("= = = Entschlüsselung = = ="); System.out.println("decryptedtextByte (hex):" + DatatypeConverter.printHexBinary(decryptedtextByte)); System.out.println("decryptedtextString :" + decryptedtextString); } } |
… und das Ergebnis aus der Konsole:
1 2 3 4 5 6 7 8 9 10 |
B01 Caesar Chiffre caesarKeyInt :3 plaintextString :HalloWelt0123456 plaintextByte (hex) :48616C6C6F57656C7430313233343536 = = = Verschlüsselung = = = ciphertextByte (hex) :4B646F6F725A686F7733343536373839 ciphertextString :KdoorZhow3456789 = = = Entschlüsselung = = = decryptedtextByte (hex):48616C6C6F57656C7430313233343536 decryptedtextString :HalloWelt0123456 |
Letzte Aktualisierung: 08.11.2018