Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   C# DEC 5 Example in C# konvertieren (https://www.delphipraxis.net/182613-dec-5-example-c-konvertieren.html)

Movementroboter 5. Nov 2014 08:57

DEC 5 Example in C# konvertieren
 
Hallo Leute,
kann mir jemand diesen Code in C# Konvertieren ?

Code:

---

uses
  DECUtil, DECCipher, DECHash, DECFmt;
 
...

var
  ACipherClass: TDECCipherClass = TCipher_Rijndael;
  ACipherMode: TCipherMode = cmCBCx;
  AHashClass: TDECHashClass = THash_Whirlpool;
  ATextFormat: TDECFormatClass = TFormat_Mime64;
  AKDFIndex: LongWord = 1;

function Encrypt(const AText: String; const APassword: String): String; overload;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function Encrypt(const AText: WideString; const APassword: WideString): WideString; overload;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(AData, Length(AText) * SizeOf(AText[1]));
    Encode(AText[1], AData[1], Length(AData));
    Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(APass);
  end;
end;

function Decrypt(const AText: String; const APassword: String): String; overload;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

function Decrypt(const AText: WideString; const APassword: WideString): WideString; overload;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    if ACheck <> CalcMAC then
      raise Exception.Create('Invalid data');
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  s, k: WideString;
begin
  s := 'The quick brown fox jumps over the lazy dog';
  k := 'password';
  Memo1.Lines.Clear;
  Memo1.Lines.Add(
    'Encode Test: ' + Encrypt(s, k) + sLineBreak +
    'Decode Test: ' + Decrypt(Encrypt(s, k), k)
  );
end;

Sir Rufo 5. Nov 2014 09:05

AW: DEC 5 Example in C# konvertieren
 
  • Benutze doch bitte die Delphi-Tags für Delphi-Source
  • Hausaufgaben werden hier nicht erledigt
    (eine Möglichkeit wäre das Unterforum Job-Angebote)

jensw_2000 5. Nov 2014 11:06

AW: DEC 5 Example in C# konvertieren
 
Zitat:

Zitat von Movementroboter (Beitrag 1278726)
Hallo Leute,
kann mir jemand diesen Code in C# Konvertieren ?
Code:
  DECUtil, DECCipher, DECHash, DECFmt;

Hey. Klar. Liefer mir schnell den übersetzten C# Code für die DEC Units und deren Abhängigkeiten. Dann tippe ich Dir den Rest schnell zusammen.... :snowball:

Oder:
Schau Dir die MSDN Doku von System.Security.Cryptography an.
Dort findest Du diverse symmetrische Verschlüsselungen (unter anderem auch Rijndael) und ein par Codeschnipsel.

gammatester 5. Nov 2014 11:11

AW: DEC 5 Example in C# konvertieren
 
Auch so wird das problematisch, da eine der berühmt/berüchtigten proprietären DEC-Verschlüsselungsmethoden verwendet wird.
Zitat:

cmCBCx = Cipher Block Chainung, with CFB8 padding of truncated final block
Das müßte dann selbstverständlich in C# nachgebildet werden. Alternativ: verwende Standard-CBC und Dein eigenes Padding auf Blockgrenzen.

Und die restlichen Probleme sind natürlich nicht verschwunden:
  • Welche Schlüsselgröße wird verwendet?
  • Wie wird der Schlüssel aus dem Passwort berechnet? (Auch KDFx ist wieder proprietär: "class function TDECHash.KDFx // DEC's own KDF, even stronger".)
  • ...
Eventuell findest Du weitere Infos/Hinweise hier: http://www.delphipraxis.net/171047-d...uf-delphi.html

cookie22 5. Nov 2014 12:30

AW: DEC 5 Example in C# konvertieren
 
Ist das tatsächlich eine Hausaufgabe von deinem Informatiklehrer?

Sinnfreier geht es nämlich kaum noch. Wie Gammatester schon sagte, KDFx ist eine vom Autor veränderte Variante von KDF2. Dein Leher kann nicht von dir verlangen das in eine andere Sprache wie C# umzusetzen, das übersteigt Fähigkeiten eines normalen Informatikschülers bei weitem.

Warum jetzt auf einmal C#?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:02 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