AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi RCx.pas unter Delphi2009 anderes Ergebnis als unter Delphi7
Thema durchsuchen
Ansicht
Themen-Optionen

RCx.pas unter Delphi2009 anderes Ergebnis als unter Delphi7

Ein Thema von Kharlanki · begonnen am 23. Nov 2008 · letzter Beitrag vom 21. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#1

RCx.pas unter Delphi2009 anderes Ergebnis als unter Delphi7

  Alt 23. Nov 2008, 18:45
Hi,

ich schau mir gerade Delphi2009 mal an und habe auch gleich nen Problem mit einem Delphi7-Programm.

Ich nutze die RCx.pas von Hagen und die liefert mir, wenn ich mein Programm unter D2009 kompiliere andere Ergebnisse als unter D7 kompiliert.

Delphi-Quellcode:
{
Copyright:      2002 Hagen Reddmann
Author:        Hagen Reddmann, HaReddmann bei T-Online punkt de
Remarks:        All rights reserved
Version:        open source, developed on D5
Description:    derivate of RC5 stream cipher with internal cipher feedback and stronger keysetup
                includes secure one way pseudo random number generator
}


unit RCx;
{$A+,B-,C-,D-,E-,F-,G+,H+,I-,J+,K-,L-,M-,N+,O+,P+,Q-,R-,S-,T-,U+,V+,W-,X+,Y-,Z1} 

interface

type
  TRCxContext = record
    D: array[Byte] of Byte;
    I,J,F: Byte;
  end;

procedure RCxInit(var RCx: TRCxContext; const Key; KeySize: Integer); overload;
procedure RCxInit(var RCx: TRCxContext; const Key: String); overload;
procedure RCxEncode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); overload;
function RCxEncode(var RCx: TRCxContext; const Value: String): String; overload;
procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer); overload;
function RCxDecode(var RCx: TRCxContext; const Value: String): String; overload;
procedure RCxDone(var RCx: TRCxContext); overload;

// all in one encode/decode
function RCxEncode(const Value, Password: String): String; overload;
function RCxDecode(const Value, Password: String): String; overload;

// random number generator based on RCx
procedure RCxSeed(const Seed; SeedSize: Integer); overload;
procedure RCxSeed(const Seed: String); overload;
procedure RCxRandomize; overload;
function RCxRandom(Range: Cardinal = 0): Cardinal; overload;
function RCxRandomString(Length: Integer): String; overload;

implementation

uses Windows;

type
  PByteArray = ^TByteArray;
  TByteArray = array[0..MaxInt -1] of Byte;

procedure RCxInit(var RCx: TRCxContext; const Key; KeySize: Integer);
var
  R,S,T,K: Byte;
  L: Integer;
  M: array[Byte] of Byte;
begin
  with RCx do
  try
    L := 0;
    for S := 0 to 255 do
    begin
      D[S] := S;
      M[S] := TByteArray(Key)[S mod KeySize] xor L;
      L := (L + M[S] * 257) mod MaxInt +1;
    end;
    I := 0;
    J := 0;
    R := L;
    F := L shr 8;
    for S := 0 to 255 do
    begin
      Inc(R, D[S] + M[S]);
      T := D[S];
      D[S] := D[R];
      D[R] := T;
    end;
  finally
    R := 0;
    S := 0;
    T := 0;
    L := 0;
    FillChar(M, SizeOf(M), 0);
  end;
end;

procedure RCxInit(var RCx: TRCxContext; const Key: String);
begin
  RCxInit(RCx, Pointer(Key)^, Length(Key));
end;

procedure RCxDone(var RCx: TRCxContext);
begin
  FillChar(RCx, SizeOf(RCx), 0);
end;

procedure RCxEncode(var RCx: TRCxContext; const Source; var Dest; Count: Integer);
var
  S: TByteArray absolute Source;
  O: TByteArray absolute Dest;
  C: Integer;
  T,K: Byte;
