Autor |
Beitrag |
goog 
      
Beiträge: 37
|
Verfasst: Mo 17.01.05 18:05
Hi IngoD7!
Vielen Dank für die hilfe.
Ich glaub ich hab den Fehler.
Wie wäre es mit:
Delphi-Quelltext 1: 2:
| Zeile := ((Position-1) DIV 5)+1; Spalte := ((Position-1) MOD 5)+1; |
Jetzt stimmt meine Rechnung
gruß goog
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Mo 17.01.05 19:42
goog hat folgendes geschrieben: | Hi IngoD7!
Vielen Dank für die hilfe.
Ich glaub ich hab den Fehler.
Wie wäre es mit:
Delphi-Quelltext 1: 2:
| Zeile := ((Position-1) DIV 5)+1; Spalte := ((Position-1) MOD 5)+1; |
Jetzt stimmt meine Rechnung |
Korrekt.
Und nun fix weiter mit der Verschlüsselungroutine. Es wir eng bis Mittwoch.
|
|
goog 
      
Beiträge: 37
|
Verfasst: Mo 17.01.05 19:56
Hi IngoD7!
Ich habs jetzt so gut wie fertig (glaub ich zumindest  ).
Aber laufen wills noch nicht.
Warum zeigt er mir im edit4 nicht das ergebnis an, ich habe als ergebnisstring eine Variable "ergebnis" global deklariert in die die verschlüsselten Buchstaben geschrieben werden.
Hier ist jetzt mal mein bisheriger kompletter 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:
| unit play;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject);
private public end;
var Form1: TForm1;
implementation
const al='ABCDEFGHIKLMNOPQRSTUVWXYZ'; var matrix,ergebnis :string;
{$R *.DFM}
function zerlege (text:string):string; var i : integer; begin i:=1; while i < length(text) do begin if text[i]=text[i+1] then begin insert('X',text,i+1); end; inc(i,2); end; if odd(length(text)) then text:=text+'X'; result:=text; end;
function verschluessel (text:string):string ; var i,p,l,p1,z1,s1,p2,z2,s2:integer; begin l:=length(text); i:=1; while i < l do begin if text[i]='J' then text[i]:='I'; p1:=pos(text[i],matrix); z1:=((p1-1) DIV 5)+1; s1:=((p1-1) MOD 5)+1; inc(i); if text[i]='J' then text[i]:='I'; p2:=pos(text[i],matrix); z2:=((p2-1) DIV 5); s2:=((p2-1) MOD 5); inc(i); if z1=z2 then begin case p1 of 5: p1:=0; 10: p1:=5; 15: p1:=10; 20: p1:=15; 25: p1:=20; end; ergebnis[i-2]:=matrix[p1+1]; case p2 of 5: p2:=0; 10: p2:=5; 15: p2:=10; 20: p2:=15; 25: p2:=20; end; ergebnis[i-1]:=matrix[p2+1]; end else if s1=s2 then begin case p1 of 21: p1:=-4; 22: p1:=-3; 23: p1:=-2; 24: p1:=-1; 25: p1:=0; end; ergebnis[i-2]:=matrix[p1+5]; case p2 of 21: p1:=-4; 22: p1:=-3; 23: p1:=-2; 24: p1:=-1; 25: p1:=0; end; ergebnis[i-1]:=matrix[p2+5];
end else begin If s1<s2 then ergebnis[i-2]:=matrix[p1+(s2-s1)]; ergebnis[i-1]:=matrix[p2-(s2-s1)]; If s1>s2 then ergebnis[i-2]:=matrix[p1-(s1-s2)]; ergebnis[i-1]:=matrix[p2+(s1-s2)]; end;
end; end;
procedure TForm1.Button1Click(Sender: TObject); var schluessel,ns: string; zeile,spalte,i,l,p,p2 :integer; begin schluessel:='MATHEMATIKER'; text:=edit1.text; text:=zerlege(text); l:=length(schluessel); ns:=''; for i:=1 to l do begin if schluessel[i]='j' then schluessel[i]:='i'; p:=pos(schluessel[i],ns); if p=0 then ns:= ns+schluessel[i]; end;
matrix:=ns; for i:=1 to 25 do begin p2:=pos(al[i],matrix); if p2=0 then matrix:=matrix+al[i]; end;
edit2.text:=matrix; edit3.text:=text; edit4.text:=ergebnis; end;
end. |
Irgendwie krieg ich das mit der Rückgabe in der verschluessel Funktion net hin
gruß goog
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Mo 17.01.05 21:15
Bin gerade etwas in Streß. Habe jetzt den ganzen Code nicht kontrolliert, nur überflogen.
Nur ein paar (wichtige) Dinge mal eben:
goog hat folgendes geschrieben: |
Warum zeigt er mir im edit4 nicht das ergebnis an, [...]
Irgendwie krieg ich das mit der Rückgabe in der verschluessel Funktion net hin |
Möchtest du die Funktion Verschluessel nicht auch nochmal irgendwann in Button1Click aufrufen?
Deine DIV- und MOD-Formeln solltest du besser für beide Buchstaben korrekt haben.
Beim Erstellen der Matrix ersetzt du im Schlüssel "j" durch "i". Hier musst du große Buchstaben nehmen. Das ganze Programm setzt momentan voraus, dass nur große Buchstaben benutzt werden. Dann musst du auch Großbuchstaben ersetzen.
Auf was hast du eigentlich ergebnis zuvor gesetzt? Wenn du dabeigehst und einzelne Buchstaben von ergebnis veränderst, so sollte vorher auch was drinstehen. Normalerweise macht man das so, dass man ergebnis Stück für Stück aufbaut. Sinngemäß: ergebnis:=ergebnis+ErmittelterBuchstabe.
Als kosmetische Feinheit würde ich eine Funktion oder Prozedur MatrixErstellen machen, der du das Schlüsselwort übergibst (mache das, wenn du noch Zeit hast, später).
Und weiter geht's ....
|
|
goog 
      
