Ergebnis 1 bis 8 von 8

Thema: [Delphi] Cäsar-Verschlüsselung

  1. #1

    [Delphi] Cäsar-Verschlüsselung

    Huhu =)

    Ich hoffe mal ich bin hier im richtigen Forum für mein folgendes Problem:

    Wir haben in Informatik gerade das Thema Verschlüsselungen und ich soll zu dem Thema ein Programm mit Delphi (5) erstellen, was sich am Cäsar-Chiffre orientiert. Mein Lehrer hat gesagt, mit dem Programm soll es möglich sein, ein Wort wie folgt zu verschlüsseln:

    Zunächst gibt es eben ein Feld, wo man das Wort reinschreibt, das verschlüsselt werden soll. Darunter kommt dann ein weiteres Feld, wo man ein weiteres Wort eingeben kann, das dann zur Verschlüsselung dient.



    So sähe das dann aus; die Verschlüsselung an sich soll so aussehen, dass das Wort, das zur Verschlüsselung dient, in der unteren Reihe so oft wiederholt wird bis es gleich viele Buchstaben hat wie das obrige. Des Weiteren gibts halt noch einen Button und wenn man auf den draufklickt soll der Buchstabe, der oben steht, im Alphabet um den ASCII-Wert des Buchstaben der unten steht weiter gerückt werden. Das heißt, das I von Informatik wird um den ASCII-Wert von A, also 65 weiter geschoben. So wird aus dem I beispielsweise ein V (wenn ich mich nicht vertan hab) usw. Und dasselbe soll auch andersherum funktionieren, also das verschlüsselste Wort wieder entschlüsseln.

    Ich hab nur leider extrem wenig Ahnung von Informatik, und von daher auch nicht die leiseste Ahnung, wie ich das anstellen soll =( Ich hoffe, einer von euch kann mir helfen

  2. #2
    Zitat Zitat von Sammy Beitrag anzeigen
    Huhu =)

    Ich hoffe mal ich bin hier im richtigen Forum für mein folgendes Problem:

    Wir haben in Informatik gerade das Thema Verschlüsselungen und ich soll zu dem Thema ein Programm mit Delphi (5) erstellen, was sich am Cäsar-Chiffre orientiert. Mein Lehrer hat gesagt, mit dem Programm soll es möglich sein, ein Wort wie folgt zu verschlüsseln:

    Zunächst gibt es eben ein Feld, wo man das Wort reinschreibt, das verschlüsselt werden soll. Darunter kommt dann ein weiteres Feld, wo man ein weiteres Wort eingeben kann, das dann zur Verschlüsselung dient.



    So sähe das dann aus; die Verschlüsselung an sich soll so aussehen, dass das Wort, das zur Verschlüsselung dient, in der unteren Reihe so oft wiederholt wird bis es gleich viele Buchstaben hat wie das obrige. Des Weiteren gibts halt noch einen Button und wenn man auf den draufklickt soll der Buchstabe, der oben steht, im Alphabet um den ASCII-Wert des Buchstaben der unten steht weiter gerückt werden. Das heißt, das I von Informatik wird um den ASCII-Wert von A, also 65 weiter geschoben. So wird aus dem I beispielsweise ein V (wenn ich mich nicht vertan hab) usw. Und dasselbe soll auch andersherum funktionieren, also das verschlüsselste Wort wieder entschlüsseln.
    Der hier von dir beschriebene Algorithmus passt auf die Vigenère-Chiffre, nicht auf die Caesar-Chiffre. Also gehen wir einfach mal von der Vigenère-Chiffre aus, und davon, dass entweder du dich vertippt/geirrt hast oder dein Lehrer keine Ahnung hat.

    Was ich nicht ganz verstehe, ist wie du von I auf V kommst und wieso du mit dem ASCII-Wert arbeitest. Poste bitte einfach mal die von dir angedachte Rechnung dazu.

    Zitat Zitat
    Ich hab nur leider extrem wenig Ahnung von Informatik, und von daher auch nicht die leiseste Ahnung, wie ich das anstellen soll =( Ich hoffe, einer von euch kann mir helfen
    Ich habe leider nur extrem wenig Ahnung von Delphi, also kann ich dir das Programm nicht im Fertigzustand liefern. Ich kann dir aber mal den heißen Tipp geben, dir die Modulo-Funktion von Delphi bzw. allgemein den Modulo Operator anzugucken, der den Rest einer Ganzzahldivision liefert.

  3. #3
    Mein Lehrer hat hundertprozentig vom Cäsar-Chiffre geredet, diesen anderen hat er noch nie erwähnt. Und von I auf V komme ich, weil das I ja um den ASCII-Wert von A verschoben werden soll, also um 65. und wenn man von I an das Alphabet immer wieder wiederholt, ist der 65. Buchstabe V.

    I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A B C D E F G H I J K L M N O P Q R S T U V

    Hoffe, du verstehst, wie ich das meine...^^

    Geändert von Sammy (23.05.2008 um 10:10 Uhr)

  4. #4
    In der Regel wird bei solchen Chiffren nicht vom ASCII-Wert ausgegangen, sondern vom Buchstabenwert, sprich A=1, B=2, usw.

    1. Den Buchstabenwert kannst du dadurch erhalten, indem du den gesamten Text mit UpperCase() in Grossbuchstaben verwandelst und dann vom Ascii-Wert jedes Zeichens den Ascii-Wert von 'A' abziehst.

    2. Das selbe machst du mit deinem Passwort. Dann addierst du den Zahlenwert des Buchstabens im Passwort zum Zahlenwert deines zu verschluesselnden Zeichens und nimmst das Ergebnis modulo der Anzahl von Zeichen in deinem Alphabet, denn damit faengst du wieder von vorne an, wenn du durch das Alphabet durch bist ( Z + 1 = A ).

    Wenn du allerdings wirklich das GANZE ASCII verwenden willst, entfaellt natuerlich Punkt 1, und die Laenge deines Alphabets in Punkt 2 betraegt dann 256 Zeichen.

    Das ganze koennte in Delphi dann in etwa so aussehen ...

    Erzeuge drei TEdit EingabeFelder auf deinem Form (Edit1, Edit2 und Edit3) sowie einen Button (Button1). Dann erzeuge im Objectinspector ein OnClickEvent fuer den Button. in der Procedure Button1Click, die Delphi anlegt schreibe folgendes: [Ja Jeez, ich weiss, das ist schlechter Stil, aber ich will jetzt nicht erst das Erstellen seperater Funktionen in Delphi erklaehren muessen.]

    Code:
    procedure TForm1.Button1Click(Sender: TObject);  // Die OnClickMethode
    var i,pwlen: Integer; // zwei Zahlen, mit denen wir rechnen wollen
         StrIn: String; // Da kommt der zu verschluesselnde Text rein
         StrPw: String; // Da kommt der das Passwort rein
         StrOut: String; // Da kommt der verschluesselte Text rein
    
    begin  // Anfang des Codes
    
      StrIn := Edit1.text;  // Lies den zu verschluesselnden Text aus Edit1
      StrPw := Edit2.text; // Lies das Passwort aus Edit2
      pwlen := Length(StrPw); // Ermittel die Laenge des Passwortes
      StrOut := StrIn;  // Initialisiere das Resultat mit dem zu verschluesselnden Text
    
      for i:=1 to Length(StrIn) do  // Fuer jedes Zeichen in StrIn fuehre aus
        StrOut[i] := Chr(( Ord(StrIn[i]) + Ord(StrPw[ (i-1) mod pwlen + 1]) ) mod 256);
    
      { Das war kompliziert, daher erklaehre ich es.
        StrOut[i] bezeichnet das ite Zeichen in der Ausgabezeichenkette, welches wir ersetzen.
        Chr(Zahl) wandelt den in Zahl gespeicherten ASCII-Code in das entsprechende Zeichen um.
        Ord(Zeichen) gibt den ASCII-Code des Zeichens zurueck, also eine Zahl zwischen 0 und 255.
        StrIn[i] ist das ite Zeichen im zu verschluesselndem Text.
        (i-1) mod pwlen ermittelt den Rest der Division von (i-1) / pwlen.
        Das heisst im Klartext: Wenn i (also der Zaehler der Zeichen im Input)
        groesser als die Anzahl der Zeichen im Passwort ist, faengt das Passwort von
        vorne an zu zaehlen. Die (i-1) ist noetig, da wenn i = pwlen wird
        i mod pwlen = 0 ergibt. Daher muss, da wir Zahlen zwischen 1 und pwlen haben
        wollen, eine 1 addiert werden und damit muessen wir vorher von jedem i eine
        1 abziehen. StrPw[ (i-1) mod pwlen + 1] ermittelt also das passende Zeichen
        im Passwort, mit dem verschluesselt wird. Dessen ASCII-Wert wird nun zum
        ASCII-Wert des zu verschluesselnden Zeichens addiert und durch mod 256 wieder
        auf den Bereich zwischen 0 und 255 abgebildet.
      }
    
      Edit3.text := StrOut; // Das Ergebnis wird im Edit3 angezeigt.
    
    end;  // Ende des Codes
    Ich hoffe, das bringt dich weiter. bedenke aber, dass ASCII-Codes < 32 auch nicht druckbare Zeichen enthalten, die werden dann meist als schwarzes | dargestellt.

    Gruss Ineluki

  5. #5
    Zitat Zitat von Ineluki Beitrag anzeigen
    In der Regel wird bei solchen Chiffren nicht vom ASCII-Wert ausgegangen, sondern vom Buchstabenwert, sprich A=1, B=2, usw.
    In deinem Fall wäre allerdings A=0, B=1,...
    Was aber programmatisch natürlich deutlich mehr Sinn ergibt, weil das mit dem modulo ja sonst um einiges komplizierter wird.

    Nur als kurze Anmerkung zur Klarstellung.

  6. #6
    Monkey, du hast mich erwischt ^^
    Du kannst dir einen Schludrigkeitspunkt gut schreiben.
    Was der bringt, werden wir sehen, wenn du 100 Stueck gesammelt hast ^^

  7. #7
    So, ich durfte heute nen kleinen Vortrag halten und mit eurer Hilfe hab ich auch noch ein kleines Programm zusammengewerkelt, das anders funktioniert als ich erwartet hatte, aber der Lehrer war damit zufrieden und das is doch die Hauptsache

    Der verschlüsselte Text bestand zwar immer aus aneinander gereihten Zeichen wie ŠãÚÞ³âÕãªà, aber nuja, solange er glücklich is^^

    Vielen lieben Dank an euch =)

  8. #8
    Das ist doch auch korrekt, nehme ich an. Denn schliesslich besteht ASCII ja nicht nur aus dem Alphabet und den Zahlen von 0-9. Mit den hier beschriebenen Methoden hast du eine isomorphe Abbildung des kompletten Ascii-Raumes auf den kompletten Ascii-Raum.

    Wenn du unbedingt nur von und in ein Subset von Ascii abbilden willst, musst du ggf noch eine isomorphe Abbildung deines Subsets auf eine zusammenhaengende Teilmenge der natuerlichen Zahlen einfuehren, sofern deine Ascii-Teilmenge nicht ebenfalls zusammenhaengend ist, da du sonst keine Modulo-Operationen ausfuehren kannst.

    Andererseits .. warum nicht das komplette ASCII verwenden ? Menschenlesbarkeit wird ueberbewertet.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •