AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RCx-Verschlüsselung

Ein Thema von himitsu · begonnen am 27. Sep 2009 · letzter Beitrag vom 16. Jun 2011
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

Re: RCx-Verschlüsselung

  Alt 13. Jan 2010, 07:53
Zitat von negaH:
PS: der Kommentar im Source das es RC5 wäre stammt nicht von mir !
Hab's mal auf RC4 geändert ... sollte wohl besser passen.

@Shark99: Es kann sein, daß Delphi5 in Bezug auf das Überladen (overload) noch einige Kinderkrankheiten aufweist.

Wenn ich mich jetzt nicht vertippt hab, dann sollte dieses eine Version ohne Overloading sein,
allerdings mußt du da vermutlich deinen Code etwas anpassen, da hier über den Funktionsnamen und nicht mehr über Parameter unterschieden wird.
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 RC4 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);
procedure RCxInitA (var RCx: TRCxContext; const Key: AnsiString);
procedure RCxInitW (var RCx: TRCxContext; const Key: WideString);
procedure RCxEncode (var RCx: TRCxContext; const Source; var Dest; Count: Integer);
function RCxEncodeA(var RCx: TRCxContext; const Value: AnsiString): AnsiString;
function RCxEncodeW(var RCx: TRCxContext; const Value: WideString): WideString;
procedure RCxDecode (var RCx: TRCxContext; const Source; var Dest; Count: Integer);
function RCxDecodeA(var RCx: TRCxContext; const Value: AnsiString): AnsiString;
function RCxDecodeW(var RCx: TRCxContext; const Value: WideString): WideString;
procedure RCxDone (var RCx: TRCxContext);

// all in one encode/decode
function RCxEncode_A(const Value, Password: AnsiString): AnsiString;
function RCxEncode_W(const Value, Password: WideString): WideString;
function RCxDecode_A(const Value, Password: AnsiString): AnsiString;
function RCxDecode_W(const Value, Password: WideString): WideString;

// random number generator based on RCx
procedure RCxSeed (const Seed; SeedSize: Integer);
procedure RCxSeedA(const Seed: AnsiString);
procedure RCxSeedW(const Seed: WideString);
procedure RCxRandomize;
function RCxRandom (Range: Cardinal = 0): Cardinal;
function RCxRandomStringA(Length: Integer): AnsiString;
function RCxRandomStringW(Length: Integer): WideString;

implementation

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 RCxInitA(var RCx: TRCxContext; const Key: AnsiString);
begin
  RCxInit(RCx, Pointer(Key)^, Length(Key));
end;

procedure RCxInitW(var RCx: TRCxContext; const Key: WideString);
begin
  RCxInit(RCx, Pointer(Key)^, Length(Key) * 2);
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 RCxEncodeA(var RCx: TRCxContext; const Value: AnsiString): AnsiString;
var
  Count: Integer;
begin
  Count := Length(Value);
  SetLength(Result, Count);
  RCxEncode(RCx, Value[1], Result[1], Count);
end;

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

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

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

function RCxEncode_A(const Value, Password: AnsiString): AnsiString;
var
  RCx: TRCxContext;
