Ergebnis 1 bis 8 von 8

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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 11:10 Uhr)

  2. #2
    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

  3. #3
    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.

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

  5. #5
    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 =)

  6. #6
    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
  •