Autor |
Beitrag |
Sirke
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 11:40
Hallo zusammen,
ich habe ein Programm geschrieben, welches Benutzern erlaubt Daten auf einen FTP zu laden, ohne dass sie das Passwort des FTP sehen können. Dieses leigt verschlüsselt in einer externen Datei. Dabei habe ich ein Problem, und zwar, dass ich Daten die ich Verschlüsseln möchte nicht als ein Array of Byte sondern als einen Array of 0..1023 vorliegen habe! Um bei dem Verschlüsselungsvorgang auf Nullen zu verzichten, wenn ich einfach welche vorne ran schreibe, sodass ich dann einen Array of Word erhalte, den ich sehr leicht verschlüsseln kann, möchte ich den 10-Bit-Array in einen 8-Bit-Array umwandeln. Ich habe Jetzt so gelöscht, dass ich alle einen Bit-String erstelle, der eben nur Nullen und Einsen enthält, und diesen dann einlese und einen Array of Byte erhalte.
Geht das Umwandeln, in beide Richtungen versteht sich, auch einfacher bzw schneller, weil meine Methoder extrem langsam für große Datenmengen arbeitet!
MfG Sirke
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 19.02.07 11:54
Ein Array of 0..1023 würde von Delphi sowieso als Array of Word (wenn nicht sogar als Array of Integer???) angelegt werden. War das daher symbolisch zu verstehen, oder rein von der Deklaration?
Ferner lässt sich für einen Algorithmus ohne dessen genauer Beschreibung relativ schlecht sagen, wo die Flaschenhälse liegn. Ein kleiner Ausschnitt der relevanten Zeilen wäre daher wünschenswert.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Sirke 
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 12:06
Dieser Code erzeugt einen String mt Nullen und Einsen. t und p sind Strings und a1024Array der Array of 0..1023, also er enthält nur die Zahlen 0 bis 1023:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| t := ''; for i := 0 to High(a1024Array) do begin j := a1024Array[i]; p := ''; while j > 0 do begin p := IntToStr( j mod 2 ) + p; j := j div 2; end; while length(p) < 10 do p := '0' + p; t := t + p; end; |
Dieser Code liest den String ein und füllt den a256Array, welcher ein Array of Byte ist:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| SetLength( a256Array, Length(t) div 8 ); for i := 0 to High(a256Array) do begin n := 0; for j := 1 to 8 do begin n := n + 2; n := n + StrToInt( t[ i*8 + j ] ); end; a256Array[i] := n; end; |
Dadurch, dass man alles in einen String speichert und dadurch sozusagen 8mal so lang macht wie normal, dauert das für große Datenmengen sehr lange!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 19.02.07 12:08
Moin!
Darf ich mal fragen, wo da die Verschlüsselung sein soll? Bisher wandelst du lediglich große Binärzahlen in Strings um...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Sirke 
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 12:14
Ja, das hast du gut erkannt, aber ich habe auch nichts anderes Oben geschrieben!
Ich habe Daten in einem bestimmten Format (0..1023) vorliegen benötige sie aber in einem anderen (0..255), damit der Verschlüsselungsvorgang funktioniert bzw ich nicht so viele Nullen vorliegen habe!
Dieses Umwandeln sollte schneller funktionieren. Das ist meine Frage, wie ich das machen kann!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 19.02.07 12:32
Moin!
Bitte nicht persönlich nehmen, aber ich hege den Verdacht, dass du nicht so ganz genau weißt, was du da tust...
Sirke hat folgendes geschrieben: | Ich habe Daten in einem bestimmten Format (0..1023) vorliegen benötige sie aber in einem anderen (0..255), |
Was du da mit diesem "Format" meinst, das ist mir beim besten willen nicht klar...
Sirke hat folgendes geschrieben: | damit der Verschlüsselungsvorgang funktioniert bzw ich nicht so viele Nullen vorliegen habe! |
Zeig doch mal diesen "Verschlüsselungsvorgang" oder zumindest den Funktionsaufruf.  Falls du bedenken hast, dass dann deine Verschlüsselung "unsicher" wird, wenn der Algorithmus bekannt ist, dann hast du recht.  Deshalb sind auch nur Verfahren als sicher einzustufen, deren Algo bekannst ist!
Sirke hat folgendes geschrieben: | Dieses Umwandeln sollte schneller funktionieren. Das ist meine Frage, wie ich das machen kann! |
Ehrlich gesagt sehe ich keinen Sinn in diesen Umwandlungen, ob ich nun einen Binärzeichen enthaltenden String verschlüssele oder die Binärdaten selbst, wenn der Algo sicher ist, spielt das keine Rolle.
Abgesehen davon: du willst doch nur das Passwort verschlüsseln, das kann dann doch nicht soo viel an Daten sein (für eine moderne CPU schon lange nicht). Oder hab ich da was falsch verstanden?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Chryzler
      
Beiträge: 1097
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 12:45
Ich will ja jetzt nix sagen, aber, wenn jemand nen PacketSniffer wie Wireshark laufen lässt, dann nützt dir die Verschlüsselung eigentlich gar nix, weil das Passwort ja immernoch unverschlüsselt übertragen wird.
|
|
Sirke 
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 12:58
Der Verschlüsselungsvorgang ist hierbei total unwichtig, weil es mir auf diesen nicht an kommt! Um ihn kurz zu beschreiben: Es ist ein Feistel-Netzwerk mit zwei 128 Bit Blöcken, wobei in 16 Runden jeder Block mit dem MD5-Hash des anderen Blocks mittels XOR verknüpft wird!
Mit dem "Format", was wirklich schlecht von mir ausgedrückt ist, meine ich nur den Variablentyp!
Wenn ich dazu jetzt den Array of 0..1023 verwende, dann muss ich diesen als Array of Word verwenden, sodass von den 16 Bit des Words 6 Bit auf jeden fall Nullen sind! Dies ist eine ziemlich große Sicherheitslücke, wenn man 37,5% des Klartextes immer weiß! Daher möchte ich das sehr gerne umwandeln, um eben diese Lücke zu schließen!
Ich denke, ich habe doch mehr Ahnung von Verschlüsselung, wie du mir hier unterstellst, aber wie gesagt, die Verschlüselung ist nicht Bestandteil dieses Themas! Wenn du trotzdem Lust hast, kannst du ja mal versuchen nach der Beschreibung oben eine Lücke zu finden
Zu der Datengröße: Ich möchte ncht nur Passwörter, sondern auch andere relevante Daten abspeichern. Nicht alle unterliegen einer solch großen Geheimhaltung wie Passwörter, aber sollten trotzdem nur von dem entsprechnden Benutzer gelesen werden. Bereits bei ~100 Zeichen hat man eine kleine Wartezeit, aufgrund dieser Umrechnung. Meine Frage zeilte nur in die richtung, ob man dieses Problem iwie ohne diese vielen Hin- und Herschiebereien in einem String machen kann?!
Chryzler hat folgendes geschrieben: | Ich will ja jetzt nix sagen, aber, wenn jemand nen PacketSniffer wie Wireshark laufen lässt, dann nützt dir die Verschlüsselung eigentlich gar nix, weil das Passwort ja immernoch unverschlüsselt übertragen wird. |
Ich weiß, dass man so einem Problem nur mittels SSL aus dem Weg gehen kann! Dazu könnte man natürlich ein neues Thema eröffnen was ganu dies Diskutiert: Lohn es sich bei Programmen die auf Server im Internet zu greifen die Passwörter verschlüsselt zu speichern?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 19.02.07 13:44
Moin!
Sirke hat folgendes geschrieben: | Ich denke, ich habe doch mehr Ahnung von Verschlüsselung, wie du mir hier unterstellst, |
Bleib auf dem Teppich  es geht mir auch mehr um sowas hier:
Sirke hat folgendes geschrieben: | Mit dem "Format", was wirklich schlecht von mir ausgedrückt ist, meine ich nur den Variablentyp!
Wenn ich dazu jetzt den Array of 0..1023 verwende, dann muss ich diesen als Array of Word verwenden, sodass von den 16 Bit des Words 6 Bit auf jeden fall Nullen sind! |
Was soll denn bitte dieses ominöse "array of 0..1023" sein? array of Boolean, Byte, ... ?
Wenn ich dich richtig verstanden habe, dann brauchst du für deinen Verschlüsselungsalgo einen Speicherblock fester Größe. OK, ist zwar etwas merkwürdig, aber egal. Was jetzt aber diese "Konvertierung" angeht, kann ich dir leider immer noch nicht folgen...
Sirke hat folgendes geschrieben: | Zu der Datengröße: Ich möchte ncht nur Passwörter, sondern auch andere relevante Daten abspeichern. |
Mal ne ganz blöde Frage: warum nimmst du nicht einfach RC4? Schnell, leicht implementiert und sicher (genug).
Oder noch anders: warum nimmst du nicht einfach die Daten und verarbeitest diese als Binärblock mit Adresse/Länge modulo deiner Cipherblock-Größe?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Sirke 
      
Beiträge: 208
Erhaltene Danke: 2
|
Verfasst: Mo 19.02.07 14:37
OKAY, ich versuche es nochmal zu erklären: Ich habe Daten die ich verschlüsseln möchte und die mir als Zahl vorliegen! Das ist an sich nichts merkwürdiges, weil dies immer so ist, aber meine Zahlen sind von 0 bis 1023, also Array of 0..1023 (Übersetzt: N Zahlen zwischen 0 und 1023)! Wenn ich mit bekannten Variablentypen arbeite, z.B. Byte oder Word, stoße ich an Hindernisse:
Beim Byte passen nicht alle Zahlen in diesen Datentyp und beim Word noch viele mehr, sodass man das Word benutzen müsste, wobei aber bei der größten Zahl von 1023, was 10 Bit sind, immer noch 6 Bit frei hätte. Dadurch vergrößert man nicht nur unnütz die Datenmenge, sondern macht auch den Klartext sehr angreifbar, weil man weiß, dass von 16 Bit immer die ersten 6 Bit Nullen sind!
Egal welchen Algo ich also benutzen würde, ich hätte immer das selbe Problem, auf das ich dabei stoße: Diese 6 überflüssigen und an sich auch "gefährlichen" Bits!
Ich habe schon viel mit Rechenoperationen (mod und div) rumprobiert, aber bin nie zu einem Ergebnis gekommen, was nach dem Hin- und dem Zurückrechnen auf die selbe Lösung gekommen ist :/
Daher dachte ich, dass ihr vllt mir helfen könntet bzw. Ahnung habt, wie man das an sich angehen kann!
Jetzt iwie klarer geworden?
|
|
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 19.02.07 14:50
dann pack doch einfach deine zahlen auf 10bit zusammen, dann gehen die leeren 6 bit verlohren.
z.b.
Quelltext 1: 2: 3: 4: 5:
| a: word [bit 0 bis 9] := zahl1[bit 0 bis 9]; a: word [bit 10 bis 15] := zahl2[bit 0 ibs 5]; b: word [bit 0 bis 3] := zahl2[bit 6 bis 9]; b: word [bit 4 bis 14] := zahl3[bit 0 bis 9]; ... |
wäre dann ähnlich wie bei packed records...
ist zwar etwas bitfummelei, sollte aber doch recht einfach zu implementieren sein... <HTH>
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Mo 19.02.07 14:50
Hallo!
Der kleinste gemeinsame Nenner von 10 und 16 ist ja 80. Dementsprechend kannst du also in jeweils 5-Word-Variablen durch geschickten Einsatz von SHL und SHR den Wert von 8 deiner Zahlen hinterlegen.
Cu,
Udontknow
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 20.02.07 00:12
Moin!
Sirke hat folgendes geschrieben: | aber meine Zahlen sind von 0 bis 1023, also Array of 0..1023 (Übersetzt: N Zahlen zwischen 0 und 1023)!
[...]
Jetzt iwie klarer geworden? |
Yip.  Dass du einen Ausschnittbereichstyp direkt angegeben hast, hat mich wohl etwas verwirrt...
Sirke hat folgendes geschrieben: | weil man weiß, dass von 16 Bit immer die ersten 6 Bit Nullen sind!
Egal welchen Algo ich also benutzen würde, ich hätte immer das selbe Problem |
OK, ist jetzt klar.
Und damit empfehle ich auch den Tipp von Udontknow, das dürfte die Lösung sein.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|