/*
GartenzaunCrypt
copyright (C) Robert Nitsch, 2006
Dieses Programm verschlüsselt Text mit Hilfe der sogenannten Gartenzaunverschlüsselung.
Dies ist eine Transposition, bei der der Klartext Buchstabe für Buchstabe abwechselnd auf 2 Zeilen geschrieben
wird. Am Ende dienen die 2 Zeilen als Geheimtext.
Beispiel:
Der Text "Ich liebe dich" soll verschlüsselt werden. Also schreiben wir ihn wie oben beschrieben auf 2 Zeilen:
Zeile 1: Ihleedc
Zeile 2: c ib ih
Zu den verwendeten Funktionen/Methoden:
Zur Trennung der beiden Zeilen können eigene Trennzeichen definiert werden.
Zum Entschlüsseln der erstellten Geheimtexte wird eine weitere Funktion zur Verfügung gestellt.
*/
#include <iostream>
#include <string>
using namespace std;
// Debugmodus?
//#define debug
// Funktionen/Methoden deklarieren
string gartenzaunEncrypt(string klartext, string trennz=" | ");
string gartenzaunDecrypt(string geheimtext, string trennz=" | ");
void pause();
int main()
{
// Variablen
string klartext;
string geheimtext;
// Klartext eingeben
cout << "Geben Sie den zu verschlüsselnden Text ein: " << endl;
getline(cin, klartext);
cout << endl << endl;
// Geheimtext ausgeben
geheimtext = gartenzaunEncrypt(klartext);
cout << "Ergebnis: " << endl << geheimtext << endl;
cout << endl;
cout << "Entschlüsselt: " << endl << gartenzaunDecrypt(geheimtext) << endl;
// auf Eingabe warten
pause();
// programm beenden
return 0;
}
// Pause
void pause()
{
cin.get();
cin.get();
}
// Verschlüsseln
string gartenzaunEncrypt(string klartext, string trennz)
{
string teil1="", teil2="";
int len=klartext.length();
// Geheimtext erzeugen
for(int i=0; i<len; i++)
{
if(i % 2 == 0)
teil1 += klartext.at(i);
else
teil2 += klartext.at(i);
}
// zurückgeben
return teil1 + trennz + teil2;
}
// Entschlüsseln
string gartenzaunDecrypt(string geheimtext, string trennz)
{
string teil1, teil2;
string klartext="";
// die beiden teile müssen wiederhergestellt werden
string::size_type trennung=geheimtext.find(trennz, 0);
if(trennung != string::npos)
{
teil1 = geheimtext.substr(0, trennung);
teil2 = geheimtext.substr(trennung+trennz.length(), geheimtext.length());
// die beiden Zeilen müssen wieder auf eine geschrieben werden
int len=(geheimtext.length()-trennz.length()); // das trennzeichen zählt nicht zur länge dazu
for(int i=0; i<len; i++)
{
if(i % 2 == 0)
klartext = klartext + teil1.at(i / 2);
else
klartext = klartext + teil2.at(i / 2);
#ifdef debug
cout << i << "/" << len << ": " << klartext << endl;
pause();
#endif
}
}
else
{
cout << "Fehler: Trennzeichen wurde nicht gefunden!" << endl;
return geheimtext;
}
return klartext;
}