begin
  with RCx do
    for C := 0 to Count -1 do
    begin
      Inc(I);
      T := D[I];
      Inc(J, T);
      D[I] := D[J] xor F;
      D[J] := T - F;
      Inc(T, D[I]);

      K := S[C];
      O[C] := K xor D[T];
      F := F xor K;
    end;
end;

procedure RCxDecode(var RCx: TRCxContext; const Source; var Dest; Count: Integer);
var
  S: TByteArray absolute Source;
  O: TByteArray absolute Dest;
  C: Integer;
  T,K: Byte;
begin
  with RCx do
    for C := 0 to Count -1 do
    begin
      Inc(I);
      T := D[I];
      Inc(J, T);
      D[I] := D[J] xor F;
      D[J] := T - F;
      Inc(T, D[I]);

      K := S[C] xor D[T];
      O[C] := K;
      F := F xor K;
    end;
end;

function RCxEncode(var RCx: TRCxContext; const Value: String): String;
var
  Count: Integer;
begin
  Count := Length(Value);
  SetLength(Result, Count);
  RCxEncode(RCx, Value[1], Result[1], Count);
end;

function RCxDecode(var RCx: TRCxContext; const Value: String): String;
var
  Count: Integer;
begin
  Count := Length(Value);
  SetLength(Result, Count);
  RCxDecode(RCx, Value[1], Result[1], Count);
end;

function RCxEncode(const Value, Password: String): String;
var
  RCx: TRCxContext;