Beiträge: 37
|
Verfasst: Mo 17.01.05 23:04
Hi IngoD7!
Juhhhhhuuuuuuuuuu  es läuft !!!
Vielen Dank
Ich hab noch mal ein paar Änderungen vorgenommen, auch mit der Funktion "matrix".
hier der neue 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:
| unit play;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject);
private public end;
var Form1: TForm1;
implementation
const al='abcdefghiklmnopqrstuvwxyz';
{$R *.DFM}
function zerlege (text:string):string; var i : integer; begin i:=1; while i < length(text) do begin if text[i]=text[i+1] then begin insert('x',text,i+1); end; inc(i,2); end; if odd(length(text)) then text:=text+'x'; result:=text; end;
function matrix(schluessel:string):string; var ns: string; i,p,p2:integer; begin ns:=''; for i:=1 to length(schluessel) do begin if schluessel[i]='j' then schluessel[i]:='i'; p:=pos(schluessel[i],ns); if p=0 then ns:= ns+schluessel[i]; end;
schluessel:=ns; for i:=1 to 25 do begin p2:=pos(al[i],schluessel); if p2=0 then schluessel:=schluessel+al[i]; end; result:=schluessel; end;
function verschluessel (text,schluessel:string):string ; var i,l,p1,z1,s1,p2,z2,s2:integer; begin l:=length(text); i:=1; while i < l do begin if text[i]='j' then text[i]:='i'; p1:=pos(text[i],schluessel); z1:=((p1-1) DIV 5)+1; s1:=((p1-1) MOD 5)+1; inc(i); if text[i]='j' then text[i]:='i'; p2:=pos(text[i],schluessel); z2:=((p2-1) DIV 5)+1; s2:=((p2-1) MOD 5)+1; inc(i); if z1=z2 then begin case p1 of 5: p1:=0; 10: p1:=5; 15: p1:=10; 20: p1:=15; 25: p1:=20; end; text[i-2]:=schluessel[p1+1]; case p2 of 5: p2:=0; 10: p2:=5; 15: p2:=10; 20: p2:=15; 25: p2:=20; end; text[i-1]:=schluessel[p2+1]; end else if s1=s2 then begin case p1 of 21: p1:=-4; 22: p1:=-3; 23: p1:=-2; 24: p1:=-1; 25: p1:=0; end; text[i-2]:=schluessel[p1+5]; case p2 of 21: p2:=-4; 22: p2:=-3; 23: p2:=-2; 24: p2:=-1; 25: p2:=0; end; text[i-1]:=schluessel[p2+5];
end else begin If s1<s2 then text[i-2]:=schluessel[p1+(s2-s1)]; text[i-1]:=schluessel[p2-(s2-s1)]; If s1>s2 then text[i-2]:=schluessel[p1-(s1-s2)]; text[i-1]:=schluessel[p2+(s1-s2)]; end; end; result:=text; end;
procedure TForm1.Button1Click(Sender: TObject); var schluessel,text: string; begin schluessel:='playfair'; text:=edit1.text; text:=zerlege(text); edit3.text:=text; schluessel:=matrix(schluessel); edit2.text:=schluessel; text:=verschluessel(text,schluessel); edit4.text:=text; end; |
jetzt muss ich bloß noch das entschlüsseln hinkriegen.
Kann ich das nun auch mit der Funktion "verschluessel" machen?
gruß goog
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Mo 17.01.05 23:36
Zum Schluß bist du ein paar - sagen wir mal - "eigenwillige" Wege gegangen.
Nun gut, das ist deine "künstlerische Freiheit". Wichtig dürfte sein, dass am Ende das richtige herauskommt.
Da tut es aber bestimmt noch nicht. Und zwar folgendes:
Wenn du möchtest, dass die Anweisungen MacheA und MacheB ausgeführt werden, wenn BedingungX der Fall ist, dann müssen die beiden Anweisungen in begin..end eingeschlossen werden.
Also so (Pseudo): Delphi-Quelltext 1: 2: 3: 4: 5:
| if BedingungX then begin MacheA; MacheB; end; |
Wenn du begin..end weglässt, passiert folgendes: Delphi-Quelltext 1: 2: 3:
| if BedingungX then MacheA; MacheB; |
Schau jetzt mal, wo du das missachtest hast und korrigiere es.
Zum Entschlüsseln sei gesagt, dass es ein Gerücht ist, zu behaupten, sie ginge in der selben Routine wie das Verschlüsseln. Überlege mal: Wo du vorher zum Verschlüsseln in der Matrix beispielsweise den Buchstaben unter dem gefundenen nehmen musstest (oder den rechts davon), so musst du zum Entschlüsseln den darüber (bzw. den links davon) nehmen. Das geht natürlich nicht in derselben Routine. Man könnte Teile der Routine verwenden, nämlich die Suche der Buchstaben in der Matrix. Aber ab deinen case-Anweisungen muss dann unterschieden werden: Ver- oder entschlüssele ich?
Wenn's nicht unbedingt anders gefordert ist, würde ich eine Extra-Funktion für das Verschlüsseln schreiben.
Wenn du nun in die Endphase gehst, dann teste dein Programm auf Herz und Nieren. Ich werde dir das nicht abnehmen. Ich weise dich auf mehr oder minder offensichtliche Fehler im Code - wenn ich sie entdecke - hin. Wenn aber uns beiden irgendetwas durch die Lappen geht, was jederzeit passieren kann, so wird das nur ein abschließender gründlicher Test ans Tageslicht bringen. Das bedeutet nix anderes, als dass du irgendwo Referenzverschlüsselungen auftreiben musst, um sie mit den Ergebnissen deines Programmes zu vergleichen. Das kann sehr gut auch bedeuten, dass du mal zwei oder drei Verschlüsselungen von Hand durchführen musst, um zu sehen, ob dein Programm auf dasselbe Ergebnis kommt. 
|
|
goog 
      
Beiträge: 37
|
Verfasst: Di 18.01.05 00:01
Hi IngoD7!
Ich glaub so gehts mit dem entschlüsseln.
nur das beim entschlüsselten Text die eingefügten x noch stören.
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:
| function entschluessel (text,schluessel:string):string; var i,l,p1,z1,s1,p2,z2,s2:integer; begin l:=length(text); i:=1; while i < l do begin p1:=pos(text[i],schluessel); z1:=((p1-1) DIV 5)+1; s1:=((p1-1) MOD 5)+1; inc(i); if text[i]='j' then text[i]:='i'; p2:=pos(text[i],schluessel); z2:=((p2-1) DIV 5)+1; s2:=((p2-1) MOD 5)+1; inc(i); if z1=z2 then begin case p1 of 1: p1:=6; 6: p1:=11; 11: p1:=16; 16: p1:=21; 21: p1:=26; end; text[i-2]:=schluessel[p1-1]; case p2 of 1: p2:=5; 6: p2:=10; 11: p2:=15; 16: p2:=20; 21: p2:=25; end; text[i-1]:=schluessel[p2-1]; end else if s1=s2 then begin case p1 of 21: p1:=-4; 22: p1:=-3; 23: p1:=-2; 24: p1:=-1; 25: p1:=0; end; text[i-2]:=schluessel[p1-5]; case p2 of 21: p2:=-4; 22: p2:=-3; 23: p2:=-2; 24: p2:=-1; 25: p2:=0; end; text[i-1]:=schluessel[p2-5];
end else begin If s1<s2 then begin text[i-2]:=schluessel[p1+(s2-s1)]; text[i-1]:=schluessel[p2-(s2-s1)]; end; If s1>s2 then begin text[i-2]:=schluessel[p1-(s1-s2)]; text[i-1]:=schluessel[p2+(s1-s2)]; end; end; end; result:=text; end; |
gruß goog
|
|
IngoD7
      
Beiträge: 629
D7
|
Verfasst: Di 18.01.05 03:58
goog hat folgendes geschrieben: | Hi IngoD7!
Ich glaub so gehts mit dem entschlüsseln.
nur das beim entschlüsselten Text die eingefügten x noch stören.
|
Okay, wie gesagt: Probiere es aus, dass du dir wirklich sicher sein kannst, alles richtig gemacht zu haben. Ich habe es nicht getestet.
Die X sind beim Zerlegen reingekommen und die bekommst du auch nicht wieder 100%-ig raus. Siehe im Verlauf dieses Threads. Da waren wir schon drauf eingegangen, dass es verschiedene Worte gibt, die nach dem Zerlegen dasselbe Ergebnis bringen. Kein Algorithmus der Welt wird hier dann jetzt 100%-ig erkennen können, welches Ursprungswort es mal gewesen ist.
Das Programm kann getrost nach dem Entschlüsseln aufhören. Zurückzerlegen geht nicht - jedenfalls nicht bei dem Zerlege-Algorithmus, wie wir ihn verstanden und du ihn jetzt programmiert hast. Ich denke mal, das hat Playfair auch nicht vorgesehen. Jedenfalls nicht ein Playfair mit einer schlappen 5x5-Matrix.
|
|
King of the Road
Hält's aus hier
Beiträge: 1
|
Verfasst: Mo 20.03.06 14:15
Hallo Leute,
Ich habe ein Problem. Ich habe eine BVuchstaben Kombination, die nach Playfair verschlüsselt ist. Leider habe ich keine Ahnung, wie man diese Entschlüsselt.
Die Buchstaben Kombination lautet: O G N I I N U W.
Kann mir jemand weiterhelfen und diese Kombination entschlüsseln?
Wäre euch sehr dankbar!
Gruß
King of the Road
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Sa 25.03.06 15:27
@ King of the Road hat folgendes geschrieben: | Hallo Leute,
Ich habe ein Problem. Ich habe eine BVuchstaben Kombination, die nach Playfair verschlüsselt ist. Leider habe ich keine Ahnung, wie man diese Entschlüsselt.
Die Buchstaben Kombination lautet: O G N I I N U W.
Kann mir jemand weiterhelfen und diese Kombination entschlüsseln?
|
Ich glaube das ist definitiv zu kurz als das man es entschlüsseln könnte, jedenfalls wenn du nicht weitere Informationen (z.B. den PlayFair-Kasten) hast.
Ansonsten kann ich nur das Buch "Verschlüsselte Botschaften" empfehlen, da stehen viele Algorithmen, auch Playfair, drin und z.T. wie man sie entschlüsselt. Ausserdem ist glaub ich (hab meins grad nicht da) ein Verfahren angegeben welches das Doppelbuchstaben-Problem, welches im Anfang von diesem Thread beschrieben wurde, umgeht, Doppelkasten hieß das glaube ich.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
|