| Autor |
Beitrag |
walter_b
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 17:36
Ich raff im Moment gar nichts mehr. Ich habe 4 verschiedene Varianten ausprobiert und nur eine davon ist richtig. Die Hauptthematik hier ist das Nullbyte.
Variabeln:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| var X, Y, I: Integer; Wort: Array[0..13] of Char; wortlihi: Array[0..13] of Char; worth: Array[0..13] of Char; wortchen, wortli: string; |
Variante 1 (falsch):
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| for X := 0 to 13 do Wort[X] := Chr(Ord('A')-65);
inc(Wort[0],32);
inc(Wort[0]); |
Bemerkung: Am Anfang wird jede Stelle des Array of Char gefüllt und Zwar mit dem Nullbyte (Ord('A'-65)). An erster Stelle des Arrays steht jetzt ein Ausrufezeichen, gefolgt von 13 Nullbytes.
Variante 2 (falsch):
Delphi-Quelltext
Variante 3 (falsch):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| wortlihi[0]:='!'; wortlihi[1]:=#0; wortlihi[2]:=#0; wortlihi[3]:=#0; wortlihi[4]:=#0; wortlihi[5]:=#0; wortlihi[6]:=#0; wortlihi[7]:=#0; wortlihi[8]:=#0; wortlihi[9]:=#0; wortlihi[10]:=#0; wortlihi[11]:=#0; wortlihi[12]:=#0; wortlihi[13]:=#0; |
Variante 4 (richtig):
Delphi-Quelltext 1: 2:
| wortli:='!'; wortli:=wortli+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0; |
Bemerkung: Ich kann sagen, dass das eine richtig ist und die anderen nicht, da ich alle durch eine Prozedure gesendet habe, welche aus ihnen einen Hash erzeugt. Und da ich weiss, was '!' original für einen Wert erzeugt, kann ich das mit Bestimmtheit falsifizieren. Damit meine Funktion richtig ausgeführt wird, muss ich ein Ausrufezeichen haben und danach 13 Nullbytes. Aber bis auf Variante 2 setzt doch jedes Verfahren Nullbytes!? Und warum variiert der Hash-Wert von Variante 3 von Mal zu Mal?
Benutzt wird die Prozedure nach folgendem Schema: writeln(hexhex(wort));
Vielen Dank für eure Hilfe.
Edit: Bitte keine Bemerkungen über schlechte Programmierung (z.b. bei 3.  ), da dies wirklich nur zur Veranschaulichung dient.
Edit2: Und mein eigentliches Ziel ist es, dass ich Variante 1 zum Laufen bringe 
Zuletzt bearbeitet von walter_b am Sa 19.07.08 18:43, insgesamt 1-mal bearbeitet
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 17:44
anhand deiner snippeds kann man nicht sagen weshalb ... poste doch etwas mehr code ...
aber vermutlich ist einfach die länge unterschiedlich und deine strings werden nicht initialisiert ...
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 19.07.08 17:48
ist array of char nicht das gleiche wie ein nulterminierter string??? es könnte doch sein das es deswegen nicht funktioniert, weil der string dem durch das zeichen #0 geschlossen wird.
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 17:49
Grenzgaenger hat folgendes geschrieben: | anhand deiner snippeds kann man nicht sagen weshalb ... poste doch etwas mehr code ...
aber vermutlich ist einfach die länge unterschiedlich und deine strings werden nicht initialisiert ... |
Bisschen mehr Code? Hier hast du!
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:
| function parityshift(part: string): string; var ret: string; prev, val, bp, I: integer; begin ret:=''; prev:=0; for I:=0 to 7 do begin val:=(prev or ord(part[I+1])) shr I; val:= val and $fe; prev:=ord(part[I+1]) shl 8; bp:= (val xor (val shr 4)); bp:= bp xor (bp shr 2); bp:= bp xor (bp shr 1); bp:= bp and 1; val:= val xor bp; ret:=ret+chr(val); end; Result:=ret; end;
function parityshift2(part: string): string; var ret: string; prev, val, bp, I: integer; begin ret:=''; I:=0; prev:=0; for I:=7 to 14 do begin val:=(prev or ord(part[I+1])) shr (I-7); val:= val and $fe; prev:=ord(part[I+1]) shl 8; bp:= (val xor (val shr 4)); bp:= bp xor (bp shr 2); bp:= bp xor (bp shr 1); bp:= bp and 1; val:= val xor bp; ret:=ret+chr(val); end; Result:=ret; end;
function DecodeText(Inputtext, Key: String): String; begin with TCipher_1DES.Create do try Mode := cmECBx; Init(Key); Result := EncodeBinary(Inputtext, TFormat_HEXL); finally Free; end; end;
procedure Gen(); var X: Integer; Wort: Array[0..13] of Char; wortlihi: Array[0..13] of Char; wortchen, wortli: string; begin for X := 0 to 13 do Wort[X] := Chr(Ord('A')-65); inc(Wort[0],32); Setlength(wortli,14); Setlength(wortchen,14); anf:=parityshift(wort); ende:=parityshift2(wort); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); Writeln(alpha+beta); wortchen:='!'; anf:=parityshift(wortchen); ende:=parityshift2(wortchen); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); Writeln(alpha+beta); wortli:='!'; wortli:=wortli+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0; anf:=parityshift(wortli); ende:=parityshift2(wortli); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); Writeln(alpha+beta); writeln(''); wortlihi[0]:='!'; wortlihi[1]:=#0; wortlihi[2]:=#0; wortlihi[3]:=#0; wortlihi[4]:=#0; wortlihi[5]:=#0; wortlihi[6]:=#0; wortlihi[7]:=#0; wortlihi[8]:=#0; wortlihi[9]:=#0; wortlihi[10]:=#0; wortlihi[11]:=#0; wortlihi[12]:=#0; wortlihi[13]:=#0; anf:=parityshift(wortlihi); ende:=parityshift2(wortlihi); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); Writeln(alpha+beta); |
elundril hat folgendes geschrieben: | | ist array of char nicht das gleiche wie ein nulterminierter string??? es könnte doch sein das es deswegen nicht funktioniert, weil der string dem durch das zeichen #0 geschlossen wird. |
Bin nicht sicher, ob ich dich richtig verstanden habe, aber dies funktioniert auch nicht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var worth: Array[0..13] of Char;
[...] worth[0]:='!'; anf:=parityshift(worth); ende:=parityshift2(worth); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); Writeln(alpha+beta); |
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 18:16
elundril hat folgendes geschrieben: | | ist array of char nicht das gleiche wie ein nulterminierter string??? es könnte doch sein das es deswegen nicht funktioniert, weil der string dem durch das zeichen #0 geschlossen wird. |
ein array of char ist ein array of char oder ein unsigned array of byte. ein nullterminierter string, ist ein zeiger auf ein array of char
@walter_b: hast du dir schon mal im debugger angesehen, was passiert?
btw: kannst du das einfacher über 'n pascal string verfolgen und da bist auch von verschiedenen seiteneffekten verschont...
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 18:21
Grenzgaenger hat folgendes geschrieben: |
ein array of char ist ein array of char oder ein unsigned array of byte. ein nullterminierter string, ist ein zeiger auf ein array of char
@walter_b: hast du dir schon mal im debugger angesehen, was passiert?
btw: kannst du das einfacher über 'n pascal string verfolgen und da bist auch von verschiedenen seiteneffekten verschont... |
Ich habe mir alle Zwischenwerte auslesen lassen, konnte aber nichts "besonderes" feststellen. Das Problem ist eben, dass ich gerne mit der Variante 1 ans Ziel kommen würde, da ich sonst wieder alles umschreiben müsste. Aber irgendwie weiss ich nicht, was ich falsch mache, da ich ja eigentlich chr(0) verwende, und das würde doch eigentlich dem Nullbyte entsprechen!?
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 18:28
@walter_b: hast du schon mal den debugger bemüht um zu sehen, was du bei variante (a) eigentlich machst?
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 18:42
Grenzgaenger hat folgendes geschrieben: | | @walter_b: hast du schon mal den debugger bemüht um zu sehen, was du bei variante (a) eigentlich machst? |
Ja, habe ich. Nach dem "for x:=0 to 13 do" meldet er mir, wenn ich mit dem Cursor auf Wort fahre folgendes:
| Zitat: | | ( #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) |
Dies Entspricht ja eigentlich genau meinen Vorstellungen.
Nach dem inc(Wort[0],32); steht
| Zitat: | | ( ' ', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) |
Dies passt auch noch. Nach dem letzten inc(Wort[Y]); sind wir bei
| Zitat: | | ( '!', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) |
angelangt, wie es eigentlich ja auch sein sollte.
Edit: habe gerade gemerkt, dass ich bei Variante 1 eine Zeile Code zuviel rausgelöscht habe. Sorry. Aber das Ergebnis und die Berechnungen bleiben immernoch gleich falsch, da ich bei mir im Programm den richtigen Code verwendet habe.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 18:45
und du meinst, es ist falsch dass bei
- ( #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) und
- ( ' ', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) und
- ( '!', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0)
jeweils etwas anderes rauskommt?
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 18:52
Nein. Ich kann nicht verstehen, wieso was anderes rauskommt, wenn ich
| Zitat: | | ( '!', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) |
und
Delphi-Quelltext 1: 2:
| wortli:='!'; wortli:=wortli+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0+#0; |
durch die selbe Prozedur laufen lasse. Meiner Meinung nach müsste dies das selbe geben!? Die Variante mit wortli ergibt das richtige Ergenis, alle anderen sind auf dem Holzweg. Allerdings kann ich mir nicht erklären, wieso, bzw. ich weiss nicht, was ich bei der Variante mit Wort anders machen müsste, damit ebenfalls das richtige rauskommt.
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 18:54
und hast du es dir im debugger angesehen, was da passiert? und wie deine funktionen das array abarbeiten?
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 19:08
Grenzgaenger hat folgendes geschrieben: | | und hast du es dir im debugger angesehen, was da passiert? und wie deine funktionen das array abarbeiten? |
Eigentlich reicht es ja, zu sehen, wie das anf und das ende aussieht, da sie ja bis dorthin das selbe sein müssen. Folgende Werte werden ausgegeben:
| Zitat: |
anf von Wort:
'!'#0#0#3'A'#3'-'
ende von Wort:
#0#0''#0#0#0#5#0
anf von wortli:
'!'#0#0#0#0#0#0
ende von wortli:
#0#0#0#0#0#0#0#0 |
Auffällig ist, dass diejenigen Zeichen von wortli überhaupt nicht bearbeitet werden, während die von Wort verändert werden. Muss das nochmal genau verfolgen. Doch im Moment stört mich was anderes: Wieso sind hinten 8 Zeichen und vorne 7? Werde das mal schnell überprüfen.
Edit: Habe das mal überprüft. Ich kanns mir zwar im Moment nicht erklären, aber es muss so sein
Weitere Entdeckung: Wenn ich den Array of Char in einen String speichern lasse, dann wird aus ( '!', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0) ein einfaches '!'. Jedoch weiss ich immernoch nicht, wie ich das ganze richtig zum laufen kriege.
Edit2: Habe das Problem gefunden. Wenn ich den Array of Char mit der Funktion bearbeiten will, dann ist alles, was übergeben wird, ein simples "!". Also werden die schönen #0 einfach weggehauen. Jemand eine Idee, wie ich Delphi Respekt und Anstand vor den #0 lehren kann (und zwar sollte es auch möglichst schnell sein  )?
--- Moderiert von Narses: Beiträge zusammengefasst---
Naja, habe jetzt etwas, das funktioniert, allerdings ist es noch viel zu langsam.
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:
| Type T14 = array[0..14] Of Byte; P14 = ^T14;
var X, Y, I, Len, p: Integer; Wort: Array[0..13] of Char; wortlihi: Array[0..13] of Char; worth: Array[0..13] of Char; wortchen, wortli: string;
[...]
SetLength(anf,7); SetLength(ende,7); SetLength (pass,14);
for X := 0 to 13 do Wort[X] := Chr(Ord('A')-65);
inc(Wort[0],32); inc(Wort[0]);
p := integer (@Wort[0]); P14(@pass[1])^ := P14(p)^; anf:=parityshift(pass); ende:=parityshift2(pass); alpha:=DecodeText('KGS!@#$%',anf); beta:=DecodeText('KGS!@#$%',ende); |
Hat jemand eine Idee für etwas schnelleres?
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 20:10
steht doch z.b. hier: www.delphi-forum.de/....php?p=514242#514242
Pascalstrings
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type Str14 = string[14]; var s: Str14; begin s[0] := 14; | und dann das längenbyte nicht mehr anfassen. und die funktionen mit STR14 deklarieren.
und das: Delphi-Quelltext 1: 2:
| inc(Wort[0],32); inc(Wort[0]); | kannste doch auch zusammenfassen, oder?
BTW: müsste es nicht STR15 heissen? 7 + 8 = 15? oder?
|
|
walter_b 
      
Beiträge: 135
Windows Vista/XP
Delphi 6
|
Verfasst: Sa 19.07.08 20:14
Grenzgaenger hat folgendes geschrieben: | steht doch z.b. hier: www.delphi-forum.de/....php?p=514242#514242
Pascalstrings
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type Str14 = string[14]; var s: Str14; begin s[0] := 14; | und dann das längenbyte nicht mehr anfassen. und die funktionen mit STR14 deklarieren.
|
Hm... Okee, ich schaue mal, was ich damit tolles anstellen kann.
Grenzgaenger hat folgendes geschrieben: | und das: Delphi-Quelltext 1: 2:
| inc(Wort[0],32); inc(Wort[0]); | kannste doch auch zusammenfassen, oder?
|
In diesem Falle hier schon. Doch da dies bei mir in zwei verschiedenen Schlaufen ausgeführt wird, ist es wichtig, das so getrennt zu haben (wollte nicht ständig den ganzen Code reinhauen, deshalb habe ich nur das rausgenommen, was einen Einfluss hat).
Grenzgaenger hat folgendes geschrieben: | | BTW: müsste es nicht STR15 heissen? 7 + 8 = 15? oder? |
Irgendwie hat mich der Code verarscht, wenn ich 2 mal 7 genommen habe, hat es nicht funktioniert. Mit 7 und 8 geht es jedoch. Aber dies war nur vorhin beim Aufsplitten. Wenn ich das ganze in einem String habe, dann kann ich ihn ganz in die Funktion stopfen, und die bearbeitet ihn selbständig nur dort, wo sie es gerne hätte. 14 Sollte also schon passen. Aber um sicher zu gehen, werde ich es gleich ausprobieren, dann kann ich es dir genau sagen.
--- Moderiert von Narses: Beiträge zusammengefasst---
Grenzgaenger hat folgendes geschrieben: |
Pascalstrings
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| type Str14 = string[14]; var s: Str14; begin s[0] := 14; | und dann das längenbyte nicht mehr anfassen. und die funktionen mit STR14 deklarieren.
|
Edit: Habe gemerkt, dass es wohl chr(14) heissen müsste (bei der Längendefinition). 
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 19.07.08 20:43
gut, dann ist aber eine deiner anderen funktionen verkehrt...
im übrigen, die pascal strings haben im ersten byte die längeninformation, deine schleife geht somit von 1 bis ...
und wie gesagt, wenn du solche schweinchen machen willst, achte drauf, dass die länge richtig gesetzt ist. am besten 1x setzen und die zuweisung per move
|
|
|