Chiffrierung



  • @uluru
    Deinem Code nach zu urteilen, meinste etwa sowas ? Ansonsten ***nixverschtäh***

    int len, x;
    char c;
    AnsiString str;
    
    str="Hallo dies ist ein Vertauschtest";
    
    len=str.Length();
    for(x=1; x<=len; x++)
    {	c=str[x];
    	if(c=='z')
    		c='a';
    	else if(c=='Z')
    		c='A';
    	else
    		c+=1;
    	str[x]=c;
    }
    


  • int iLength = Edit1->Text.Length();
    char* cText = new char[iLength + 1];
    strcpy(cText, Edit1->Text.c_str());
    for (int i = 0; i < iLength; i++)
    {
    	if (cText[i] >= 'a' && cText[i] <  'z')
    		cText[i]++;
    	if (cText[i] == 'z')
    		cText[i] = 'a';
    }
    Edit1->Text = AnsiString(cText);
    delete[] cText;
    

    Du mußt natürlich noch überprüfen, ob 'Z' oder '9', und die ganze 'Sonderzeichenbehandlung' (äöüß...)

    EDIT: Hatte das delete vergessen. Und hab' noch eine Beschränkung auf die Kleinbuchstaben eingebaut...



  • Sieh dir mal die Vigenere-Chiffrierung an, evtl suchst du ja das?? (oh Gott wurde der Name so geschrieben?)



  • junix:
    😃

    uluru:
    Einzelne Zeichen eines Strings sind vom Typ char, intern werden sie jedoch als Integer repräsentiert. Festgelegt ist der Wert jedes Zeichens in der sogenannten ASCII-Tabelle.
    Um jetzt z.B. aus einem 'a' (ASCII 97) ein 'b' (ASCII 98) zu machen reicht es aus, 1 zu 'a' zu addieren.

    Ich hoffe, du hast jetzt einen Ansatz. Eigentlich hätte dir das Prinzip beim Studium der besagten ROT13-Beispiele selbst klarwerden sollen.



  • Erstmal ein großes "Danke" an euch alle, die mir helfen wollen, doch leider hab ichs immer noch nicht hingekriegt.

    Dierser Code Funktioniert nicht, weil aus dem String "abcdefghijklmnopqrstuvwxyz" nicht "bcdefghijklmnopqrstuvwxyza" sondern "bcdefghijklmnopqrstuvwxyaa" wird.

    int iLength = Edit1->Text.Length(); 
    char* cText = new char[iLength + 1]; 
    strcpy(cText, Edit1->Text.c_str()); 
    for (int i = 0; i < iLength; i++) 
    { 
        if (cText[i] >= 'a' && cText[i] <  'z') 
            cText[i]++; 
        if (cText[i] == 'z') 
            cText[i] = 'a'; 
    } 
    Edit1->Text = AnsiString(cText); 
    delete[] cText;
    

    Die erklärung von Jansen war da schon eine kleine Hilfe, um zu durschauen, wie das mit ASCII funktioniert.
    Naja, dann hab ich selber wieder was versucht, was aber auch nicht gefunzt hat:

    if (Edit1->Text == 'a')
    {Edit1->Text = 'z')
    

    Nur um klar zu stellen, was ich eigentlich machen will, da das hier einige missverstanden haben denke ich. Also, ich möchte ein Programm schreiben, wo verschiedene Zeichen innerhalb eines Strings durch andere ersetzt werden.
    Als Beispiel habe ich eine ganz einfache Methode hier angeführt, um diese später dann weiterzuentwickeln.
    Ich denke, dass das was Jansen agerissen hat, vielleicht eine große Rolle dabei spielen könnte.

    Wenn man die Zeichen nicht so vertauschen kann, dass man Beispielsweise so etwas in der Art schreibt wie:
    "Ersetze in dem String alle 'a' durch 'z' und alle 'z' durch 'a'".
    Dann denke ich dass es möglich ist, etwas wie folgt zu schreiben:
    "Alle 'a' aus dem String +25 und alle 'z' -25)

    Dadurch wäre es dann auch möglich eine Chiffrierung ohne "wirkliche Logik" zu machen, also wild durcheinander gewurschtelt (Z.B a->c & c->a t->l & l->t x->y & y->x)

    Hier jedoch würde erstmal ein einfaches Beispiel weiterhelfen.
    z.B.Wie ich aus allen 'z' innerhalb eines Strings 'a' machen könnte.
    Beispiel:
    "hallo hier ist ein zirkus" würde dann zu "hzllo hier ist ein airkus" werden.
    Und wenn man das alles in Button1 hineinschreibt und als String Edit1 verwendet und wie hier logisch tauchen lässt, würde beim zweiten drücken auf den Button wieder der Ursprung entstehen (dechiffrieren) "hallo hier ist ein zirkus".

    Vielleicht kann mir jetzt jemand weiterhelfen 🙂 😕 ?



  • Hallo,

    wie Du schon gemerkt hast, ist ein Fehler in meinem Beispiel. Finde doch mal heraus warum da am Ende '...yaa' steht.

    Zu der 'Chiffrierung'. Sobald Du damit mehr als ein paar Worte 'codierst', wird das knacken nicht mehr als ein paar Sekunken dauern. Da Du vorhast immer nur Buchstabenpaare zu tauschen, wird das schon durch die statistische Auswertung der Häufigkeit der vorkommenden Zeichen möglich. Grundsätzlich komprimiert man die Daten vor der Verschlüsselung um die Entropie zu erhöhen. Dann erst verschlüsselt man die Daten. Dazu gibt's sogar Freewarekomponenten die das können. Das ist auf jeden Fall sicherer, als das was Du vorhast. Wirklich unknackbare Verschlüsslungsmethoden gibt es m.E. sowieso nicht (von einem unpraktikablen Einmalcode abgesehen).



  • wie wär's damit, so mal als grober Anhaltspunkt:

    int feld[256];
    
    for ( int i=0; i < 256; i++)
      feld[i]=0;
    
    feld['a']='b';
    feld['b']='a';
    feld['c']='z';
    feld['z']='d';
    feld['d']='c';
    
    usw.....
    
    String Ausgang = Edit1->Text;
    
    for ( int i=1;i<=Ausgang.Length(); i++)
       Ausgang[i]=feld[Ausfang[i]];
    
    Edit2->Text=Ausgang;
    


  • @ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin. Und meine Chiffrierung soll ja auch nicht "unknackbar" sein. Julius Caesar hat es zu seiner Zeit sogar als völlig ausreichend gefunden einfach nur alle Buchstaben des Alphabets drei stellen nach rechts zu verschieben (Cäsar-Chiffrierung). In deinem Code, finde ich aber den Fehler nicht.

    int iLength = Edit1->Text.Length();
    char* cText = new char[iLength + 1];
    strcpy(cText, Edit1->Text.c_str());
    for (int i = 0; i < iLength; i++)
    {
        if (cText[i] >= 'a' && cText[i] <  'y') // hier wird gesagt: Wenn der Wert
     //größer oder gleich 'a' und kleiner als 'z' 
            cText[i]++; // , soll der nächste Buchstabe gewählt werden
        if (cText[i] == 'z') und wenn der Buchstabe z ist
            cText[i] = 'a'; dann der Buchstabe durch a ersetzt werden.
    }
    Edit1->Text = AnsiString(cText);
    delete[] cText;
    

    Gut, man könnte unter den Zeilen von if noch Klammern setzen {}, aber das hilft nichts. 😞 Mit deinem Code kann ich ja auch nicht z.B. willkürlich vertauschen.
    Wenn ich ne Liste davon anlege funztes auch nicht

    if (cText[i] == 'a') 
        {    cText[i] = 'b'; }
    ...
    if (cText[i] == 'z') 
        {    cText[i] = 'a'; }
    

    Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte. 🙄



  • Der Fehler ist eigentlich recht dumm...

    Nimm nur mal den relevanten Teil: 'yz'

    if (cText[i] >= 'a' && cText[i] <  'z')
       cText[i]++; // hier wird aus dem 'y' ein 'z' gemacht
    if (cText[i] == 'z')  // hier wird aus dem gerade erzeugten 'z' fälschlicherweise ein 'a' gemacht
        cText[i] = 'a';
    

    Mögliche Lösungen:

    if (cText[i] >= 'a' && cText[i] <=  'z')
       cText[i]++; 
    if (cText[i] == 'z' + 1)
        cText[i] = 'a';
    

    oder:

    int iLength = Edit1->Text.Length();
    char* cText = new char[iLength + 1];
    bool bHandled;
    strcpy(cText, Edit1->Text.c_str());
    for (int i = 0; i < iLength; i++)
    {
        bHandled = false;
        if (cText[i] >= 'a' && cText[i] <  'z') // hier wird gesagt: Wenn der Wert
     //größer oder gleich 'a' und kleiner als 'z' 
        {
            cText[i]++;
            bHandled = true;
        }
        if (cText[i] == 'z' && !bHandled)
            cText[i] = 'a';
    }
    Edit1->Text = AnsiString(cText);
    delete[] cText;
    


  • uluru schrieb:

    @ Joe_M: Ich hab doch geschrieben, dass ich im gegensatz zu anderen nen totaler noob bin.

    Der erste Griff wäre dann also zum Debugger...

    -junix



  • uluru schrieb:

    Vielleicht, weis ja jemand anderes, wie ich das hinbekommen könnte.

    na dann schau dir einfach mal meine lösung an :p



  • Jo Danke an euch alle, hab mir mal das Beispiel von Zwerg23 angeguckt und es hat geklappt, genau so wie ich es mir vorgestellt hab. Die anderen Sachen schaue ich mir bei Gelegenheit auch mal an. 🙂 🙂 🙂 🙂 🙂 🙂

    Hier der Code (zu dem Beispiel alle Buchstaben einen Platz weiter nach rechts zu schieben):

    int feld[256]; 
    for ( int i=0; i < 256; i++) 
      feld[i]=0; 
    feld['a']='b';
    feld['b']='c';
    feld['c']='d';
    feld['d']='e';
    feld['e']='f';
    feld['f']='g';
    feld['g']='h';
    feld['h']='i';
    feld['i']='j';
    feld['j']='k';
    feld['k']='l';
    feld['l']='m';
    feld['m']='n';
    feld['n']='o';
    feld['o']='p';
    feld['p']='q';
    feld['q']='r';
    feld['r']='s';
    feld['s']='t';
    feld['t']='u';
    feld['u']='v';
    feld['v']='w';
    feld['w']='x';
    feld['x']='y';
    feld['y']='z';
    feld['z']='a';
    String Ausgang = Edit1->Text; 
    for ( int i=1;i<=Ausgang.Length(); i++) 
       Ausgang[i]=feld[Ausgang[i]];
    Edit1->Text=Ausgang;
    

    thx auch allen. Ihr seid echt nett. 🙂 🙂 🙂



  • @Joe_M:
    Hi,
    ein einfaches else vor der 2. if hätte nicht gereicht? 😉

    MfG

    Alexander Sulfrian



  • Alexander Sulfrian schrieb:

    ...else vor der 2. if .. 😉

    *schäm*

    Grüße Joe_M.



  • uluru:
    Die Variante mit dem Array ist eher uncool, weil viel zu starr. Sieh dir mal dieses Beispiel an:

    String str = "AbCDE FgHIJ-KLmNo, PQRsT+UVw XYz.";
      int rot = 1; // Verschiebefaktor
    
      for (int i = 1; i <= str.Length(); i++)
      {
        int min, max;
        unsigned char ch = str[i];
        if (isupper(ch))      // Grossbuchstaben
        {
          min = 65;  // 'A'
          max = 90;  // 'Z'
        }
        else if (islower(ch)) // Kleinbuchstaben
        {
          min = 97;  // 'a'
          max = 122; // 'z'
        }
        else
          continue;           // Nicht-Buchstaben überspringen
    
        ch += rot;            // Buchstaben "verschieben"
        if (ch > max)         // Ende des Alphabets beachten
          ch = (min - 1) + (ch - max);
    
        str[i] = ch;
      }
      Caption = str;
    


  • @ jansen: vielleicht ist meine Methode für die die etwas in C++ drauf haben uncool, aber ich finde ich genau richtig für mich, da ich immer einen Überblick habe, welcher Buchstabe mit welchem vertauscht wird.

    Nun habe ich aber ein weiteres Problem mit meinem Code 🙄 .
    Da ich nicht nur eine Zeile, sondern auch einen ganzen Text chiffrieren möchte, hab ich anstatt Edit1 RichEdit1 genommen. Doch leider funktioniert das dann irgendwie nicht mehr, weil da garnichts passiert. Als Warnung erhalte ich im Editor: "Conversion may lose significant digits". 😮 😞 😞 😞
    Kann mir einer sagen was ich machen muss, damit mein Code auch in einem RichEdit funktioniert?
    Ich selber habe das so versucht:
    1. RichEdit1->Text
    2. RichEdit1->Lines->Strings[0] //hier ist es ja nur die erste Zeile, dass weiss ich auch, war nurn verzweifelter Versuch 🙄



  • Hi,
    zeig mal den Code wie du die einzelnen Zeichen ausliest?

    MfG

    Alexander Sulfrian

    EDIT: Ach ich sehe schon....
    Wo kommt denn der Fehler? Welche Zeile?



  • Das ist eigentlich ja kein Fehler, das da Programm ja auch generirt wird und nur nichts tut, wenn ich auf den Button1 drücke. Die Warnung wird einfach so ausgespukt in dieser Zeile:

    Ausgang[i]=feld[Ausgang[i]];



  • Hi,
    das kann ich nicht nachvollziehen...

    Ich hab einfach den Code von dir auf der letzten Seite übernommen und Edit1 durch RichEdit1 ersetzt und es hat geklappt....

    Du solltest vielleicht diesen Code hier:

    for (int i=1; i <= Ausgang.Length(); i++)
      Ausgang[i] = feld[Ausgang[i]];
    

    durch folgendes ersetzten:

    for (int i=1; i <= Ausgang.Length(); i++)
      if (feld[Ausgang[i]] != 0)
        Ausgang[i] = feld[Ausgang[i]];
    

    Dadurch wird immer erst überprüft ob der Char einen Ersatz hat...
    Sonst wird ein Char der nicht im feld mit einem Ersatz definiert ist durch 0 ersetzt werden! Und da ein AnsiString ein Null-terminierter String ist (d.h. bei 0 aufhört) würde der String womöglich etwas kurz werden....

    MfG

    Alexander Sulfrian

    PS: Aber auch hier wäre der Debugger evtl. hilfreich gewesen....



  • @ Alexander Sulfrian:
    Jo danke jetzt funzt das auch mit RichEdit 😃 😃 😃


Anmelden zum Antworten