Entwickler-Ecke
Sonstiges (Delphi) - Verschlüsselung von Texten
Curby - Do 11.09.03 20:30
Titel: Verschlüsselung von Texten
Tach zusammen,
ich bin totaler Anfänger und muss für die Schule ein Verschlüsselungsprogramm für Texte schreiben.
Es kann so simpel sein, wie es eben geht, d.h. z.B.: Buchstabentauschen (aus A wird H), oder Buchstaben feste Zahlen zuorden (aus A wird 12) - hauptsache simpel!
Ich wäre Euch sehr dankbar, wenn Ihr mir dabei helfen könntet!
Im vorraus schon mal ein Dankeschön für Eure Mühen
Curby
Anonymous - Do 11.09.03 21:50
das hier ist absolut unsicher, aber simpel.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| function bla(s: string; key: byte): string; var i: integer; begin result := ''; for i := 1 to length(s) do result := result + chr(byte(s[i]) xor key) end; |
Gausi - Do 11.09.03 22:56
Stimmt, ist simpel und unsicher. Aber durch das XOR kommen doch nicht nur wieder Buchstaben raus, oder?
Damit man nach der Kodierung auch wieder was lesen kann, kann man z.b
ROT13 nehmen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin edit2.text:=''; for i := 1 to length(Edit1.Text) do edit2.Text:=Edit2.Text+ chr((((ord(Edit1.Text[i])-65)+13) mod 26)+65); end; |
Dies kodiert den Text von Edit1 nach Edit2.
Erklärung: die 65 ist die Nummer von 'A' im Ascii-Code. Die zieh ich ab, so dass die Buchstaben 'A' - 'Z' auf die Werte 0-25 kommen.
Auf diesen Wert pack ich 13 drauf, rechne das ganze modulo 26 (d.h. bei z.b. 24+13 kommt 37 raus. Modulo 26 ergibt das 11, denn 26+11=37).
Zum Schluss kommt wieder die 65 drauf, damit die Umwandlung mit chr zu einem Buchstaben wieder klappt.
So funktioniert das nur mit GROSSBUCHSTABEN.
Übrigens: Um den Text wieder zu entschlüsslen, kannst du dieselbe Funktion nehmen. Warum das so ist, verrat ich nicht, das ist ein Geheimnis ;-)
Und natürlich ist auch diese Funktion extrem unsicher.
Curby - Fr 12.09.03 10:54
Das sieht ja schonmal super aus, aber wie kann ich denn den Text so vorbehandeln, dass nur noch Großbuchstaben vorhanden sind?
Gausi - Fr 12.09.03 12:07
Es gibt zum einen die Funktion AnsiUpperCase. Dann bleiben aber immer noch die Nicht-Buchstaben, z.b. zahlen, leerzeichen, sonderzeichen und die umlaute (!) übrig.
Lösungsmöglichkeiten:
- diese Zeichen vorher löschen
- diese Zeichen unkodiert übernehmen
- den Algorithmus zu verändern, so dass er alle druckbaren Zeichen akzeptiert. Welche das sind, weiss ich nicht 100%ig. Wenn ich mich recht erinnere sind das alle bis auf die ersten 12 oder so. Du müßtest dann die Werte 65 und 26 in dem Algorithmus entsprechend anpassen.
Curby - Fr 12.09.03 20:49
Ahja, kann mir da jemand einen Quelltext schreiben?
FeG - Sa 13.09.03 00:27
Curby hat folgendes geschrieben: |
Ahja, kann mir da jemand einen Quelltext schreiben? |
Ähh.... du hast doch schon zwei Codebeispiele!
Für deine ursprüngliche Idee: nimm mal "Case...", also z.B.
Delphi-Quelltext
1: 2: 3: 4: 5:
| Case Key of 'A': EncodedKey:='X'; 'B': EncodedKey:='F'; end; |
Halt irgendwelche Buchstaben aussuchen...
Zitat: |
ich [...] muss für die Schule ein Verschlüsselungsprogramm für Texte schreiben. |
Genau! DU musst das Programm schreiben! Also: Streng dich mal ein bisschen an... Wenn es egal ist, wie sicher die Verschlüsselung sein soll, dann ist's doch wirklich net kompliziert...
MfG,
FeG
Curby - So 14.09.03 12:16
Das Problem liegt dadrin, dass ich vorher noch nie mit Delphi gearbeitet habe. Ich kenn mich ziemlich gut mit HTML und CO. aus, aber eben nicht mit Delphi! Mein Lehrer war der Ansicht, dass wenn man HTML kann auch Delphi können sollte - seh ich aber nicht so ;)
Curby - Di 16.09.03 15:23
Sieht jetzt so aus: (Entschlüsselung!!!)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| var i : integer; EncodedKey : string; Key : Char;
begin Klartext := '' ; Vorbehandeln(Geheimtext);
For i:=[1..7] to length(Geheimtext) do
begin key:=Geheimtext[i];
Case Key of 'XZYJVPQ': EncodedKey:= 'A'; 'XYJVPQZ': EncodedKey:= 'B'; 'JXZYVPQ': EncodedKey:= 'C'; 'XZYJQVP': EncodedKey:= 'D'; 'XZJVPQY': EncodedKey:= 'E'; 'XZYVJPQ': EncodedKey:= 'F'; 'JVPQXZY': EncodedKey:= 'G'; 'ZYJVXPQ': EncodedKey:= 'H'; 'JVPXZYQ': EncodedKey:= 'I'; 'XVZYJPQ': EncodedKey:= 'J'; 'XZYQJVP': EncodedKey:= 'K'; 'XZJVYPQ': EncodedKey:= 'L'; 'XZYJPVQ': EncodedKey:= 'M'; 'XZYJVQV': EncodedKey:= 'N'; 'XYJZVPQ': EncodedKey:= 'O'; 'XYJVZPQ': EncodedKey:= 'P'; 'YJVPQXZ': EncodedKey:= 'Q'; 'QXZYJVP': EncodedKey:= 'R'; 'XZYPJVQ': EncodedKey:= 'S'; 'ZYJVPQX': EncodedKey:= 'T'; 'XZYVJPQ': EncodedKey:= 'U'; 'XZJYVPQ': EncodedKey:= 'V'; 'XZYJVQP': EncodedKey:= 'W'; 'ZYJXVPQ': EncodedKey:= 'X'; 'XZYJPQV': EncodedKey:= 'Y'; 'XZYVPQJ': EncodedKey:= 'Z'; end;
Klartext := Klartext + EncodedKey;
end;
end; |
Problem: Verschlüselung klappt nun bestens, aber die Entschlüsselung haut mit diesem Quelltext nicht hin.
Frage: Was ist dadran falsch?
Curby - Mi 17.09.03 18:22
Kann mir keiner helfen?
Christian S. - Mi 17.09.03 18:32
Wenn Du Dir anschaust, wie "Key" deklariert ist, sollte Dir das zeigen, was mit Deinem Code nicht stimmt. Wie soll ein Character mehr als ein Zeichen haben?
Und was soll das sein:
Delphi-Quelltext
1:
| For i:=[1..7] to length(Geheimtext) do |
Kann sich das Programm aussuchen, bei welcher Zahl es beginnt? ;-)
Ach ja, Du solltest Deinen Code einrücken, sonst kann den ja niemand lesen.
MfG
Peter
Curby - So 21.09.03 12:10
Mein Problem liegt dadrin, dass ich nicht weiß, wie ich Delphi sage "Nimm 7 Zeichen und guck nach, welcher Buchstabe das ist".
Wenn i:=1, dann klappt das doch nicht, weil er mit einem einzelnen Buchstaben nichts anfangen kann.
Wie proggt man das denn?
Christian S. - So 21.09.03 12:44
Am besten machst Du das Ganze nicht mir einer For- sondern mit einer While-Schleife. Bei der erhöhst Du den Zähler jeweils um 7 und holst Dir Deine 7er-Gruppen mittels Copy aus dem String heraus.
Den Vergleich kannst Du nicht mit Case machen. Ich würde die verschlüsselten Buchstaben, die Du jetzt für den Vergleich verwendest, in einem Array speichern und anhand der Position im Array den Klartextbuchtaben bestimmen.
MfG
Peter
Curby - Mo 22.09.03 17:17
Weißt du wieviel ich davon verstanden habe?
Fast nichts - sorry, aber wie gesagt habe ich davon kaum Ahnung.
Ich würde dich bitten den Quelltext so umzuwandeln, da ich es nicht kann.
Ich wäre Dir sehr sehr sehr dankbar!
Ist mir peinlich, aber ich kann es wirklich nicht...
Christian S. - Mo 22.09.03 17:34
Aber nur, weil ich ein so unglaublich toller Kerl bin!!!!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| var Form1: TForm1;
sequences : Array[65..67] OF String = ('XZYJVPQ','XYJVPQZ', 'JXZYVPQ');
implementation
{$R *.dfm}
function LetterFromSequence(sequence : String) : Char; VAR i : INTEGER; begin for i:=65 TO 67 DO if sequence = sequences[i] then begin result := Chr(i); exit; end; result := '*'; end;
function ClearFromEnc (Enc : String) : String; VAR i : Integer; part : String; begin i:=1; result:= ''; while i <= Length(Enc)-6 do begin part := Copy(Enc, i, 7); result := result + LetterFromSequence(part); i := i + 7; end; end;
function EncFromClear (Clear : String) : String; VAR i, index : INTEGER; begin result := ''; for i:=1 TO Length(Clear) do begin index := Ord(Clear[i]); if index IN [65..67] then result := result + sequences[index]; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin edit2.text := EncFromClear(edit1.text); end;
procedure TForm1.Button2Click(Sender: TObject); begin edit1.text := ClearFromEnc(edit2.text); end; |
So, kurz erklärt: auf der Form befindet sich edit1 für den Klartext, edit2 fürs Verschlüsselte. Button1 verschlüsselt edit1 und schreibt das Ergebnis in edit2, Button2 macht genau das umgekehrte.
In "sequences" stehen die verschlüsselten Buchstaben, der Index entspricht dem ASCII-Code. Ich habe erstmal nur die ersten drei verschlüsselten Buchstaben eingetragen (also A, B, C), den Rest musst Du machen und entsprechend den Code nutzen, den ich jetzt auskommentiert habe.
Den Rest musst Du Dir selber erklären, damit Du auch noch ein bisschen Arbeit hast. Aber das Prinzip steht schon in dem Posting, das Du nicht verstanden hast. ;-)
MfG
Peter
Curby - Mo 22.09.03 19:16
Danke!!!!!! :wink: :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!