Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Passwort Entschlüsseln (https://www.delphipraxis.net/182529-passwort-entschluesseln.html)

Movementroboter 30. Okt 2014 09:11

Passwort Entschlüsseln
 
Hallo Leute,
ich benutze in der Schule jetzt seit 5 Wochen Delphi und habe mich ein bisschen mit dem Delphi Encryption Compendium 5.2 auseinander gesetzt. Jetzt habe ich von meinem Lehrer eine Test-Datenbank bekommen und soll versuchen mit den Angaben die er mir gegeben hat die Passwörter die in der Datenbank stehen zu entschlüsseln.

Angaben die ich von meinem Lehrer erhalten habe:
// Verschlüsselungsstandards
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1);
IdentityBase := $84485225;
RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);

Wie kann ich mit den Angaben die Passwörter entschlüsseln?

LG,
Movement

Klaus01 30. Okt 2014 09:24

AW: Passwort Entschlüsseln
 
Hallo,

Rijndael (AES) ist ein symetrisches Verfahren.
Schlüssel die zum Verschlüsseln benutzt werden, werden auch zum Entschlüsseln wieder benötigt.

Grüße
Klaus

Movementroboter 30. Okt 2014 09:48

AW: Passwort Entschlüsseln
 
Hallo Klaus,
danke erstmal für die schnelle Antwort,
Was bedeutet den?
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1);
IdentityBase := $84485225;
RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);


Hast du vielleicht ein Beispielcode an dem ich mich orientieren kann ?

LG,
Movementroboter

Klaus01 30. Okt 2014 09:52

AW: Passwort Entschlüsseln
 
Hallo,

nein, Beispiel-Code habe ich nicht.
Aber vielleicht hilft der (etwas längere) Thread zum Verständnis.

Grüße
Klaus

Sir Rufo 30. Okt 2014 09:56

AW: Passwort Entschlüsseln
 
Nun es wird dort im DEC etwas geben was
Delphi-Quellcode:
Encrypt
und
Delphi-Quellcode:
Decrypt
lautet. Suche danach. Dann kannst du damit schon mal einen String verschlüsseln und wieder entschlüsseln.

Wenn du das geschafft hast, dann wende das Erlernte auf die Einträge in der Datenbank an.

gammatester 30. Okt 2014 10:02

AW: Passwort Entschlüsseln
 
Ich finde alle Angaben unbrauchbar, selbst
Delphi-Quellcode:
SetDefaultCipherClass(TCipher_Rijndael);
sagt ja nicht, daß letzlich AES/Rinjdael benutzt wird.

Folgende Punkte sind zu klären:
  • Welche Algorithmus wird verwendet? (Vermutlich AES)
  • Welche Schlüsselgröße (128, 192, 256 Bit, die 17 Zeichen 'U5r5klO0zwu674593' können nicht der Schlüssel sein!)
  • Wie wird der Schüssel aus 'U5r5klO0zwu674593' berechnet?
  • Welcher Betriebsmodus wird verwendet (ECB, CBC etc)?
  • Welches Padding wird verwendet, wenn ECB oder CBC benutzt wird?
PS: Im übrigen sollte man Passwörter nie verschlüsseln und speichern, sondern gesalzene Hashwerte.

Movementroboter 30. Okt 2014 10:12

AW: Passwort Entschlüsseln
 
