» Verschlüsselung von Text-Dateien mit vigenere-Tafel

Stringmanipulation vor Konvertierung zu einer Zahl!Neuen Thread eröffnenNeue Antwort erstellenKleines Tool um eine Datei als Statistik zu zeigen!
AutorNachricht
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
26.02.2020, 19:32
zitieren

Hallo Leute!

Hier mal ein kleines Beispiel, wie man TEXT-Dateien nach dem Prinzip von Vigenere verschlüsselt.

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

nun varicng.cpp:


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

jetzt 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;
}
 

Beim arbeiten immer zuerst das Schlüsselwort eingeben unter Menupunkt 1. Schluckt deutsche Umlaute und Leerzeichen. Danach unter Menupunkt 11 zuerst eingeben ob man chiffrieren oder
dechiffrieren will. Danach zuerst den Namen der Quelldatei, danach den Namen der Zieldatei.

Dieses Programm will ich als Lehrmaterial veröffentlichen. Wenn man mit UTF8 arbeitet, sollte
man sich vor Augen halten, das Umlaute und andere Zeichen mit mehr als 1 Byte Länge
abgespeichert werden. Ebenso wie man aus einem cpp-String dessen Länge in Buchstaben
Zeichen holt, nicht in Byte !
Dazu nach Eingabe des Schlüssels bei Punkt 1 unter Punkt 7 die Vigenere-Tafel anschauen.

Viel Spaß wünscht
Guiseppe

Noch eins:

No Warranty


pn
Gast 
26.02.2020, 19:32
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Verschlüsselung von Text-Dateien mit vigenere-Tafel" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Kann man mds-dateien zu iso-dateien umwandeln?
hallo. wollte mal fragen, ob es ein programm gibt um mds-image-dateien zu normalen iso-dateien umzuwandeln. so daß man sie normal als image brennen kann? in deutsch wäre ideal....
von blue devel
11
13.711
04.11.2008, 12:05
214
Saisonkennzeichen auf 46er Tafel
N Abend.. Fogender Sachverhalt. Hab momentan nen Saisonkennzeichen in Standartgröße von 52cm dran,Buchstaben/Zahlenkombi: XX-XX XX plus eben den Saisonzeitraum hintendran, das ganze in FE-Mittelschrift. das einzige noch kürzere zugelasssene Maß für...
von Matze 78
5
1.060
02.02.2011, 13:09
Matze 78
fun text!
Lieber Gatte, ich schreibe Dir diesen Brief, um Dir mitzuteilen, dass ich Dich jetzt endgültig verlasse. Ich war Dir sieben Jahre lang eine gute Frau und habe nie etwas davon gehabt. Die letzten zwei Wochen waren die Hölle. Heute hat mich nun...
von Kolbenring
7
662
19.10.2005, 18:18
CiViCmatze
HONDA TEXT!!
HONDA=hubraum,optimalepower,nitroeinspritzung ,dachspoiler,autobahn Seid neuestem muss ich immer das Licht in der Garage über Nacht anlassen, weil die Garage sonst Angst vor meinem scharfem Honda hat! LOL Bei Regen, Schnee und solchem...
von HoNdAGiRlY
10
442
27.09.2008, 21:04
antiGTI
Lizenz-Text ändern
Hallo! Ich möchte gern den Lizenzeinleitungstext im Footer der Wiki-Seite ändern. "Inhalt ist verfügbar unter der" In welcher Datei steht dieser...
von moosmutzel
2
115
25.10.2012, 08:10
moosmutzel
TITL & Text my Market
Text to Call-Feature von Text My Market (TITL) kommt auf den...
von SabMeier
9
36
27.04.2011, 10:16
SabMeier
HTML Befehle als Text ausgeben
Hallo, ich würde gern in meinen Wiki HTML, CSS Tags einbauen, welche dann direkt ausgegeben werden. Zum Beispiel soll das Wiki <br> anzeigen oder halt<p>. Das Wiki zeigt es aber nicht, sondern verarbeitet es natürlich gleich. Ich habe schon...
von pahiti78
2
163
23.05.2014, 12:37
pahiti78
Frontschürze gesucht (Bild im Text)
Hallo Suche eine Schürze für den Honda Accord CN1 die ca. so aussieht. würde mich freuen wenn jemand weis wo ich so eine...
von DjnightStorm
0
496
15.05.2010, 15:49
DjnightStorm
Bild als Hintergrund vor einem Text
Hallo, unser neues Corporate Design sieht vor, Texte künftig in einem farbigen Rechteck mit abgeschrägter Ecke zu platzieren. Für meine Wiki-Startseite würde ich das daher gerne umsetzen. Bisher nahm ich Tabellen mit farbigen Zellhintergründen. Jetzt...
von KabaSBL
2
108
15.04.2015, 06:17
KabaSBL
Frage zu Eintragungs-Text von FAHRWERK
Dies ist der Satz der nach der TÜV Abnahme in mein Fahrzeugbrief kommt, wie tief kann ich somit mit dem Fahrwerk gehen? Ich steige nicht ganz durch die ganzen Zahlen durch. ...
von Blaxter
8
257
04.05.2011, 21:18
Black-Undercover
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |