Autor |
Beitrag |
Curby
Hält's aus hier
Beiträge: 12
|
Verfasst: Do 11.09.03 20:30
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
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
Curby 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
Curby 
Hält's aus hier
Beiträge: 12
|
Verfasst: Fr 12.09.03 20:49
Ahja, kann mir da jemand einen Quelltext schreiben?
|
|
FeG
      
Beiträge: 77
Win XP Home, SuSE Linux 8.2 Prof
D3 Prof, D7 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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 
Hält's aus hier
Beiträge: 12
|
Verfasst: Di 16.09.03 15:23
Sieht jetzt so aus: (Entschlüsselung!!!)
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 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mi 17.09.03 18:22
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Curby 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Curby 
Hält's aus hier
Beiträge: 12
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 22.09.03 17:34
Aber nur, weil ich ein so unglaublich toller Kerl bin!!!!
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
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Zuletzt bearbeitet von Christian S. am Mo 22.09.03 19:17, insgesamt 1-mal bearbeitet
|
|
Curby 
Hält's aus hier
Beiträge: 12
|
Verfasst: Mo 22.09.03 19:16
Danke!!!!!! 
|
|