1. Es wird AES benutzt
2. Mein Lehrer meinte er hat den Schlüssel willkürlich eingeben (einfach auf der Tastatur was gedrückt).
3. Gute Frage
4. Leider hat er mir dazu keine Informationen geliefert :(
5. Padding ? was meinst du damit ? http://de.wikipedia.org/wiki/Padding_(Informatik) ?

Movementroboter 30. Okt 2014 10:33

AW: Passwort Entschlüsseln
 
Also ich habe eben mein Lehrer auf seinem Handy angerufen
und habe ihn die Fragen gestellt die mir gammatester genannt hatte

Er meinte der Schlüssel U5r5klO0zwu674593 wurde damals so akzeptiert

Welchen Betriebsmodi weiß er nicht mehr :?

Padding was für Padding ?:lol:

gammatester 30. Okt 2014 10:44

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Movementroboter (Beitrag 1278022)
5. Padding ? was meinst du damit ?

Dein Link funktioniert bei mir nicht, hier der zum englischen Wiki http://en.wikipedia.org/wiki/Padding_%28cryptography%29

Hintergrund: AES verschlüsselt 128-Bit-Blöcke. Es gibt Betriebsmodi, die beliebige Bytemuster verabeiten können. Und solche die nur auf 16-Byte-Blöcken arbeiten (dies sind zB das einfache ECB oder das oft verwendete CBC), hier muß man dann irgendwie auf 16-Byte-Vielfache auffüllen, zB durch 0, oder die erwähnten Paddingmethoden.

Wenn nur 'U5r5klO0zwu674593' gegeben ist, wird man das normalerweise hashen, zB mit SHA1. Da SHA1 160-Bit hat, vermute ich das davon 128 Bit benutzt werden (die niedrigsten?, die höchsten?).

Aber wie gesagt, alles nur Vermutung.

Movementroboter 30. Okt 2014 10:57

AW: Passwort Entschlüsseln
 
Kann es sein das U5r5klO0zwu674593 das Salz ist ?

gammatester 30. Okt 2014 11:10

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Movementroboter (Beitrag 1278035)
Kann es sein das U5r5klO0zwu674593 das Salz ist ?

Kann sein, aber Du brauchst trotzdem einen Schlüssel (wenn wirklich verschlüsselt wird). Edit: Glaube eher nicht, da das Salz ja immer verschieden sein sollte, nicht nur ein einziges.

Wie schon man angedeutet, kann es aber auch sein, daß gar nicht verschlüsselt wird, sondern Salz und SHA1(passwort) gespeichert werden.

Ohne genaue Angaben, was eigentlich gemacht wird, hast Du kaum eine Chance. Kennst Du denn zumindest die Datenbankstruktur? Vielleicht kann man daraus etwas mehr Informationen ableiten.

Sir Rufo 30. Okt 2014 13:06

AW: Passwort Entschlüsseln
 
Wenn man einen Blick auf das DEC wirft
Zitat:

Zitat von Movementroboter (Beitrag 1278010)
... habe mich ein bisschen mit dem Delphi Encryption Compendium 5 auseinander gesetzt.

dann sollte einem doch auch die Datei Example.txt ins Auge springen.

Und bis auf die Tatsache, dass dort mit
Delphi-Quellcode:
with
warum auch immer das Lesen und Verstehen des Codes erschwert wird, ist dort aber genau das enthalten, was hier benötigt wird.
Delphi-Quellcode:
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;
function Decrypt( const AText: String; const APassword: String ): String; overload;
Damit das Verstehen besser wird habe ich mal dieses
Delphi-Quellcode:
with
entfernt und die Parameter mit Kommentaren versehen.
Delphi-Quellcode:
program dp_182529;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  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;
var
  LSalt: Binary;
  LData: Binary;
  LPass: Binary;
  LCipher: TDECCipher;
begin
  LCipher := ValidCipher(
    { CipherClass } ACipherClass ).
  { > } Create;
  try
    LSalt := RandomBinary( 16 );
    LPass := ValidHash(
      { HashClass } AHashClass ).
    { > } KDFx(
      { Data } APassword[1],
      { DataSize } Length( APassword ) * SizeOf( APassword[1] ),
      { Seed } LSalt[1],
      { SeedSize } Length( LSalt ),
      { MaskSize } LCipher.Context.KeySize,
      { Format } TFormat_Copy,
      { Index } AKDFIndex );
    LCipher.Mode := ACipherMode;
    LCipher.Init( LPass );
    SetLength( LData, Length( AText ) * SizeOf( AText[1] ) );
    LCipher.Encode(
      { Source } AText[1],
      { Dest } LData[1],
      { DataSize } Length( LData ) );
    Result := ValidFormat(
      { FormatClass } ATextFormat ).
    { > } Encode(
      { Value } LSalt + LData + LCipher.CalcMAC );
  finally
    LCipher.Free;
    ProtectBinary( LSalt );
    ProtectBinary( LData );
    ProtectBinary( LPass );
  end;
end;

function Decrypt( const AText: String; const APassword: String ): String;
var
  LSalt: Binary;
  LData: Binary;
  LCheck: Binary;
  LPass: Binary;
  LLen: Integer;
  LCipher: TDECCipher;
begin
  LCipher := ValidCipher(
    { CipherClass } ACipherClass ).
  { > } Create;
  try
    LSalt := ValidFormat(
      { FormatClass } ATextFormat ).
    { > } Decode(
      { Value } AText );
    LLen := Length( LSalt ) - 16 - LCipher.Context.BufferSize;
    LData := System.Copy( LSalt, 17, LLen );
    LCheck := System.Copy( LSalt, LLen + 17, LCipher.Context.BufferSize );
    SetLength( LSalt, 16 );
    LPass := ValidHash(
      { HashClass } AHashClass ).
    { > } KDFx(
      { Data } APassword[1],
      { DataSize } Length( APassword ) * SizeOf( APassword[1] ),
      { Seed } LSalt[1],
      { SeedSize } Length( LSalt ),
      { MaskSize } LCipher.Context.KeySize,
      { Format } TFormat_Copy,
      { Index } AKDFIndex );
    LCipher.Mode := ACipherMode;
    LCipher.Init(
      { Key } LPass );
    SetLength( Result, LLen div SizeOf( AText[1] ) );
    LCipher.Decode(
      { Source } LData[1],
      { Dest } Result[1],
      { DataSize } LLen );
    if LCheck <> LCipher.CalcMAC
    then
      raise Exception.Create( 'Invalid data' );
  finally
    LCipher.Free;
    ProtectBinary( LSalt );
    ProtectBinary( LData );
    ProtectBinary( LCheck );
    ProtectBinary( LPass );
  end;
end;

procedure Main;
var
  LText: string;
  LPass: string;
begin
  LText := 'The quick brown fox jumps over the lazy dog';
  LPass := 'U5r5klO0zwu674593';

  Writeln( 'Encode Test: ', Encrypt( LText, LPass ) );
  Writeln( 'Decode Test: ', Decrypt( Encrypt( LText, LPass ), LPass ) );
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
Mit der Basis müsste man jetzt auch weiterkommen ...

cookie22 30. Okt 2014 15:34

AW: Passwort Entschlüsseln
 
Die Angaben des Lehrers sind überhaupt nicht ausreichend.

Es wird weder angegeben, in welchem Modus verschlüsselt wird.

CBC, ECB, CTR, OCB, CFB oder was? Soll er das raten oder wie?

Wozu dient der Hash Algo? Wird er in einer KDF verwedet?

Wenn ja welche? KDFx oder KDF2?

Da zu raten ist völlige Zeitverschwendung. Der Lehrer muss sich klar ausdrücken und alle wichtigen Informationen liefern.

Dejan Vu 31. Okt 2014 07:23

AW: Passwort Entschlüsseln
 
-- Hier stand etwas persönliches, das man auch per PN übermitteln kann--

Insider2004 2. Nov 2014 11:36

AW: Passwort Entschlüsseln
 
Das ist ja wieder zum Kugeln! Kann es sein, dass Dein Lehrer etwas überfordert ist? Was soll das Ganze für ein Schmarrn sein? Was ist überhaupt das Lernziel?

Movementroboter 4. Nov 2014 14:40

AW: Passwort Entschlüsseln
 
Ich habe neue Informationen :)

Delphi-Quellcode:
ACipherClass: TDECCipherClass = TCipher_Rijndael;
  ACipherMode: TCipherMode = cmCBCx;
  AHashClass: TDECHashClass = THash_Whirlpool;
  ATextFormat: TDECFormatClass = TFormat_Mime64; //MIME64 = BASE64 ? 
  AKDFIndex: LongWord = 1;
Padding = Hat er keine Ahnung von :evil:
Delphi-Quellcode:
APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
Habe bereits nach der WhirlPool Library für Visual Studio geschaut aber ich glaube das was ich da gefunden habe ist nicht passend oder ?



Zitat:

Zitat von cookie22 (Beitrag 1278057)
Die Angaben des Lehrers sind überhaupt nicht ausreichend.

Es wird weder angegeben, in welchem Modus verschlüsselt wird.

CBC, ECB, CTR, OCB, CFB oder was? Soll er das raten oder wie?

Wozu dient der Hash Algo? Wird er in einer KDF verwedet?

Wenn ja welche? KDFx oder KDF2?

Da zu raten ist völlige Zeitverschwendung. Der Lehrer muss sich klar ausdrücken und alle wichtigen Informationen liefern.


Sir Rufo 4. Nov 2014 14:47

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Movementroboter (Beitrag 1278667)
Ich habe neue Informationen :)
Delphi-Quellcode:
ACipherClass: TDECCipherClass = TCipher_Rijndael;
ACipherMode: TCipherMode = cmCBCx;
AHashClass: TDECHashClass = THash_Whirlpool;
ATextFormat: TDECFormatClass = TFormat_Mime64;
AKDFIndex: LongWord = 1;

Na dann frisch ans Werk. Alles was du brauchst, steht hier im Thread.