begin
  RCxInit(RCx, Password);
  try
    Result := RCxEncode(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

function RCxDecode(const Value, Password: String): String;
var
  RCx: TRCxContext;
begin
  RCxInit(RCx, Password);
  try
    Result := RCxDecode(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

var
  FRCxRegister: TRCxContext;

procedure RCxSeed(const Seed; SeedSize: Integer);
begin
  RCxInit(FRCxRegister, Seed, SeedSize);
end;

procedure RCxSeed(const Seed: String);
begin
  RCxSeed(Pointer(Seed)^, Length(Seed));
end;

procedure RCxRandomize;
var
  Tick: Cardinal;
begin
  Tick := GetTickCount;
  FRCxRegister.F := Tick;
  FRCxRegister.I := Tick shr 8;
  FRCxRegister.J := Tick shr 16;
  RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
end;

function RCxRandom(Range: Cardinal): Cardinal;
type
  PCardinal = ^Cardinal;
begin
  RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
  Result := PCardinal(@FRCxRegister.D)^;
  if Range > 1 then Result := Result mod Range;
end;

function RCxRandomString(Length: Integer): String;
var
  I: Integer;
begin
  SetLength(Result, Length);
  for I := 1 to Length do
  begin
    RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
    Result[I] := Char(FRCxRegister.D[0]);
  end;
end;

const
  FRCxSeed: TGUID = '{F4D35205-2B59-42B0-8B8F-239855B6DD2B}';
initialization
  RCxSeed(FRCxSeed, SizeOf(FRCxSeed));
finalization
end.
Wo liegt das Problem? Hat sich zwischen D7 und D2009 in dem Bereich was geaendert? Was muss ich in D2009 anderes programmieren?
Gruss,
Matthias

  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 23. Nov 2008, 18:50
Der Typ String steht in Delphi 2009 für einen Unicodestring, in früheren Versionen für einen Ansistring.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 23. Nov 2008, 18:56
Durch Delphi 2009 kommen nun halt alle Code-Stellen zum Vorschein, die Strings für Binärdaten missbrauchen. Für Binärdaten sollte man in Delphi 2009 entweder auf TBytes (=array of Byte) or auf RawByteString zurückgreifen.
  Mit Zitat antworten Zitat
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#4

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 23. Nov 2008, 19:27
Reicht es, wenn ich alle String-Vorkommen in AnsiString aendere? Oder gibt es eine neuere Version der RCx.pas?
Gruss,
Matthias

  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 23. Nov 2008, 23:11
Zitat von Kharlanki:
Reicht es, wenn ich alle String-Vorkommen in AnsiString aendere?
Wenn man über den Code so drüberschaut, würde ich sagen, dass die Ersetzung zum Ziel führt. Wobei der Delphi 2007 AnsiString nicht zu 100% dem Delphi 2009 AnsiString entspricht, da der Compiler bei AnsiString die CodePage mit herumschleppt und beim kleinsten Anzeichen einer Zuweisung die String-Daten in eine andere CodePage konvertieren könnte, was zu Informationsverlust führen kann. Der richtige Typ wäre RawByteArray der zu D2009 AnsiString Zuweisungskompatibel ist und dem D2007 AnsiString entspricht, da er bei Zuweisungen nie String-Daten konvertiert.

Delphi 2007 AnsiString = Delphi 2009 RawByteString.

Delphi 2009 AnsiString = Delphi 2007 AnsiString mit SetCodePage Aufrufen
  Mit Zitat antworten Zitat
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#6

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 24. Nov 2008, 15:17
So ganz haut das noch nicht hin.

[snip]

[edit]
Ich habe jetzt alles so umbenannt:
# String nach AnsiString
# PChar nach PAnsiChar
# char nach AnsiChar

Damit laeufts jetzt.
[/edit]

Danke fuer die Hilfe!
Gruss,
Matthias

  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 24. Nov 2008, 17:55
Zitat von Kharlanki:
# String nach AnsiString
Liest du eigentlich meine Kommentare oder ignorierst du mich? Ich wünsche dir viel Spaß, wenn der Compiler dir ein Ei legt und die Binärdaten im AnsiString in eine andere Zeichenkodierung umwandelt und sie damit verfälscht.
  Mit Zitat antworten Zitat
Kharlanki

Registriert seit: 9. Jul 2003
Ort: Düsseldorf
50 Beiträge
 
#8

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 24. Nov 2008, 18:16
Ich habe es schon im Hinterkopf, dass es Probleme geben KANN. Aber bei den momentanen Daten klappt es eben und da ich auch nur Zeichen aus dem einfachen Zeichensatz nutze (Versionsnummer + URLs ohne Umlaute), denke ich, dass ich damit hinkommen werde.
Gruss,
Matthias

  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 25. Nov 2008, 10:30
Besser wäre ein eigener Typ:
Delphi-Quellcode:
type
{$IFDEF VER140}
  RawAnsiString = type AnsiString($FFFF);
{$ELSE}
  RawAnsiString = type AnsiString;
{$ENDIF}
Und dann string überall durch diesen ersetzen, z.B.
function RCxEncode(var RCx: TRCxContext; const Value: RawAnsiString): String; overload; Dann kannst Du es unter beiden Delphi-Versionen kompilieren (bis D2009 sich entscheidet, den Sourcecode in Unicode zu speichern).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#10

AW: Re: RCx.pas unter Delphi2009 anderes Ergebnis als unter Delp

  Alt 21. Dez 2011, 13:17
Besser wäre ein eigener Typ:
Delphi-Quellcode:
type
{$IFDEF VER140}
  RawAnsiString = type AnsiString($FFFF);
{$ELSE}
  RawAnsiString = type AnsiString;
{$ENDIF}
...
Die Varianten mit VERxxx sind eigentlich "doof", denn dieses bezieht sich immer auf genau eine bestimmte Compiler-Version
Delphi-Quellcode:
type
{$IF CompilerVersion <= 14.0}
  RawAnsiString = type AnsiString;
{$IFEND}
oder gar sowas
Delphi-Quellcode:
type
{$IF (CompilerVersion >= 7.0) and (CompilerVersion <= 14.0)}
  RawAnsiString = type AnsiString;
{$IFEND}
Ansonsten würde ich hier einfach nach dem Typen gehn, ob dieser existiert
Delphi-Quellcode:
type
{$IF not Declared(RawAnsiString)}
  RawAnsiString = type AnsiString;
{$IFEND}

Wie war das nochmal mit dem D2007?
Es gab schon die CodePage in den Strings, aber noch keinen RawByteString, oder wie?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz