///////////////////////////////////////////////////////////////////////////////////
// Datei	: CryptIt, compile with c++ cryptit_linux.cpp -o cryptit.cpp
// Beschreibung	. verschluesselung nach dem Vinerge-Verfahren
///////////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"

// Globale Funktionsprototypen ////////////////////////////////////////////////////
char	MoveForward(char cChar);
char	MoveBack(char cChar);
int		GetText(char *pcText);
int		Crypt(char *pcText, char *pcKey, char *pcCrypt);
int		Decrypt(char *pcCrypt, char *pcKey, char *pcText);

///////////////////////////////////////////////////////////////////////////////////
// Funktion		: void main(void)
// 
///////////////////////////////////////////////////////////////////////////////////

void main(void)
{
	char		cChar[64], cKey[64], cCrypt[64], buffer[64];
	int			iLength = 0, iKeyLength = 0, i = 0;

	cout << "Bitte Text eingeben (ohne Leerzeichen)!" << endl;
	cin >> cChar;

	
	cout << "Bitte Den Schluessel zum Text eingeben:" << endl;
	cin >> cKey;

	cout << "Textlaenge: " << strlen(cChar) << endl;
	cout << "Keylaenge:  " << strlen(cKey) << endl;

	cout << "Verschluesselung nach dem Vinerge-Verfahren wird durchgefuehrt..." << endl;

	if (Crypt(cChar, cKey, cCrypt))
	{
		cout << "Verschluesselter Text lautet: " << endl;
		for (i=0; i<strlen(cCrypt); i++)
			cout << cCrypt[i];
		cout << endl;
	}
	
	cout << "Entschluesselung wird durchgeführt... " << endl;
	if (Decrypt(cCrypt, cKey, cChar))
	{
		cout << "Entschluesselter Text lautet: " << endl;
		for (i=0; i<strlen(cChar); i++)
			cout << cChar[i];
	}

	cin >> i;	
}

///////////////////////////////////////////////////////////////////////////////////
// Funktion		: Crypt(char *pcText, char *pcKey, char *pcCrypt)
// Bechreibung	: Der per Parameter uebergebene Text wird mit dem Schluesel
//					nach dem Vinerge-Verfahren verschluesselt
// Parameter	
// pcText		: Zu verschluesselner Text
// pcKex		: Schluessel
// pcCrypt		: Verschluesselter Text, der per Parameter uebergeben wird
// Rueckgabe	: 1, wenn erfolgreich
///////////////////////////////////////////////////////////////////////////////////

int Crypt(char *pcText, char *pcKey, char *pcCrypt)
{
	int		i1, i2, i3, iText, iKey, iDiff=0, iVal, i=1;
	char	cChar;	 

	iText = strlen(pcText);
	iKey = strlen(pcKey);

	i2=0; i3=0;
	for (i1=0; i1<iText; i1++)
	{
		iVal = pcKey[i3];
		if (pcKey[i3]=='a')
			iDiff = 0;
		else
			iDiff = iVal - 97;
		pcCrypt[i1] = pcText[i1];
		for (i2=0; i2<iDiff; i2++)
			pcCrypt[i1] = MoveForward(pcCrypt[i1]);
		if (i3 == iKey)
			i3 = 0;
		else
			i3++;
		cout << iDiff << endl;
	}
	pcCrypt[iText] = '\0';

	return 1;
}

///////////////////////////////////////////////////////////////////////////////////
// Funktion		: Decrypt(char *pcCrypt, char *pcKey, char *pcText)
// Beschreibung	: Der verschluesselte Text wird mit dem Schluessel wieder 
//					in den Reintext umgewandelt
// Parameter
// pcCrypt		: Verschluesselte Text
// pcKey		: Schluesseltext zum Entschluesseln
// pcText		: Reintext, der per Parameter zurueckgegeben wird
// Rueckgabe	: 1, wenn erfolgreich
///////////////////////////////////////////////////////////////////////////////////

int Decrypt(char *pcCrypt, char *pcKey, char *pcText)
{
	int i1, i2, i3, iCrypt, iKey, iVal=0, iDiff;

	iCrypt = strlen(pcCrypt);
	iKey = strlen(pcKey);
	
	i2=0; i3=0;
	for (i1=0; i1<iCrypt; i1++)
	{
		iVal = pcKey[i3];
		if (pcKey[i3]=='a')
			iDiff = 0;
		else
			iDiff = iVal - 97;
		pcText[i1] = pcCrypt[i1];
		for (i2=0; i2<iDiff; i2++)
			pcText[i1] = MoveBack(pcText[i1]);

		if (i3==iKey)
			i3 = 0;
		else
			i3++;
	}
	pcText[iCrypt]='\0';
	return 1;
}

///////////////////////////////////////////////////////////////////////////////////
// Funktion		: MoveForward(char cChar)
// Beschreibung	: Der per Parameter übergebende Buchstabe wird um 1 nach rechts 
//					verschoben (a zu b)
// Parameter
// cChar		: Buchstabe, der verschoben werden soll
// Rueckgabe	: Der nach rechts verschobene Buchstabe
///////////////////////////////////////////////////////////////////////////////////

char MoveForward(char cChar)
{
	if (cChar == 'z')
		cChar = 'a';
	else
		cChar++;

	return cChar;
}

///////////////////////////////////////////////////////////////////////////////////
// Funktion		: MoveBack(char cChar)
// Beschreibung	: Der per Parameter übergebende Buchstabe wird um 1 nach links 
//					verschoben
// Parameter
// cChar		: Buchstabe, der nach links verschoben werden soll
// Rueckgabe	: Der nach links verschobene Buchstabe
///////////////////////////////////////////////////////////////////////////////////

char MoveBack(char cChar)
{
	if (cChar == 'a')
		cChar = 'z';
	else
		cChar--;

	return cChar;
}
