Autor |
Beitrag |
LexXis
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 26.10.05 17:29
Hallo und Willkommen im 100000. Thread zu dem Thema =)
Ich hab mir ne simple Verschlüsselung überlegt und wollt mal fragen, was ihr davon haltet und
ob vllt. einer genug Muße hat zu versuchen nen Verschlüsselten Text zu Entschlüsseln. Den Text dazu gibt´s auf Anfrage.
Zur Verschlüsselung:
Wie gesagt is die MEHR als simpel.
Ich pack mir sämmtliche 255 ASCII-Zeichen, allerdings ohne #0, in ein Array. Danach erzeuge ich mehr oda weniger durch Zufall (rand() kommt auch vor, is aber kein wesentlicher Bestandteil) einen Schlüssel, der die gleiche Länge hat wie der original Text. Nun nehme ich das 1. Zeichen des Textes und schaue, an wievielter stelle das Zeichen in meinem Array steht. Das Gleiche dann mit dem ersten Zeichen des Schlüssels. Die beiden Ergebnisse werden dann einfach addiert und in dem Array nachsehen, welches Zeichen an der Stelle der Summe steht. Das is dann das erste Zeichen des Chiffre. Das ganze Spiel geht dann so Buchstabe für Buchstabe.
Zum Generieren des Schlüssels:
Ich habe 2 Trackbars mit nem Min. von 1 und Max. von 500 und 2 Timer. Diese Timer bekommen die Position der 1. bzw. 2. Trackbar als Interval zugewiesen. Nun laufen die Timer in unterschiedlichen Geschwindigkeiten und fügen dem Schlüssel jeweils einen Buchstaben (allerdings mit rand()) hinzu, bis die Schlüssellänge der Länge des Originaltextes entspricht. Nachdem aber nicht angezeigt wird, welche Intervalle von den Timern verwendet wurden, is die Chance, dass jemand zufällig DIESE Einstellungen wieder erwischt sehr gering. Nachdem ich immer wieder gelesen hab, dass rand() in etwa so sicher is wie XOR (also so gut wie garnich  ) hab ich eben versucht, das Ganze nocheinmal ein wenig sicherer zu machen.
Nun ist eben die Frage, ob meine Art der Verschlüsselung wenigstens einigermaßen Probleme beim Knacken macht.
Beispiel dazu:
Original Text: test
Zufälliger Schlüssel: RFRA
Verschlüsselter Text: ƫŵ
Lasst euch einfach ma drüber aus, ich werd schauen was sich da verbessern lässt =)
mfg lexxis
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Mi 26.10.05 18:04
Hallo,
das mit den Timern und den unterschiedlichen Intervallen gefällt mir irgendwie,
aber die Timer sind ja gerade nicht so ganz genau
(z.B: selbst wenn man ein Intervall von 1 ms angibt, läuft der nieundnimmer 1000x in der Sekunde durch), und da kann es doch mal sein, dass sich die ganze Sache verschiebt, also dass beim einenmal der andere Timer schneller war. Ich hoffe du verstehst mich.
Ähm, ist zum entschlüsseln auch das Prog erlaubt? Denn ohne das Array kann man's ja fast vergessen.
|
|
LexXis 
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 26.10.05 18:10
Chryzler hat folgendes geschrieben: |
Ähm, ist zum entschlüsseln auch das Prog erlaubt, denn ohne das Array kann man's ja fast vergessen. |
Eben, man bräuchte das Array UND den Schlüssel zum Entschlüsseln. Von daher würd ich das Verfahren für relativ sicher halten.
Aber ich lass mich auch gern eines Besseren belehren =)
Wenn einer den Source von der Encrypt- bzw. Decrypt-funktion haben will kann ich den auch gerne posten.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 26.10.05 18:25
viel zu umständlich
XOR ist auch sicher wenn der schlüssel genau so lang ist wie der text
dieser muss aber zufällig sein
also brauchste schonmal das add usw. nicht
ausserdem lässt du die #0 weg, das muss man auch nicht machen, da man ja eh nie weiß ob es nicht doch nen verschlüsselter buchstabe ist
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
LexXis 
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 26.10.05 18:39
Hab jetzt nicht nur #0 weggelassen, sondern auch alle anderen Steuerzeichen bis einschließlich #20.
Ganz eifach aus dem Grund, dass wenn du oder jemand anderst den Text entschlüsseln möchte, er nen Problem hat. Oder kannst du die Steuerzeichen anhand ihres Aussehens auseinanderhalten?
Was XOR betrifft: Wenn das genauso sicher is, dann nehm ich das und brauch net soviel rumrechnen ^^
Wie sieht´s aus mit dem Erstellen des Schlüssels? Is das einigermaßen zufällig? Ansonsten hab ich mal gehört, dass jemand die Daten zum Erstellen durch auslesen der Mausbewegungen bekommen hat. Werd mich da morgen Nachmittag mal dran setzten
mfg LexXis
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 26.10.05 18:44
hi
es ist doch total egal von wo du 'random' aufrufst. da du nen array hast wirste etwa sowas haben wie
schluessel := schluesses+char(random(256));
und das ist egal wann das von welchem timer aufgerufen wird, es sei denn du rufst vorher immer randomize auf
aber da wir leider den quellcode net haben könne wir auch net sagen ob das einigermaßen sicher ist.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
LexXis 
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 26.10.05 18:56
Quellcode? Kommt sofort, is allerdings die noch "unüberarbeitete" Variante
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: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225:
| procedure TForm1.Button1Click(Sender: TObject); begin
txt_orig.Text := StringReplace(txt_orig.Text, 'Ä', 'Ae', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ä', 'ae', []); txt_orig.Text := StringReplace(txt_orig.Text, 'Ö', 'Oe', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ö', 'oe', []); txt_orig.Text := StringReplace(txt_orig.Text, 'Ü', 'Ue', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ü', 'ue', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ß', 'ss', []);
if txt_orig.Text = '' then Application.MessageBox('Bitte geben Sie den zu verschlüsselnden Text ein.', 'Achtung!') else begin if (TrackBar1.Position = 1) and (TrackBar2.Position = 1) then Application.MessageBox('Bitte stellen sie andere Parameter zum Generieren des Schlüssels ein.', 'Achtung!') else begin Timer1.Interval := TrackBar1.Position; Timer2.Interval := TrackBar2.Position; Timer1.Enabled := true; Timer2.Enabled := true;
addstatus('Generiere Schlüssel...');
ProgressBar1.Position := 0;
txt_key.Clear; txt_orig.ReadOnly := true; txt_done.Clear;
end; end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); var rand: integer; begin rand := random(252);
if length(txt_key.Text) < length(txt_orig.Text) then begin while rand < 65 do rand := random(252); txt_key.Text := txt_key.Text+chr(rand); ProgressBar1.Position := round(100/length(txt_orig.Text)*length(txt_key.Text)); end else begin timer1.Enabled := false; timer2.Enabled := false; addstatus('Schlüssel generiert!'); addstatus('Verschlüssle Text...'); encrypt; end; end;
procedure TForm1.Timer2Timer(Sender: TObject); var rand: integer; begin rand := random(252);
if length(txt_key.Text) < length(txt_orig.Text) then begin while rand < 1 do rand := random(252); txt_key.Text := txt_key.Text+chr(rand); ProgressBar1.Position := round(100/length(txt_orig.Text)*length(txt_key.Text)); end else begin timer1.Enabled := false; timer2.Enabled := false; addstatus('Schlüssel generiert!'); addstatus('Verschlüssle Text...'); encrypt; end; end;
procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin Randomize; for i := 1 to 9 do chars := chars + chr(i); chars := chars + chr(11); chars := chars + chr(12);
for i := 14 to 255 do chars := chars + chr(i); end;
procedure TForm1.addstatus(text: string); begin lb_status.Items.Add('-'+timetostr(now)+'- '+text); end;
procedure TForm1.encrypt; var i, j, pos1, pos2: integer; begin
pos1 := 0; pos2 := 0;
for i := 0 to length(txt_orig.Text) do begin
for j := 0 to 252 do if txt_orig.Text[i] = chars[j] then pos1 := j;
for j := 0 to 252 do if txt_key.Text[i] = chars[j] then pos2 := j;
j := pos1+pos2; txt_done.Text := txt_done.Text + chars[j];
end;
addstatus('Verschlüsselt!'); txt_orig.ReadOnly := false; TrackBar1.Position := 0; TrackBar2.Position := 0; ProgressBar1.Position := 0; end;
procedure TForm1.decrypt; var i, j, pos1, pos2: integer; begin
pos1 := 0; pos2 := 0;
for i := 0 to length(txt_orig.Text) do begin
for j := 0 to 252 do if txt_crypted.Text[i] = chars[j] then pos1 := j;
for j := 0 to 252 do if txt_key2.Text[i] = chars[j] then pos2 := j;
j := pos1-pos2;
txt_done.Text := txt_done.Text + chars[j]; end;
addstatus('Entschlüsselt!'); txt_crypted.ReadOnly := false; txt_key2.ReadOnly := false;
end;
procedure TForm1.Schlsseldrucken1Click(Sender: TObject); begin txt_key.Print('Schlüssel:'+#13#10+txt_key.Text); end;
procedure TForm1.Button2Click(Sender: TObject); begin if (txt_crypted.Text = '') or (txt_key2.Text = '') then Application.MessageBox('Bitte stellen Sie sicher, dass sowohl ein Chiffre als auch ein Schlüssel eingegeben wurde.', 'Achtung!') else begin addstatus('Entschlüssle Text...'); txt_done.Clear; txt_crypted.ReadOnly := true; txt_key2.ReadOnly := true; decrypt; end; end;
procedure TForm1.Enbtw1Click(Sender: TObject); begin txt_done.Print('Ver- bzw. Entschlüsselter Text:'+#13#10+txt_done.Text); end;
procedure StrToClipbrd(StrValue: string); var S: string; hMem: THandle; pMem: PChar; begin hMem := GlobalAlloc(GHND or GMEM_SHARE, Length(StrValue) + 1); if hMem <> 0 then begin pMem := GlobalLock(hMem); if pMem <> nil then begin StrPCopy(pMem, StrValue); GlobalUnlock(hMem); if OpenClipboard(0) then begin EmptyClipboard; SetClipboardData(CF_TEXT, hMem); CloseClipboard; end else GlobalFree(hMem); end else GlobalFree(hMem); end; end;
procedure TForm1.SchlsselindieZwischenablageeinfgen1Click(Sender: TObject); begin StrToClipbrd(txt_key.Text); Application.MessageBox('Kopiert!', ''); end;
procedure TForm1.InZwischenablageeinfgen1Click(Sender: TObject); begin StrToClipbrd(txt_done.Text); Application.MessageBox('Kopiert!', ''); end;
end. |
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Mi 26.10.05 19:17
uall@ogc hat folgendes geschrieben: | viel zu umständlich |
stimmt.
bei einer One-Time-Pad Verschlüsselung ist das wichtigste, dass der Schlüssel richtig generiert wird. Also nicht einfach:
Delphi-Quelltext 1:
| schlussel := schluessel + chr(random(255)); |
Das mit den Mausbewegungen hatte ich schon mal versucht: gescheitert
Ich hab irgendwie nicht so "richtige" Zufallszahlen hinbekommen.
|
|
LexXis 
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 26.10.05 19:27
Hm.. Ich seh schon: Kann ich fast komplett neu schreiben ^^
Ich setzt mich da morgen nochmal dran, für heute is Feierabend.
mfg LexXis
btw: Schöne Grüße aus´m Allgäu in´s Allgäu @ Chryzler 
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Mi 26.10.05 19:33
LexXis hat folgendes geschrieben: | btw: Schöne Grüße aus´m Allgäu in´s Allgäu @ Chryzler  |
jep
Das schöne Allgäu...
|
|
Fabian W.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: Fr 28.10.05 19:13
@LexXis:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| txt_orig.Text := StringReplace(txt_orig.Text, 'Ä', 'Ae', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ä', 'ae', []); txt_orig.Text := StringReplace(txt_orig.Text, 'Ö', 'Oe', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ö', 'oe', []); txt_orig.Text := StringReplace(txt_orig.Text, 'Ü', 'Ue', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ü', 'ue', []); txt_orig.Text := StringReplace(txt_orig.Text, 'ß', 'ss', []); | Wird dir noch Probleme bereiten, da du nur das jeweils erste vorkommende Ä Ö Ü ersetzt, außerdem kannst du die Zeilenzahl des Quellcodes halbieren wenn du dsa ganze so machst:
Delphi-Quelltext 1: 2: 3: 4:
| txt_orig.Text := StringReplace(txt_orig.Text, 'ä', 'ae', [rfreplaceall, rfIgnoreCase]); txt_orig.Text := StringReplace(txt_orig.Text, 'ö', 'oe', [rfreplaceall, rfIgnoreCase]); txt_orig.Text := StringReplace(txt_orig.Text, 'ü', 'ue', [rfreplaceall, rfIgnoreCase]); txt_orig.Text := StringReplace(txt_orig.Text, 'ß', 'ss', [rfreplaceall, rfIgnoreCase]); | Was das im einzelen bewirk kannst du in der Hilfe nachlesen.
|
|
LexXis 
      
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Sa 29.10.05 13:17
Oh, danke ^^
Also ich bin bei der ganzen sache nicht wirklich weiter gekommen und lass das Projekt für´s Erste einfach mal so auf sich beruhen. Danke für die ganzen Tipps, schönen Tag noch =)
mfg LexXis
|
|
|