/*
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;
}