begin
  RCxInitA(RCx, Password);
  try
    Result := RCxEncodeA(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

function RCxEncode_W(const Value, Password: WideString): WideString;
var
  RCx: TRCxContext;
begin
  RCxInitW(RCx, Password);
  try
    Result := RCxEncodeW(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

function RCxDecode_A(const Value, Password: AnsiString): AnsiString;
var
  RCx: TRCxContext;
begin
  RCxInitA(RCx, Password);
  try
    Result := RCxDecodeA(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

function RCxDecode_W(const Value, Password: WideString): WideString;
var
  RCx: TRCxContext;
begin
  RCxInitW(RCx, Password);
  try
    Result := RCxDecodeW(RCx, Value);
  finally
    RCxDone(RCx);
  end;
end;

var
  FRCxRegister: TRCxContext;

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

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

procedure RCxSeedW(const Seed: WideString);
begin
  RCxSeed(Pointer(Seed)^, Length(Seed) * 2);
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;

procedure RCxRandomStringA(Length: Integer; var Result: AnsiString);
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] := AnsiChar(FRCxRegister.D[0]);
  end;
end;

procedure RCxRandomStringW(Length: Integer; var Result: WideString);
//begin
// SetLength(Result, Length);
// for I := 1 to Length do
// begin
// RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
// W := FRCxRegister.D[0];
// RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
// Result[I] := WideChar((Word(FRCxRegister.D[0]) shl 8) or W);
// end;
//end;
var
  I: Integer;
  W: Word;
begin
  W := 0;
  SetLength(Result, Length);
  for I := 1 to Length * 2 do
  begin
    RCxEncode(FRCxRegister, FRCxRegister.D, FRCxRegister.D, SizeOf(FRCxRegister.D));
    if Odd(I) then W := FRCxRegister.D[0]
    else Result[I div 2] := WideChar((Word(FRCxRegister.D[0]) shl 8) or W);
  end;
end;

const
  FRCxSeed: TGUID = '{F4D35205-2B59-42B0-8B8F-239855B6DD2B}';

initialization
  RCxSeed(FRCxSeed, SizeOf(FRCxSeed));

finalization

end.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
thepaine91

Registriert seit: 29. Okt 2009
Ort: Neckarsulm
36 Beiträge
 
Delphi 6 Enterprise
 
#2

AW: RCx-Verschlüsselung

  Alt 19. Mai 2011, 09:12
Super das sich schon jemand die Arbeit gemacht hat das ganze Unicode fähig zu machen, =) war grad dabei das selbst in Angriff zu nehmen....

Danke an himitsu.
>>> Hier könnte eine Signatur stehen <<<
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: RCx-Verschlüsselung

  Alt 19. Mai 2011, 09:25
Das sieht jetzt aber noch schlimmer aus, als vorher:
Delphi-Quellcode:
procedure RCxInit (var RCx: TRCxContext; const Key; KeySize: Integer);
procedure RCxInitA (var RCx: TRCxContext; const Key: AnsiString);
procedure RCxInitW (var RCx: TRCxContext; const Key: WideString);
procedure RCxEncode (var RCx: TRCxContext; const Source; var Dest; Count: Integer);
function RCxEncodeA(var RCx: TRCxContext; const Value: AnsiString): AnsiString;
function RCxEncodeW(var RCx: TRCxContext; const Value: WideString): WideString;
procedure RCxDecode (var RCx: TRCxContext; const Source; var Dest; Count: Integer);
function RCxDecodeA(var RCx: TRCxContext; const Value: AnsiString): AnsiString;
function RCxDecodeW(var RCx: TRCxContext; const Value: WideString): WideString;
procedure RCxDone (var RCx: TRCxContext);

// all in one encode/decode
function RCxEncode_A(const Value, Password: AnsiString): AnsiString;
function RCxEncode_W(const Value, Password: WideString): WideString;
function RCxDecode_A(const Value, Password: AnsiString): AnsiString;
function RCxDecode_W(const Value, Password: WideString): WideString;

// random number generator based on RCx
procedure RCxSeed (const Seed; SeedSize: Integer);
procedure RCxSeedA(const Seed: AnsiString);
procedure RCxSeedW(const Seed: WideString);
procedure RCxRandomize;
function RCxRandom (Range: Cardinal = 0): Cardinal;
function RCxRandomStringA(Length: Integer): AnsiString;
function RCxRandomStringW(Length: Integer): WideString;
Das schreit ja gerade zu nach einer Klasse.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Root2k

Registriert seit: 7. Jun 2011
Ort: Ulm
49 Beiträge
 
Delphi XE Enterprise
 
#4

AW: RCx-Verschlüsselung

  Alt 16. Jun 2011, 15:06
Sorry, falscher Bereich!

Geändert von Root2k (16. Jun 2011 um 15:10 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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