Autor Beitrag
LexXis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mi 26.10.05 18:10 
user profile iconChryzler 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mi 26.10.05 18:56 
Quellcode? Kommt sofort, is allerdings die noch "unüberarbeitete" Variante :)

ausblenden volle Höhe 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:
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);  //Schlüssel erstellen und Verschlüsseln
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 = 1and (TrackBar2.Position = 1then 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;

////////////////////////////////////////////////////
//////////////// E N C R Y P T /////////////////////
////////////////////////////////////////////////////
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;

////////////////////////////////////////////////////
///////////////// D E C R Y P T ////////////////////
////////////////////////////////////////////////////

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);  //Entschlüsseln
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(0then
      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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 26.10.05 19:17 
user profile iconuall@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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Mi 26.10.05 19:33 
user profile iconLexXis hat folgendes geschrieben:
btw: Schöne Grüße aus´m Allgäu in´s Allgäu @ Chryzler ;)

jep :D

Das schöne Allgäu...
Fabian W.
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1766

Win 7
D7 PE
BeitragVerfasst: Fr 28.10.05 19:13 
@LexXis:
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: 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