Kleines Programm zur chiffrierung von Dateien mit vigenere
-
Hallo Leute,
hier möchte ich ein kleines Programmchen veröffentlichen, was ich selber geschrieben habe.
Es kann nur Text-Dateien verschlüsseln.
zuerst
vigenere.h:// header vigenere.h von vigenere1f #ifndef VIGENERE_INC_ #define VIGENERE_INC_ 1 #include <stdio.h> #include <iostream> #include <string> #include <iomanip> // wegen setw #include <unistd.h> // wegen getcwd() #include <fcntl.h> /// Symbolische Konstanten fuer open #include <fstream> #include <sys/stat.h> // getFilesize, stat #include <stdlib.h> // malloc //int shift(char c); void clpuf(void); // Tastaturpuffer loeschen short getcharart(char letter); // stellt Laenge des Zeichens in Byte fest int atoint(char letter); // signed char in int std::string getstrchar(std::string mot, int pos); int getletterpos(std::string mot, std::string letter); int letterlaenge(std::string str); // Stellt die Laenge eines cpp-Strings in Buchstaben fest. string.lengtch() stellt die Laenge in Byte fest int getfistcharpos(std::string alf, int pos); unsigned int chartoint(unsigned char intteile[4]); // 4Byte-unsigned char array zu 4Byte int void clearchararray(char array[], int lge); // eindimensionales Array loeschen std::string getfilestring(std::fstream *datei, int *zeize); void ZeigeZeichen(int i, std::string char_letter, std::string letter_chiffriert, std::string letter_dechiffriert); class vigenere { public: vigenere(); ~vigenere(); //Menues void HAUPTMENUE(void); int MenueFrage(void); void GetKeyword(void); void GetPlaintext(void); void ShowVigenereTable(void); void SetzeTestVorgaben(void); void Buchstabenplatzliste(void); void BuchstabenplatzTest(void); void Rotiere_plaintext(void); void rotiere_Ur_abc(void); std::string vigens(std::string alf, int pos); std::string mkvigboard(std::string zeichen, int xpos); std::string get_xpos_Letter(std::string Ur_abc, int pos); int get_xLetter_pos(std::string Ur_abc, std::string gesucht); std::string RotiereUr_abc(std::string Ur_abc, int i, std::string *keychar); std::string chiffrieren(int i, std::string char_txt, int chiffreart); void ShowLaengentafel(void); void ShowKey(void); void ShowVarib(int i, int j, std::string teile); void ShowVari(int i, int j, std::string teile, std::string char_chiffriert); void getcurdir(void); void StringToChar(std::string wort, char satz[]); long getFilesize(const std::string& filename); int ReadValIn(std::string in_File_Name, int modus); void putfilestring(std::ofstream *datei, std::string tosend); //String-Variable std::string Ur_abc; std::string abc_rotiert = ""; std::string key = ""; // Schluesselwort std::string plaintext = ""; // zu schiffrierender Text std::string teilb = ""; std::string keychar = ""; // Buchstabe von Schluesselwort std::string srcfilename = ""; std::string tarfilename = ""; char dummy[400]; int klen; int kbulen; int txtlen; int txtbulen; int abclen; int Ur_abc_buchslen; int ypos; long srcdatlen; }; #endif
nun vigenere.cpp
// header vigenere.cpp of vigenere1f //vigenere::vigenere() //vigenere::~vigenere(){}; //std::string vigenere::vigens(std::string Ur_abc, int pos) //std::string getstrchar(std::string mot, int pos) //std::string vigenere::mkvigboard(std::string zeichen, int xpos) //int getfistcharpos(std::string alf, int pos) //void vigenere::getcurdir(void) //void vigenere::StringToChar(std::string wort, char satz[]) //long vigenere::getFilesize(const std::string& filename) //int vigenere::ReadValIn(std::string in_File_Name) #include "vigenere.h" vigenere::vigenere() { std::string Ur_abc_init = "abcdefghijklmnopqrstuvwxyzöäüß ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜ0123456789.,!?;:-+*~#'<>|²³€@/^°µ_§${}[]()´`\n"; // mit Newline-sign Ur_abc = Ur_abc_init; abclen = Ur_abc.length(); Ur_abc_buchslen = letterlaenge(Ur_abc); // Laenge Ur_abc in Buchstaben }; vigenere::~vigenere(){}; // schneidet aus cpp-string ab Position 0 bis einschliesslich pos // den Teilstring aus und stellt ihn ans Ende des cpp-Strings std::string vigenere::vigens(std::string Ur_abc, int pos) { int Ur_abc_bulen = 0, charpos = 0; std::string Buchstabe = ""; std::string teila = Ur_abc; std::string teilb = Ur_abc; Ur_abc_bulen = letterlaenge(Ur_abc); if ((pos > 0) && (pos < (Ur_abc_bulen - 1))) { Buchstabe = get_xpos_Letter(Ur_abc, pos); charpos = getletterpos(Ur_abc, Buchstabe); teila = Ur_abc.substr(0, charpos); // erster Teil von Zeichen 0 an bis einschliesslich pos zu teila kopieren teilb.erase (0, charpos); // Loesche von teilb der ersten Teil teilb += teila; // geloeschten ersten Teil an teilb anhaengen //std::cout << "pos=" << pos << " charpos = " << charpos << " Buchstabe=" << Buchstabe << " teila= " << teila << " teilb=" << teilb << std::endl; } else teilb = Ur_abc; return teilb; } // Gibt den Buchstaben an Position pos im String mot zurueck std::string getstrchar(std::string mot, int pos) { std::string rewer = ""; int lge, chlen = 0, firstcharpos = 0; lge = mot.length(); // Laenge von mot in Byte firstcharpos = getfistcharpos(mot, pos); // Position des ersten Bytes bei laengeren Zeichen chlen = getcharart(mot[firstcharpos]); // Laenge des Zeichens feststellen if(pos < lge) rewer = mot.substr(pos, chlen); return rewer; } // Dient zur Herstellung des rotierten Alphabets // vigens schneidet aus cpp-string(arg1) ab Position 0 bis pos // den Teilstring aus und stellt ihn ans Ende des cpp-Strings std::string vigenere::mkvigboard(std::string zeichen, int xpos) { int txtlen = 0; std::string teilc = ""; txtlen = zeichen.length(); // Laenge von zeichen in Byte feststellen // wenn xpos >= 1 dann xpos -1 bei vigens if ((xpos > 0) && (xpos < txtlen)) teilc = vigens(zeichen, xpos); // Nach xpos des Schluesselbuchstabens Originalalphabet rotieren else teilc = zeichen; return teilc; } int getfistcharpos(std::string alf, int pos) { int i, chlen = 0; chlen = getcharart(alf[pos]); if (chlen == 5)//(chlen > 1) for (i = pos; i >= 0; i--) { chlen = getcharart(alf[i]); if (chlen <= 4) { pos = i; break; } } //std::cout << std::endl; return pos; } void vigenere::getcurdir(void) { char curverz[400] = {0}; if (getcwd(curverz, sizeof(curverz)) == NULL) perror("getcwd() error"); else std::cout << "current DIR: " << curverz << std::endl; } // converts a cpp string to char void vigenere::StringToChar(std::string wort, char satz[]) { int slei, wolen; wolen = wort.length(); for (slei = 0; slei < wolen; slei++) { satz[slei] = wort[slei]; satz[slei +1] = '\0'; } } long vigenere::getFilesize(const std::string& filename) { struct stat st; if(stat(filename.c_str(), &st) != 0) { return 0; } return st.st_size; } int vigenere::ReadValIn(std::string in_File_Name, int modus) { int rewer = -1, i; long bulen = srcdatlen; std::fstream dat_ein; std::ofstream dat_aus; std::string char_letter = ""; std::string letter_chiffriert = ""; std::string letter_dechiffriert = ""; char chararray[8]; if((modus < 0) || (modus > 1)) modus = 0; std::cout << "Modus = " << modus << std::endl; dat_ein.open(in_File_Name, std::fstream::in | std::fstream::binary); if (!dat_ein) { std::cout << "Datei konnte nicht geoeffnet werden!" << std::endl; return rewer; } dat_aus.open(tarfilename.c_str(), std::ofstream::out | std::ofstream::binary); if (!dat_aus) { std::cout << "Ziel-Datei kann nicht erstellt werden!" << std::endl; return(rewer); } else std::cout << "Ziel- und Quelldatei wurden geoeffnet, lese Zeichen ein." << std::endl; bulen = 0; for (i = 0; i < srcdatlen; i++) { char_letter = getfilestring(&dat_ein, &i); // Zuerst UTF8-Zeichen von Quelldatei holen //In c-String-array konvertieren clearchararray(chararray, 8); StringToChar(letter_chiffriert, chararray); bulen++; // Zeichenzaehler letter_chiffriert = chiffrieren(i, char_letter, modus); //letter_dechiffriert = chiffrieren(i, letter_chiffriert, 1); //ZeigeZeichen(i, char_letter, letter_chiffriert, letter_dechiffriert); putfilestring(&dat_aus, letter_chiffriert); } dat_ein.close(); std::cout << std::endl << "Quelldatei wurde geschlossen." << std::endl; dat_aus.close(); std::cout << "Ziel-Datei wurde erstellt und gechlossen." << std::endl; rewer = 0; return rewer; }
jetzt varicng.cpp
// header varicng.cpp von vigenere1f //Inhalt varicng.cpp: //void clpuf(void) //int atoint(char letter) //unsigned int chartoint(unsigned char intteile[4]) //short getcharart(char letter) //int letterlaenge(std::string str) //std::string vigenere::get_xpos_Letter(std::string Ur_abc, int pos) //int getletterpos(std::string mot, std::string letter) //int vigenere::get_xLetter_pos(std::string Ur_abc, std::string gesucht) //void vigenere::ShowVari(int i, int j, std::string teile, std::string char_chiffriert) //void vigenere::ShowVarib(int i, int j, std::string teile) //void vigenere::ShowKey(void) //std::string vigenere::RotiereUr_abc(std::string Ur_abc, int i, std::string *keychar) //std::string vigenere::chiffrieren(int i, std::string char_txt, int chiffreart) //void clearchararray(char array[], int lge) //std::string getfilestring(std::fstream *datei, int *zeize) //void vigenere::putfilestring(std::ofstream *datei, std::string tosend) //void ZeigeZeichen(int i, std::string char_letter, std::string letter_chiffriert, std::string letter_dechiffriert) #include "vigenere.h" // loescht Tastaturpuffer void clpuf(void) { while (getc(stdin) != '\n') ; } //Umwandlung von signed char zu int int atoint(char letter) { int rewer; if ( letter < 0) rewer = letter + 256; else rewer = (int)letter; return rewer; } // Konvertiert ein 4Byte-langes unsigned_char_array in einen unsigned_int-Wert unsigned int chartoint(unsigned char intteile[4]) { union intpart{ unsigned int erge; unsigned char ipart[4]; } ipt; ipt.ipart[0] = intteile[0]; ipt.ipart[1] = intteile[1]; ipt.ipart[2] = intteile[2]; ipt.ipart[3] = intteile[3]; return ipt.erge; } // erkennt bei UTF 8 die Zeichenlaenge in Byte short getcharart(char letter) { short rewer = -1; int bu = atoint(letter); if (bu < 192) rewer = 1; // Dann liegt ein einzelnes Zeichen fuer einen Buchstaben vor if ((bu >= 192) && (bu < 224)) rewer = 2; // Erstes Markierunszeichen fuer 2 Byte pro Buchstaben if ((bu >= 224) && (bu < 240)) rewer = 3; // Erstes Markierunszeichen fuer 3 Byte pro Buchstaben if (bu >= 240)rewer = 4; // Erstes Markierunszeichen fuer 4 Byte pro Buchstaben if ((bu >=128) && (bu <= 191)) rewer = 5; // ist Folge-Byte von 2 bis 4 Byte pro Zeichen return rewer; } // Stellt die Laenge eines cpp-Strings in Buchstaben fest. string.length() stellt die Laenge in Byte fest int letterlaenge(std::string str) { std::string dummy = ""; int i, bu = 0, sl = 1, lge = -1, bulen = 0; lge = str.length(); bulen = lge; for (i = 0; i < lge; i++) { bu = str[i]; // Hole einzelnes Char aus str sl = getcharart(bu); // Bestimme Zeichenlaenge dummy = str.substr(i,sl); // Kopiere Zeichen in dummy if(sl > 1 ) i += (sl - 1); // Wenn Zeichen laenger als 1 char i += (Zeichenlaenge -1) bulen -= (sl - 1); // Von strlaenge (Zeichenlaenge -1) abziehen //std::cout << str.at(i) << " = " << int atoint(str.at(i)) << std::endl; //std::cout << "i: " << i << " bulen="<< bulen << " " << dummy << " = " << std::setw(3) << bu << " laenge: " << sl << " = " << atoint(bu) << std::endl; } //std::cout << "-----------\n"; return bulen; } // Holt aus einen cpp-String das Zeichen nach Buchstabennummer, nicht nach Byte-Nummer std::string vigenere::get_xpos_Letter(std::string Ur_abc, int pos) { int j, bulen = 0, chlen = 0, abclen = 0; std::string teilb = ""; abclen = Ur_abc.length(); for (j = 0; j < abclen; j++) { chlen = getcharart(Ur_abc[j]); // Bestimme Laenge des Zeichens von Ur_abc if(chlen <= 4) teilb = Ur_abc.substr(j, chlen); // Kopiere Ur_abc in teilb else teilb = ""; if((chlen < 5) && (bulen == pos)) break; if (chlen <= 4) bulen++; } return teilb; } //Sucht im String mot nach der Zeichenfolge letter und gibt bei Erfolg dessen Position zurück int getletterpos(std::string mot, std::string letter) { std::size_t found; int pos = -1; found = mot.find(letter); if (found!=std::string::npos) pos = found; return pos; } int vigenere::get_xLetter_pos(std::string Ur_abc, std::string gesucht) { int j, bulen = 0, chlen = 0, abclen = 0; std::string teilb = ""; abclen = Ur_abc.length(); // Byte-Laenge von Ur_abc for (j = 0; j < abclen; j++) { chlen = getcharart(Ur_abc[j]); // Bestimme Laenge des Zeichens von Ur_abc if(chlen <= 4) teilb = Ur_abc.substr(j, chlen); // Kopiere Ur_abc in teilb else teilb = ""; if (teilb.compare(gesucht) == 0) break; if (chlen <= 4) bulen++; } return bulen; } void vigenere::ShowVari(int i, int j, std::string teile, std::string char_chiffriert) { int keycharlen = 0, teilelen = 0; keycharlen = keychar.length(); teilelen = teile.length(); std::cout << " i=" << std::setw(2) << i << " j=" << std::setw(2) << j; std::cout << " keychar= "<< std::setw(keycharlen) << keychar << " chiffiert-teile: " << std::setw(teilelen) << teile; std::cout << " unchiffriert[i]="<< char_chiffriert << " text-ypos= " << std::setw(2)<< ypos; std::cout << " abc rotiert: " << abc_rotiert << std::endl; } void vigenere::ShowVarib(int i, int j, std::string teile) { int keycharlen = 0, teilelen = 0; keycharlen = keychar.length(); teilelen = teile.length(); std::cout << " i=" << std::setw(2) << i << " j=" << std::setw(2) << j; std::cout << " keychar= " << std::setw(keycharlen) << keychar << " chiffriert-teile: " << std::setw(teilelen) << teile; std::cout << " unchiffriert[i]="<< plaintext[j] << " text-ypos= " << std::setw(2)<< ypos; std::cout << " abc rotiert: " << abc_rotiert << std::endl; } void vigenere::ShowKey(void) { std::cout << "Schluessel......: " << key << std::endl; std::cout << "Schluessel-Laenge in Byte......: " << klen << std::endl; std::cout << "Schluessel-Laenge in Buchstaben: " << kbulen << std::endl<< std::endl; } std::string vigenere::RotiereUr_abc(std::string Ur_abc, int i, std::string *keychar) { int kchpos; std::string abc_rotiert; *keychar = get_xpos_Letter(key, i); // einzelnes Ur_abc aus Schluesselstring nach teilb holen kchpos= get_xLetter_pos(Ur_abc, *keychar); // Originalposition des SchluesselUr_abcs im Originalalphpabet feststellen abc_rotiert = mkvigboard(Ur_abc, kchpos); // Nach Schluesselbuchstabe Originalalphabet rotieren //std::cout << "kchpos: " << kchpos << std::endl; return abc_rotiert; } std::string vigenere::chiffrieren(int i, std::string char_txt, int chiffreart) { std::string letter_chiffriert = ""; if (chiffreart == 0) { abc_rotiert = RotiereUr_abc(Ur_abc, i, &keychar); // Herstellung des rotierten Alphabets ypos = get_xLetter_pos(Ur_abc, char_txt); // Sucht in Ur_abc nach char_txt und gibt bei Erfolg dessen Position zurück letter_chiffriert = get_xpos_Letter(abc_rotiert, ypos); // hole einzelnes Ur_abc von rotierten Alphabet } else { abc_rotiert = RotiereUr_abc(Ur_abc, i, &keychar); // Herstellung des rotierten Alphabets ypos = get_xLetter_pos(abc_rotiert, char_txt); // Sucht in abc_rotiert nach char_chiffriert und gibt bei Erfolg dessen Position zurück letter_chiffriert = get_xpos_Letter(Ur_abc, ypos); } return letter_chiffriert; } void clearchararray(char array[], int lge) { for (int i = 0; i < lge; i++) array[i] = 0; } std::string getfilestring(std::fstream *datei, int *zeize) { int i, chlen = 0, j; char buchs; std::string erge = ""; j = *zeize; datei->get(buchs); chlen = getcharart(buchs); erge += buchs; for (i = 1; i < chlen; i++) { datei->get(buchs); erge += buchs; j++; } *zeize = j; return erge; } void vigenere::putfilestring(std::ofstream *datei, std::string tosend) { char buchs; char arrayteile[8]; int i, tosend_lge = 0; tosend_lge = tosend.length(); // Laenge von cpp-String tosend in Byte clearchararray(arrayteile, 8); StringToChar(tosend, arrayteile); for (i = 0; i < tosend_lge; i++) datei->put(arrayteile[i]); } void ZeigeZeichen(int i, std::string char_letter, std::string letter_chiffriert, std::string letter_dechiffriert) { std::cout << "i=" << std::setw(3) << i << " unchiffriert=" << char_letter << " chiffriert=" << letter_chiffriert; std::cout << " dechiffriert=" << letter_dechiffriert << std::endl; //std::cout << " uisign=" << std::setw(3) << uisign << " letter=" << char_letter << " chlen=" << chlen << std::endl; //std::cout << " bulen=" << bulen << std::endl; }
nun menues.cpp
// Datei menues.cpp von viegener1f #include "vigenere.h" //Inhalt menues.cpp: //void vigenere::HAUPTMENUE(void) //int vigenere::MenueFrage(void) //void vigenere::GetKeyword(void) //void vigenere::GetPlaintext(void) //void vigenere::rotiere_Ur_abc(void) //void vigenere::ShowVigenereTable(void) //void vigenere::SetzeTestVorgaben(void) //void vigenere::Buchstabenplatzliste(void) //void vigenere::BuchstabenplatzTest(void) //void vigenere::ShowLaengentafel(void) //void vigenere::Rotiere_plaintext(void) void vigenere::HAUPTMENUE(void) { std::cout << std::endl << "Vigenere Versuch" << std::endl; std::cout << "Programmende..............0" << std::endl; std::cout << "Schluesseleingabe.........1" << std::endl; std::cout << "Texteingabe...............2" << std::endl; std::cout << "rotiere Ur-Alphabet.......3" << std::endl; std::cout << "Texteingabe rotieren......4" << std::endl; //5 std::cout << "Ur_abc chiffrieren........5" << std::endl; //4 std::cout << "Ur_abc dechiffrieren......6" << std::endl; std::cout << "Zeige vignere-Tafel.......7" << std::endl; std::cout << "Vorgabe fuer Test.........8" << std::endl; std::cout << "Dateitest................11" << std::endl; } int vigenere::MenueFrage(void) { int frage = 18, i; std::string wastun = ""; std::string erge[16] = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10","11","12","13","14","15"}; std::cout << std::endl << "Ihre Wahl: "; std::cin >> wastun; // frage for (i = 0; i < 16; i++) { if (wastun.compare(erge[i]) == 0) { frage = i; break; } } clpuf(); return frage; } void vigenere::GetKeyword(void) { int j; std::cout << "Eingabe des Schluessels: "; std::cin >> key; clpuf(); klen = key.length(); kbulen = letterlaenge(key); std::cout << "Schluessel-Laenge in Byte......: " << klen << std::endl; std::cout << "Schluessel-Laenge in Buchstaben: " << kbulen << std::endl<< std::endl; //Stellt die Position des Ur_abcs Nr. srcpos vom String source im String alphabet fest und gibt diese zurueck for (j = 0; j < kbulen; j++) { keychar = get_xpos_Letter(key, j); // einzelnes Ur_abc aus Schluesselstring nach teilb holen std::cout << " j=" << std::setw(2) << j << " substr= " << keychar << std::endl; } } void vigenere::GetPlaintext(void) { std::cout << "Eingabe von plaintext: "; std::getline (std::cin, plaintext); txtlen = plaintext.length(); txtbulen = letterlaenge(plaintext); std::cout << "plaintext war.................: " << plaintext << std::endl; std::cout << "Laenge plaintext in Byte......: "<< txtlen << std::endl; std::cout << "plaintext Laenge in Buchstaben: " << txtbulen << std::endl; } void vigenere::rotiere_Ur_abc(void) { int xpos = 0; std::string teilb = ""; std::cout << "rotiere Ur-Alphabet" << std::endl; // plaintext Position von Teilstring aendern std::cout << std::endl << Ur_abc << std::endl; ShowLaengentafel(); abclen = Ur_abc.length(); std::cout << "Laenge des Ur_abc in byte......: " << abclen << std::endl; std::cout << "Laenge des Ur_abc in Buchstaben: " << letterlaenge(Ur_abc) << std::endl; std::cout << "\nUr_abc vorher: " << Ur_abc << std::endl; std::cout << "bis pos: "; std::cin >> xpos; std::cout << "Eingabe pos: " << xpos << std::endl; if ((xpos >= 0) && (xpos < abclen)) teilb = vigens(Ur_abc, xpos); std::cout << "rotiertes abc: " << teilb << std::endl; } void vigenere::ShowVigenereTable(void) { int i = 0; std::string teilc = ""; std::string keychar = ""; std::cout << "Zeige Vignere-Tafel" << std::endl; ShowKey(); klen = letterlaenge(key); for (i = 0; i < klen; i++) { teilc = RotiereUr_abc(Ur_abc, i, &keychar); std::cout << "teilc= " << teilc << std::endl; } } void vigenere::SetzeTestVorgaben(void) { std::cout << "Setze Vorgaben fuer Test" << std::endl; key = "asälk"; klen = key.length(); kbulen = letterlaenge(key); plaintext = "abcdefghijklmnop"; txtlen = plaintext.length(); txtbulen = letterlaenge(plaintext); ShowKey(); std::cout << "plaintext.....................: " << plaintext << std::endl; std::cout << "plaintext Laenge in Byte......: " << txtlen << std::endl; std::cout << "plaintext Laenge in Buchstaben: " << txtbulen << std::endl; } void vigenere::Buchstabenplatzliste(void) { int j,bulen = 0, chlen; std::string teilb; std::cout << "Buchstabenplatz-Liste" << std::endl; std::cout << std::endl << Ur_abc << std::endl; ShowLaengentafel(); abclen = Ur_abc.length(); std::cout << "Laenge des Ur_abc in byte......: " << abclen << std::endl; std::cout << "Laenge des Ur_abc in Buchstaben: " << letterlaenge(Ur_abc) << std::endl; bulen = 0; for (j = 0; j < abclen; j++) { chlen = getcharart(Ur_abc[j]); // Bestimme Laenge des Zeichens von Ur_abc if(chlen <= 4) teilb = Ur_abc.substr(j, chlen); // Kopiere Ur_abc in teilb else teilb = ""; std::cout << "Ur_abc[" << std::setw(2) << j << "]=" << " bulen=" << std::setw(2) << bulen << " "<< Ur_abc[j]; std::cout << " dec=" << std::setw(3) << atoint(Ur_abc[j]); std::cout << " Ur_abc[" << std::setw(2)<< bulen << "]=" << teilb << " chlen=" << chlen << std::endl; if (chlen <= 4) bulen++; } } void vigenere::BuchstabenplatzTest(void) { int j, abclen, Ur_abc_buchslen, xpos = 0; std::string teilb = ""; std::string dummy = ""; std::cout << "Buchstabenplatz-Test" << std::endl; std::cout << std::endl << Ur_abc << std::endl; ShowLaengentafel(); abclen = Ur_abc.length(); Ur_abc_buchslen = letterlaenge(Ur_abc); std::cout << "Laenge des Ur_abc in byte......: " << abclen << std::endl; std::cout << "Laenge des Ur_abc in Buchstaben: " << Ur_abc_buchslen << std::endl; for (j = 0; j < Ur_abc_buchslen; j++) { teilb = get_xpos_Letter(Ur_abc, j); std::cout << " Ur_abc[" << std::setw(2)<< j << "]=" << teilb << std::endl; } std::cout << "Suche Buchstabe: "; std::cin >> dummy; xpos = get_xLetter_pos(Ur_abc, dummy); std::cout << "an Position: " << xpos << std::endl; } // Gets plaintext from user void vigenere::ShowLaengentafel(void) { std::cout << "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345" << std::endl; std::cout << " | | | | | | | | | |" << std::endl; } void vigenere::Rotiere_plaintext(void) { int xpos; std::cout << "Rotiere eingegebenen Text: "; std::cout << "Codiert vorher: " << plaintext << std::endl; std::cout << "Laenge eingegebener Text: " << txtlen << std::endl; std::cout << "bis pos: "; std::cin >> xpos; teilb = vigens(plaintext, xpos); std::cout << "eingegebener Text neu...: " << teilb << std::endl; }
nun main.cpp
// main.cpp von vigenere1f // Bei der Herstellung des rotierten ABC muss noch korrigiert werden, da Umlaute doppelt // in der Vigenere-Tafel dargestellt werden #include "vigenere.h" int main(int argc, char *argv[]) { vigenere vig; //std::string Ur_abc = "abcdefghijklmnopqrstuvwxyzöäüß ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜ0123456789.,!?;:-+*~#'<>|²³€@/^°µ_§${}[]()´`"; //std::string Ur_abc = "abcdefghijklmnopqrstuvwxyzöäüß ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜ0123456789"; std::string letter_chiffriert = ""; std::string chiffriert = ""; std::string dechiffriert = ""; std::string char_letter = ""; std::string char_txt = ""; int frage = 18, i, j, chiflen = 0, modus = 0; int lgechiffriert = 0; do switch(frage) { default: vig.HAUPTMENUE(); frage = vig.MenueFrage(); break; case 0: //free(lesespeicher); std::cout << "Programmende" << std::endl; return 0; break; case 1: vig.GetKeyword(); frage = 18; break; case 2: vig.GetPlaintext(); // Gets plaintext from user frage = 18; break; case 3: vig.rotiere_Ur_abc(); frage = 18; break; case 4: vig.Rotiere_plaintext(); frage = 18; break; case 5: // Ausgabe von plaintext in Buchstaben std::cout << std::endl << "Chiffrieren-Test: " << std::endl; vig.ShowKey(); std::cout << "plaintext......................: " << vig.plaintext << std::endl; std::cout << "Laenge plaintext in Byte.......: "<< vig.txtlen << std::endl; std::cout << "plaintext Laenge in Buchstaben.: " << vig.txtbulen << std::endl; std::cout << "Laenge des Ur_abc in byte......: " << vig.abclen << std::endl; std::cout << "Laenge des Ur_abc in Buchstaben: " << vig.Ur_abc_buchslen << std::endl; i = 0; for (j = 0; j < vig.txtbulen; j++) { char_letter = vig.get_xpos_Letter(vig.plaintext, j); // Aus String plaintext einen Buchstaben holen letter_chiffriert = vig.chiffrieren(i, char_letter, 0); chiffriert += letter_chiffriert; vig.ShowVarib(i, j, letter_chiffriert); i++; if (i >= vig.kbulen) i = 0; } std::cout << "Text chiffriert: " << chiffriert << std::endl << std::endl; frage = 18; break; case 6: // Ausgabe von plaintext in Buchstaben std::cout << "Dechiffrieren Test.............: " << std::endl; vig.ShowKey(); std::cout << "Text chiffriert................: " << chiffriert << std::endl; chiflen = chiffriert.length(); lgechiffriert = letterlaenge(chiffriert); // Laenge von String chiffriert in Buchstaben std::cout << "chiffriert laenge in Byte......: " << chiflen << std::endl; std::cout << "chiffriert laenge in Buchstaben: " << lgechiffriert << std::endl; i = 0; for (j = 0; j < lgechiffriert; j++) { char_letter = vig.get_xpos_Letter(chiffriert, j); // Aus String chiffriert einen Buchstaben holen letter_chiffriert = vig.chiffrieren(i, char_letter, 1); dechiffriert += letter_chiffriert; vig.ShowVari(i, j, letter_chiffriert, char_letter); i++; if (i >= vig.kbulen) i = 0; } std::cout << "Text dechiffriert: " << dechiffriert << std::endl << std::endl; frage = 18; break; case 7: vig.ShowVigenereTable(); frage = 18; break; case 8: vig.SetzeTestVorgaben(); frage = 18; break; case 9: vig.Buchstabenplatzliste(); frage = 18; break; case 10: vig.BuchstabenplatzTest(); frage = 18; break; case 11: std::cout << "Dateitest" << std::endl; vig.getcurdir(); std::cout << "chiffrieren(0) oder dechiffrieren(1):"; modus = vig.MenueFrage(); vig.ShowKey(); vig.srcfilename = "test.txt"; std::cout << "Name der Quelldatei: "; std::cin >> vig.srcfilename; std::cout << "Name der Zieldatei.: "; std::cin >> vig.tarfilename; vig.StringToChar(vig.srcfilename, vig.dummy); std::cout << "Eingabe: " << vig.dummy << std::endl; if( access(vig.dummy, F_OK ) != -1 ) { std::cout << "Datei mit Namen\n" << vig.dummy << "\nwurde gefunden " << std::endl; // file exists vig.srcdatlen = vig.getFilesize(vig.srcfilename); std::cout << "Dateilaenge betraegt :" << vig.srcdatlen << " Byte" << std::endl; vig.ReadValIn(vig.srcfilename, modus); } else { std::cout << "Datei nicht gefunden" << std::endl; // file doesn't exist } frage = 18; break; }while(frage != 0); std::cout << "End of Program" << std::endl; return 0; }
Nach dem Start bitte immer zuerst das Schlüsselwort eingeben.
Danach mit menue-Punkt 11 mal testweise eine TEXT-DATEI verschlüsseln.
Ursprünglich hatte ich mal wissen wollen, wie man es anstellt, das man mit UTF8
auch deutsche Umlaute in eine vigenere-Tafel packen kann. Rest siehe Quellcode.
Das kleine Programmchen wurde mit der Zeit immer größer.
Erstellt mit codelite auf SUSE LINUX tumbleweed mit gcc.
Zum experimentieren, ausprobieren, testen usw.
Da ich zusätzlich zu meinen von Arbeitsunfällen lädierten Händen(Kreissäge, Staphylococcen)
auch noch Handgelenks und Fingergelenksarthrose habe, die Veröffentlichung,bevor ich es nicht mehr kann!Viel Spaß wünscht rustyoldguy
-
Schau' mal nach was eine Gott-Klasse ist (God Class). Auch SRP (Single Responsibility Principle). Es ist sicher nicht Aufgabe eines Verschlüsselungsalgos ein Menü anzuzeigen und ähnliches.
@rustyoldguy sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
char chararray[8];
... tolle Variablennamen teilweise ^^
Ich freu' mich auf Version 2.
-
Und in C++ braucht man kein void in der Parameterliste, wenn man keinen Parameter übergeben möchte.
Du übergibst std::string immer als Kopie. Kann natürlich gewillt sein, aber bei Positions oder Längenbrechnungen sollte eine const reference reichen.
Außerdem, in C++ deklariert man Variablen normalerweise erst da, wo man sie wirklich braucht. (Zum Beispiel Zählvariablen im Schleifenkopf)
-
@rustyoldguy sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
unsigned int chartoint(unsigned char intteile[4])
{
union intpart{
unsigned int erge;
unsigned char ipart[4];
} ipt;ipt.ipart[0] = intteile[0];
ipt.ipart[1] = intteile[1];
ipt.ipart[2] = intteile[2];
ipt.ipart[3] = intteile[3];return ipt.erge;
}könnte auch so aussehen:
unsigned int chartoint (unsigned char intteile[4]) { return *(unsigned int*)intteile; }
ist zwar auch nicht portabel, so wie deine funktion, aber auf x86 funktionierts.
um die endianess umzudrehen nehme htonl() aus der socket library.
-
@rustyoldguy Warum schreibst Du einen leeren Destruktor hin? Weißt Du welche konsequenzen das hat? Was bringt es an Mehrwert?
@rustyoldguy sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
//Umwandlung von signed char zu int int atoint(char letter) { int rewer; if ( letter < 0) rewer = letter + 256; else rewer = (int)letter; return rewer; }
Sorry, aber wth?
char /* signed | unsigned */ ch = -42; int value = static_cast<char unsigned>(ch);
fertig.
-
Dieser Beitrag wurde gelöscht!
-
Wow! Ist das ernst gemeinter Code oder ein maximal kompaktes Beispiel sämtlicher Coding-styles die es gibt!?
upper camel case, lower camel case, komplett in gross, mit '_' als Trenner (Frage: hat das eigentlich einen Namen?) mit folgendem Buchstaben mal gross, mal klein, englisch, deutsch-englisch-gemischt.
-
@rustyoldguy sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
void clearchararray(char array[], int lge)
{
for (int i = 0; i < lge; i++)
array[i] = 0;
}gibt es schon: http://www.cplusplus.com/reference/cstring/memset/
-
@Jockelx sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
mit '_' als Trenner (Frage: hat das eigentlich einen Namen?)
-
@Bashar Dankeschön
-
@Bashar sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
Snake Case
hat aber kein python-programmierer erfunden.
-
@rustyoldguy sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
for (i = 0; i < 16; i++) { if (wastun.compare(erge[i]) == 0) { frage = i; break; } }
Echt?
std::find()
!?
Aber warum überhaupt Zahlen als Text!?!?Und so könnte man bei dem Code ewig weitermachen. Bringt halt nix.
-
@Schlangenmensch sagte in Kleines Programm zur chiffrierung von Dateien mit vigenere:
Du übergibst std::string immer als Kopie. Kann natürlich gewillt sein, aber bei Positions oder Längenbrechnungen sollte eine const reference reichen.
Und wenn der C++ Standard dafür reicht (C++17 IIRC), dann könnte man auch gleich eine
std::string_view
nehmen.
-
void clearchararray(char array[], int lge)
lge
kurz für Länge? Bitte beschränk dich auf (in der Softwareentwicklung) übliche Abkürzungen oder gleich noch besser: kauf die eine Familienpackung Nachfüllbuchstaben für deinen Computer damit du nicht so sparen musst.Und Englisch für Funktionen/Variablennamen schadet auch nicht.