Die Crypt Klasse ist als Experiment für Policy Klassen im zusammenhang mit Template Template Parametern und iostreams entstanden.
Die Klasse ermöglicht es mit hilfe einer Policy Klasse Algorithmen zur Kodierung zu generieren und diese in einer einheitlichen Schnittstelle zu nutzen.
// Crypt.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include "Crypt.h"
#include "cryptpolicy.h"
#include <iostream>
#include <fstream>
#include <iterator>
using namespace std;
// Diese Funktion zeigt wie man Crypt mit Dateien anwenden kann.
void demoFileFile()
{
// 2 Dateien Öffnen
ifstream file("c:\\klartext.txt",ios::binary);
ofstream file2("c:\\verschluesselt.txt",ios::binary);
if(!file || !file2)
return;
// Organisiert einen Iterator um eine Datei
istreambuf_iterator<char> begin(file); // Iterator auf Anfangd er Datei setzen
istreambuf_iterator<char> end; // der Iterator liefert 0x0 wenn man am ende ist.
ostreambuf_iterator<char> out(file2); // Ausgabe Iterator anlegen
// Crypt erzeugen das direckt mit Dateien arbeiten kann
Crypt<CryptXOr,istreambuf_iterator<char>,ostreambuf_iterator<char> > c;
// Klartext setzen
c.set_source(begin,end);
// Schlüssel setzen
std::string key("TESTtest"); // Schlüssel
c.set_key(key.begin(),key.end()); // Setzen
c.crypt(out); // Verschlüsseln und gleichzeitig wegschreiben
}
void demoStringCout()
{ // Zeigt einfach nur den Einsatz eines Strings und die Ausgabe auf einem Cout
// direckt beim Crypten
std::string text;
ostream_iterator<char> coutiter(cout);
cout<<"Bitte geben Sie einen Klartext an\n";
getline(cin,text);
// CryptNthBit benötigt kein Passwort ;o)
Crypt<CryptNthBit,std::string::iterator,ostream_iterator<char> > c;
c.set_source(text.begin(),text.end());
c.crypt(coutiter);
}
void demoStringString()
{
std::string klartext("Hallo Welt");
std::string target;
// Cryptshift braucht auch kein Passwort
Crypt<CryptShift> c;
c.set_source(klartext.begin(),klartext.end());
size_t neededBytes = c.get_TargetSize();
target.reserve(neededBytes);
target.resize(neededBytes);
c.crypt(target.begin());
}
void demoConstStringString(const std::string & klartext,const std::string & key,string & target)
{
// Cryptshift braucht auch kein Passwort
Crypt<CryptXOr,
std::string::const_iterator,
std::string::iterator,
std::string::const_iterator> c;
c.set_source(klartext.begin(),klartext.end());
c.set_key(key.begin(),key.end());
size_t neededBytes = c.get_TargetSize();
target.reserve(neededBytes);
target.resize(neededBytes);
c.crypt(target.begin());
}
void demoCharChar()
{
const char klartext[] = "HalloWelt"; // 32 würde 0 ergeben -> sieht man nicht bei char da es das endezeichen ist.
// lässt man leerzeichen weg beim Demonstrieren ists einfacher zu sehen. In er praxis stört es nicht da man die größe hat.
char * target = NULL;
Crypt<CryptNthBit,const char*,char*,const char*> c;
c.set_source(klartext,klartext+sizeof(klartext)-1);
size_t size = c.get_TargetSize();
target = new char[size+1];
memset(target,'\0',size+1);
c.crypt(target);
delete[] target;
}
int main(int argc, char* argv[])
{
std::string target2;
std::string target;
demoFileFile();
demoStringCout();
demoStringString();
// Beweis das es geht: In target2 muß wieder Hallo Welt stehen
demoConstStringString("Hallo Welt","123",target);
demoConstStringString(target,"123",target2);
demoCharChar();
return 0;
}