BTW Es wäre sehr freundlich von dir, wenn du Quelltext auch in die Code-Tags packst.
Code:
[DELPHI]
// Hier jetzt DELPHI-Quelltext rein
[/DELPHI]

cookie22 4. Nov 2014 21:02

AW: Passwort Entschlüsseln
 
Er weiß wirklich nicht was Padding ist? Vielleicht sollte er sich erst mal mit Kryptographie beschäftigen, bevor er versucht sie anderen beizubringen.

Mit VS und C# hat das Ganze nun gar nichts zu tun. THash_Whirlpool ist eine Hash-Klasse aus dem DEC für Delphi mit dem du ja arbeitest.

Sir Rufo hat ja schon die Lösung gepostet. :)

Sir Rufo 4. Nov 2014 21:45

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von cookie22 (Beitrag 1278696)
Er weiß wirklich nicht was Padding ist? Vielleicht sollte er sich erst mal mit Kryptographie beschäftigen, bevor er versucht sie anderen beizubringen.

Mit VS und C# hat das Ganze nun gar nichts zu tun. THash_Whirlpool ist eine Hash-Klasse aus dem DEC für Delphi mit dem du ja arbeitest.

Sir Rufo hat ja schon die Lösung gepostet. :)

Eigentlich habe ich (wie auch geschrieben) nur den Inhalt einer Datei hier reingeklatscht.

Somit stellt sich die Frage was der Lehrer wirklich damit vermitteln wollte: Hör genau zu und lies dir die Doku durch?
Den Test scheint er nicht bestanden zu haben :stupid:

cookie22 4. Nov 2014 22:34

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Sir Rufo (Beitrag 1278698)
Somit stellt sich die Frage was der Lehrer wirklich damit vermitteln wollte...

Das würde mich auch interessieren. :P

Movementroboter 5. Nov 2014 07:24

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von cookie22 (Beitrag 1278696)

Mit VS und C# hat das Ganze nun gar nichts zu tun. THash_Whirlpool ist eine Hash-Klasse aus dem DEC für Delphi mit dem du ja arbeitest.

Genau da liegt ja das Problem ich habe in C# keine Klasse gefunden die mit Whirlpool aus dem DEC übereinstimmt.

Sir Rufo 5. Nov 2014 07:33

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Movementroboter (Beitrag 1278010)
Hallo Leute,
ich benutze in der Schule jetzt seit 5 Wochen Delphi und habe mich ein bisschen mit dem Delphi Encryption Compendium 5.2 auseinander gesetzt.

Zitat:

Zitat von Movementroboter (Beitrag 1278712)
Zitat:

Zitat von cookie22 (Beitrag 1278696)
Mit VS und C# hat das Ganze nun gar nichts zu tun. THash_Whirlpool ist eine Hash-Klasse aus dem DEC für Delphi mit dem du ja arbeitest.

Genau da liegt ja das Problem ich habe in C# keine Klasse gefunden die mit Whirlpool aus dem DEC übereinstimmt.

Wie kommst du denn jetzt auf C# und wie sollen wir das riechen können? :wall:

Movementroboter 5. Nov 2014 08:05

AW: Passwort Entschlüsseln
 
Das hatte ich ganz vergessen:(
Gibt es den eine Möglichkeit die DEC5 Library in .Net zu benutzen ?

Sir Rufo 5. Nov 2014 08:22

AW: Passwort Entschlüsseln
 
Zitat:

Zitat von Movementroboter (Beitrag 1278717)
Das hatte ich ganz vergessen:(
Gibt es den eine Möglichkeit die DEC5 Library in .Net zu benutzen ?

Wozu das? Diese Bibliotheken müssen bei gleichem Input auch den gleichen Output liefern egal wie und in welcher Sprache die implementiert sind.

Meistens liegt eine solche Aussage (das geht nicht, die passen nicht) daran, dass es eben nicht der gleiche Input gewesen ist.

Wichtig in diesem Zusammenhang: Es werden nur Byte-Folgen verarbeitet. Alles was keine Byte-Folge ist wird/muss vorher in eine Byte-Folge umgewandelt werden und dann durch den Hasher gejagt. Und genau da liegt immer das Problem, dass jeder immer den "gleichen" String durchnudelt. Jo, bis man sich dann anschaut, was für eine Byte-Folge dieser String denn ergibt und das ist je nach Encoding eben unterschiedlich ;)

Also prüfe ob du wirklich die gleichen Byte-Folgen verwendest


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