![]() |
Re: ganz einfache Verschlüsselung von einem Memo Text
Liste der Anhänge anzeigen (Anzahl: 1)
@3/8: das ist aber keine Cäsar-Verschlüsselung.
@penelopee: was funktioniert nicht? bei mir geht das Super... :gruebel: |
Re: ganz einfache Verschlüsselung von einem Memo Text
@ichbins: Das zweite schon. Also aus 'abcde' wird 'bcdef'. Das ist doch eine Cäsar-Verschlüsselung, oder? (Mir persönlich wäre das etwas zu einfach zu knacken.)
|
Re: ganz einfache Verschlüsselung von einem Memo Text
Hallo Penelopee,
das mit der Caesar-Chiffre ist nicht so einfach. Das Original hatte ein Standardalphabet von nur 20 Buchstaben und keine Großschrift. Eigentlich reden wir von der einfachen monozyklischen Substitution, für die Caesars Chiffre lediglich ein früher historischer Beleg ist. Julius hat das auch nicht selbst erfunden, sondern bei Sueton geklaut, aber ist schon verjährt. Hier hast du ein bischen Code:
Delphi-Quellcode:
Testen kannst du mit zwei Buttons und einem Memo:
function Cypher(const s: string; power: integer): string;
var i: integer; begin Result := s; if power < 0 then power := (power + 224 * Succ((power div -224))) mod 224; if power > 0 then for i := 1 to Length(s) do if s[i] > #31 then Result[i] := Chr((Ord(s[i]) - 32 + power) mod 224 + 32) end;
Delphi-Quellcode:
Grüße vom marabu
const
PowerOfCesar = 3; procedure TDemoForm.btnEncodeClick(Sender: TObject); begin Memo.Lines.Text := Cypher(Memo.Lines.Text, PowerOfCesar); end; procedure TDemoForm.btnDecodeClick(Sender: TObject); begin Memo.Lines.Text := Cypher(Memo.Lines.Text, - PowerOfCesar); end; |
Re: ganz einfache Verschlüsselung von einem Memo Text
kann mir mal bitte einer diesen Quellcode erklären:
Delphi-Quellcode:
Also meine fragen:bei Count werden die Buchstaben gezählt oder??Und was macht "length"??
procedure encode(key:integer);
var i,j,k,pos:integer; s:string; done:tpoint; const letters:string='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ßöäüÖÄÜ,.;-_+*~#''?\=}][{&%$³²$§"°^<>|µ€@'; begin for i:=0 to form1.memo1.lines.Count do for j:=1 to length(form1.memo1.lines.Strings[i]) do for k:=1 to length(letters) do if byte(form1.memo1.lines.Strings[i][j])=byte(letters[k]) then begin if not ((done.x=i) and (done.y=j)) then begin pos:=k+key; while pos>length(letters) do pos:=pos-length(letters); while pos<1 do pos:=pos+length(letters); s:=form1.memo1.lines.strings[i]; s[j]:=letters[pos]; form1.memo1.lines.Strings[i]:=s; done.X:=i; done.Y:=j; end; end; Was macht der Befehl "done.X:=i;"??? Vielen Dank!! |
Re: ganz einfache Verschlüsselung von einem Memo Text
Jetzt funktioniert es!!
Aber wie baue ich Leerzeichen ein???Wenn ich einen Text decode , soll zwischen den Worten Leerzeichen sein!!
Delphi-Quellcode:
const
Key = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 '; implementation {$R *.dfm} function Verschluessle(Text: String) : String; begin for i := 1 to length(Text) do begin for j := 1 to 64 do begin if Text[i] = Key[j] then Result := Result+Key[j+x]; end; end; end; function Entschluessle(Text: String) : String; begin for i := 1 to length(Text) do begin for j := 1 to 64 do begin if Text[i] = Key[j] then Result := Result+Key[j-x]; end; end; end; procedure TForm1.BverschluesselnClick(Sender: TObject); begin Memo1.Lines.Text := Verschluessle(Memo1.Lines.Text); end; procedure TForm1.FormCreate(Sender: TObject); begin x:=5; end; procedure TForm1.BentschluesselnClick(Sender: TObject); begin Memo1.Lines.Text := Entschluessle(Memo1.Lines.Text); end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile('Text.txt'); end; end. |
Re: ganz einfache Verschlüsselung von einem Memo Text
Zitat:
BTW: Du solltest deinen Sourcecode "besser" formatieren. So wie er ist, ist er recht schlecht zu lesen ;-) EDIT Und noch etwas. Überlege mal was in dieser Zeile passiert
Delphi-Quellcode:
wenn: (j + x) > als Length(Key) ist.
Result := Result+Key[j+x];
|
Re: ganz einfache Verschlüsselung von einem Memo Text
Hi Sharky,
ob mit oder ohne white space - bei der monozyklischen Substitution wird die Hürde für eine erfolgreiche Dechiffrierung nicht wesentlich erhöht:
Delphi-Quellcode:
Auch unter einfachsten Randbedingungen sollte man mindestens eine polyzyklische Variante verwenden und Korrekturmaßnahmen zur Verschleierung der Häufigkeitsverteilung ergreifen. Und bei der heutigen Rechenleistung reden wir dann immer noch über Kinderkram...
function Cypher(const s: string; power: integer): string;
var i: integer; begin Result := s; if power < 0 then power := (power + 223 * Succ((power div -223))) mod 223; if power > 0 then for i := 1 to Length(s) do if s[i] > #32 then Result[i] := Chr((Ord(s[i]) - 33 + power) mod 223 + 33) end; Grüße vom marabu |
Re: ganz einfache Verschlüsselung von einem Memo Text
Zitat:
Delphi-Quellcode:
Das Problem ist, dass z mit A verschlüsselt wird, aber nach Caesar mit a ersetzt werden müsste. Z wird zu 1, sollte aber A werden und Ü wird, wie du gesagt hast, ja einen Fehler ergeben.
letters:string='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ßöäüÖÄÜ';
//diese Buchstabenliste kann beliebig erweitert werden. Zitat:
Zitat:
Und zu den Korrekturmaßnamen würde ich mal homophone Substitution vorschlagen, was natürlich auch nicht zum Verschlüsseln von Bankdaten einlädt, aber im Gegensatz zu der Caesar-Chiffre doch dem Angreifer eine Hürden in den Weg legt. |
Re: ganz einfache Verschlüsselung von einem Memo Text
Hallo,
Da mich das jetzt doch brennend interessiert hat, hab ich jetzt meine Version nochmals überarbeitet und einige Kleingkeiten, die in diesem Thread angesprochen wurden beseitigt.
Delphi-Quellcode:
Gelöst hab ich das mit dem z zu A, Z zu 1, das ich 3 unterschiedliche Schlüssel nehme, bzw. für jede Gruppe ein eigenen.
function Verschluessle(Text: String) : String;
var Key: array[1..3] of String = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz', '0123456789'); { ... } function Verschluessle(Text: String) : String; var i, j, k: Integer; begin Result := ''; //Ergebniss zurücksetzen for i := 1 to length(Text) do //Jeden Buchstaben des Textes durchgehen begin for j := 1 to 3 do //Jeden Schlüssel durchgehen begin for k := 1 to length(Key[j]) do begin if Text[i] = Key[j][k] then begin if not (k+1 > length(Key[j])) then //Überprüfen ob man schon ebim letzten Buchstaben ist Result := Result + Key[j][k+1] else Result := Result + Key[j][1]; end; end; end; if Text[i] = ' ' then //If Bedingung weglassen wenn man keine Leerstellen will. Result := Result + ' '; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Text := Verschluessle(Memo1.Lines.Text); //Möglicher aufruf der Funktion end; Und wenn man am Ende vom der "Schlüsselgruppe" ankommt wird man einfacher wieder nach vorne gesetzt. (Stichwort: If-Abfrage) :) [Edit1] Hups kleiner Denkfehler drin. Das mit den Leerstellen muss ich doch jetzt nocheinmal testen .. [Edit2] So nun bleiben die Leerstellen erhalten ;) ... MFG Maximus |
Re: ganz einfache Verschlüsselung von einem Memo Text
Hallo St. Pauli,
Zitat:
Zitat:
Freundliche Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz