AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

RC4 Textlänge

Ein Thema von Sierra · begonnen am 27. Dez 2006 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
Seite 2 von 5     12 34     Letzte » 
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#11

Re: RC4 Textlänge

  Alt 1. Jan 2007, 20:11
Wie gammatester schon sagte werden Strings in Delphi nicht von einem bestimmten Byte-Wert terminiert. Delphi orientiert sich lediglich an der Länge des Strings. Wenn du also einzig und allein Strings verschlüsselst und diese dann abspeicherst, sollte dir nichts passieren.

Delphi/Pascal ist jedoch mit seinen Strings ein Ausnahmefall. Windows arbeitet mit nullterminierten Strings. Wenn du nun deinen String zum Beispiel in einem Label darstellen willst, ruft die VCL Windows-Funktionen auf und konvertiert deinen String in einen nullterminierten String. Diese Konvertierung führt dazu, dass das erste #0 als ein Indikator für das Ende des Strings gewertet wird. Der Rest wird abgeschnitten. Der String 'Null' + #0 + 'terminiert' in einem Label wird also lediglich als 'Null' dargestellt werden.
Gruß St.Pauli
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#12

Re: RC4 Textlänge

  Alt 1. Jan 2007, 20:45
Zitat:
Die zweite Aussage ist allerdings schlichtweg falsch.
Ist sie leider nicht, höchstens misdeutend.

Nach vielen hunderten Supportmails zu meinem DEC weis ich eines mit gewisseheit:

Der Fragesteller hat mit RC4 Strings verschlüsselt und verwendet sie dann zb. in einem TMemo oder TStringList per Zuweisung von .Text oder ähnlichen VCL/RTL Funktionen. Und innerhalb dieser Funktionen entstehen Konvertieiungen -> Abschneiden weil #0 Terminator, oder entfernen von Carrige Return und/oder Line Feed. Ursachen sind unterschiedlich, weil die RTL Windows API Funktionen auf PChar Basis aufrufen, in TStringlist selber den String zerlegen und somit Zeichen entfernen usw.

Wenn ich also von der RTL und LongStrings geredet habe so ist das nur eine unzureichende "Kurzfassung" und sollte natürlich die VCL auch umfassen. Denn wie schon gesagt wurde: wenn man die LongStrings "pur" verwendet dann gehen keine Daten verloren noch werden sie autom. manipuliert. Benutzt man aber zb. TMemo/TStrings/TStringList und solch Stuff entstehen solche Nebeneffekte.

Die Frage abd den Fragesteller ist nun: Zeige deinen vollständigen Code, und was machst du mit den Strings !?

Gruß hagen
  Mit Zitat antworten Zitat
Sierra

Registriert seit: 3. Sep 2005
99 Beiträge
 
#13

Re: RC4 Textlänge

  Alt 2. Jan 2007, 10:00
Vielen Dank Hagen!
Also ich benutze, wie du schon treffend vermutet hast, ein Memo.

Zitat:
Ursachen sind unterschiedlich.
Und genau deswegen ist es nicht so leicht, herauszufinden, wie man dieses Problem umgeht.
Also ich nutze die ganz normale RC 4 Unit.
Diese wird dann so weiterverarbeitet.

Delphi-Quellcode:
procedure TForm1.hatVerschluesselnClick(Sender: TObject);
begin
  zText1:=hatMplain.Text;
  setLength(zText2,length(zText1));
  hatRC4.RC4Init(hatRC4, hatEschluessel.Text);
  hatRC4.RC4Code(hatRC4, zText1[1], zText2[1], Length(zText1));
  hatMcipher.Text:=zText2;
end;
Delphi-Quellcode:
procedure TForm1.hatEntschluesselnClick(Sender: TObject);
begin
  zText1:=hatMcipher.Text;
  setLength(zText2,length(zText1));
  hatRC4.RC4Init(hatRC4, hatEschluessel.Text);
  hatRC4.RC4Code(hatRC4, zText1[1], zText2[1], Length(zText1));
  hatMplain.Text:=zText2;
end;
  Mit Zitat antworten Zitat
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#14

Re: RC4 Textlänge

  Alt 2. Jan 2007, 23:18
Die letzte Zeile in deinen Quelltexten ist das von uns angesprochenen Probleme.* Hier wird (ohne das du es merkst) das String-Format konvertiert. Mach es so wie von negaH angesprochen und füge nicht den ASCII-Wert direkt sondern dessen hexaldezimale Darstellung in das Memo ein.

Hier von mir mal 0815 hingeschrieben:

Delphi-Quellcode:
function StringAsHex(Value : string) : string;
var
  i : integer;
begin
  SetLength(Result, Length(Value));
  for i := 1 to Length(Value) do
  begin
    Result[i] := IntToHex(Ord(Value[i]), 2);
  end;
end;
*Natürlich ist dann auch die erste Zeile falsch, da du dir dort das schon abgeschnittene Erebnis wiederholst.
Gruß St.Pauli
  Mit Zitat antworten Zitat
Sierra

Registriert seit: 3. Sep 2005
99 Beiträge
 
#15

Re: RC4 Textlänge

  Alt 3. Jan 2007, 11:58
Du meinst doch dann statt

zText1:=hatMplain.Text; praktisch

zText1:=StrToHex(hatMplain.Text); oder?

Jedenfalls funktioniert das so leider auch nicht.
Die HEX-Umwandlung scheint ja eine gute Idee zu sein, aber irgendwie funktioniert das leider nicht alles so wie es soll.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.657 Beiträge
 
Delphi 10.4 Sydney
 
#16

Re: RC4 Textlänge

  Alt 3. Jan 2007, 12:03
nein, den Ciphertext solltest Du in Hex umwandeln, denn da kommen
Zeichen wie #0 vor.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Sierra

Registriert seit: 3. Sep 2005
99 Beiträge
 
#17

Re: RC4 Textlänge

  Alt 3. Jan 2007, 12:10
Das klappt leider auch nicht.
Oder muss man das auch wieder zurückumwandeln?
  Mit Zitat antworten Zitat
Sierra

Registriert seit: 3. Sep 2005
99 Beiträge
 
#18

Re: RC4 Textlänge

  Alt 3. Jan 2007, 12:31
Muss man die Umwandlung vor oder nach dem Verschlüsseln durchführen?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.657 Beiträge
 
Delphi 10.4 Sydney
 
#19

Re: RC4 Textlänge

  Alt 3. Jan 2007, 12:35
Hallo,

ich habe im StringAsHex mal etwas geändert.
Weil ein TextZeichen = 1 Byte und daraus werden 2 HexZeichen.

Delphi-Quellcode:
function StringAsHex(Value : string) : string;
var
  i : integer;
begin
  result:='';
  for i := 1 to Length(Value) do
  begin
    Result := result + IntToHex(Ord(Value[i]), 2);
  end;
end;
Vor dem Entschlüsseln mußt Du dann die HexWerte wieder in ihre Ursprungswerte wandeln.

Delphi-Quellcode:
  FUNCTION HexToByte(s:shortstring):Byte;
  Const
     hex : string = '0123456789abcdef';
  VAR
    num:byte;
  BEGIN

     s:= lowercase(s);
     num:=(pos(s[1],hex)-1)*16+(pos(s[2],hex)-1);

     Result:=byte(num);
  END;
Delphi-Quellcode:
function HexToString(HexString:String):String;
var
  i: Integer;
begin
  for i:= 1 to lenght(HexString) div 2 do
  begin
    result:=result + chr(HexToByte(HexString[i]+HexString[i+1]));
  end;
end;

Delphi-Quellcode:
procedure TForm1.hatVerschluesselnClick(Sender: TObject);
begin
  zText1:=hatMplain.Text;
  setLength(zText2,length(zText1));
  hatRC4.RC4Init(hatRC4, hatEschluessel.Text);
  hatRC4.RC4Code(hatRC4, zText1[1], zText2[1], Length(zText1));
  hatMcipher.Text:=StringAsHex(zText2);
end;

Delphi-Quellcode:
procedure TForm1.hatEntschluesselnClick(Sender: TObject);
begin
  zText1:=HexToString(hatMcipher.Text);
  setLength(zText2,length(zText1));
  hatRC4.RC4Init(hatRC4, hatEschluessel.Text);
  hatRC4.RC4Code(hatRC4, zText1[1], zText2[1], Length(zText1));
  hatMplain.Text:=zText2;
end;

Hoffe es sind nicht allzuviele Fehler drin.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.657 Beiträge
 
Delphi 10.4 Sydney
 
#20

Re: RC4 Textlänge

  Alt 3. Jan 2007, 12:38
Zitat von Sierra:
Muss man die Umwandlung vor oder nach dem Verschlüsseln durchführen?
Die Umwandlung muß durchgeführt werden bevor der Ciphertext in das Memo geschrieben wird.
Wird die Umwandlung vor dem Verschlüsseln durchgeführt, werden nur die HexZeichen verschlüsselt
und der Ciphertext hat dann wieder lauter solche Zeichen wie #0 etc.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf