![]() |
Re: DEC 5.1 wie benutzen?
Ich habe nochmal eine kleine Frage zur Verschlüsselung mit DEC. Und zwar wollte ich fragen wie man das machen würde, wenn man anstatt einem Passwort zum Verschlüsseln eine Datei benutzt. Also ein "Keyfile" sozusagen, wie es bei TrueCrypt der Fall ist. TrueCrypt liest ja ein paar Bytes vom Anfang der Datei und verschlüsselt dann damit. Kann man das mit DEC auch machen, dass man ein Stream von einer Datei öffnet (bestimmte länge vom Anfang) und dann dies als Passwort übergibt?
|
Re: DEC 5.1 wie benutzen?
Ja geht, allerdings auf Umwegen ;)
1.) Datestream öffnen 2.) einen TMemoryStream erzeugen und die Bytes aus dem Dateistream lesen 3.) .Init(MemoryStream.Memory^, MemoryStream.Size); aufrufen Aber Vorsicht! Diese Methode muß sehr genau überlegt sein. Besser ist es mit zb. THash_SHA1.CalcFile(KeyFileName, TFormat_Copy) erstmal nur einen digitalen Fingerabdruck der Schlüsseldatei zu erzeugen. Dieser 160 Bit Wert wird dann mit Hilfe einer KDF und einem Zufallssalt in einen Sessionkey umgewandelt. Benutzt du direkt den Inhalt einer beliebigen Datei als Passwort so ist die Wahrcheinlichkeit sehr hoch das du schlechte Schlüssel erzeugst. Denn viele Dateien enthalten zb. große Datenbereiche die zb. nur aus Nullen bestehen, deren Inhalte auf Grund von Headern quasi bekannt sind und somit erraten werden können. Die Entropie solcher Dateien muß also komprimiert werden, am besten mit einer Hash Funktion. Es sei denn diese Schlüsseldatei wurde mit echten Zufall befüllt. Nur ist dann der Sinn das der Anwender sich eine beliebige Datei auf seinem Rechner als Schlüsseldatei auswählt, und so nur deren Location merken muß, fraglich. Also besser wäre es wenn du obige Funktionen von mir so aufrufen würdest: Encrypt(bla,bla, THash_SHA256.CalcFile(KeyFileName, TFormat_Copy)); Gruß Hagen |
Re: DEC 5.1 wie benutzen?
OK danke! Werde ich mal versuchen.
|
Re: DEC 5.1 wie benutzen?
Ich wollte jetzt nicht wieder einen extra Thread aufmachen, also frag ich einfach nochmal hier nach.
Erstmal muss ich sagen das DEC ist einfach super! Gut das es Leute gibt die sich die Arbeit machen und sowas zusammenstellen. Ich habe allerdings nochmal eine Frage. Und zwar rufe ich die decrypt-function schon in der FormCreate auf. Jetzt bekomme ich allerdings eine Exception von der Funktion:
Delphi-Quellcode:
Die Funktion "DECClassByIdentity" wird ja so ziemlich am Anfang der decrypt-function aufgerufen.
function DECClassByIdentity(Identity: LongWord; ClassType: TClass): TDECClass;
function DoFind(Identity: LongWord; ClassType: TDECClass): Boolean; begin Result := ClassType.Identity = Identity; end; begin Result := DECEnumClasses(@DoFind, Pointer(Identity), ClassType); if Result = nil then raise EDECException.CreateFmt(sClassNotRegistered, [IntToHEX(Identity, 8)]); //Hier die Exception end; Da muss wohl erst irgendeine Klasse registriert werden, aber welche? Und vor allem wie registriere ich diese. Vieleicht habe ich ja irgendwas übersehen, aber ich finde den Fehler einfach nicht. Gruß [EDIT] Man bin ich ein Trottel! Ich weiß was ich vergessen hab!
Delphi-Quellcode:
:wink: ich sollte mir mal angewöhnen erst zu denken und dann zu schreiben :lol:
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1); IdentityBase := $84485225; RegisterDECClasses([TCipher_Rijndael, THash_SHA1]); |
Re: DEC 5.1 wie benutzen?
Delphi-Quellcode:
das RegisterDECCasses() kannst du in diesem Falle weglassen, da beide Klassen schon bei SetDefaultCipherClass() und SetDefaultHashClass() automatisch registeriert werden.
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1); IdentityBase := $84485225; RegisterDECClasses([TCipher_Rijndael, THash_SHA1]); Als Alternativ zu RegisterDECCalsses([..]) geht auch der dirkete Aufruf mit
Delphi-Quellcode:
Allerdings benötigt man dies nur wenn man ausgehende von einer Identity, das ist eine Cardinal Zahle die Eindeutig zur DEC Klasse sein sollte, diese Zahl aus einem TStream lädt um ein DEC Klasse Objekt zu laden. Man speichert also zb. TCipher_Rijndeal.Identity als Zahl in einem Stream. Später lädt man diese Identity wieder aus dem Stream und sucht mit CpiherByIdentity(Identity aus TStream) die TCipher_Rijndael Klasse. Der Wert in IdentityBase ist Anwendungsbezogen und beeinflusst alle .Identity Werte aller DECClassen. Man kann also durch das Änderen dieses Wertes alle Identity Codes serialisieren so das nur mit diesem bekannten Wert DEC Klassen aus Stream geladen werden können.
THash_SHA1.Register;
TCipher_Rijndael.Register; Du kannst also somit eine Datei mit einem variaben Cipher/Hash verschlüsseln, speicherst die Identity dieser benutzen Klassen als Header in der verschlüsselten Datei. Beim Entschüsseln lädst du erstmal diese Identities wieder aus diesem TStream, holst dir mit HashByIdentity() und CipherByIdentity() diese Klassen, erzegtst damit deiner Objekte und entschlüsselst den Rest des Streams. Somit kannst du mit verschiedenen Cipher/Hashs arbeiten stattt nur mit hardcoded Klassen. Wenn du aber meinen obigen Vorschlag an Funktionen gearbeitet hast dann sollte eigentich in den globalen Konstanten die korrekte Klasse schon gesetzt sein. Dies ist aber bei dir anscheinend nicht der Fall, dh. du hast diese Konstanten aus NIL gesetzt. Das führt nun dazu das with ValidCipher(globale Konstane == nil).Create do die Funktion ValidCipher() die übergebene Klasse==nil überprüft. ValidCipher() gibt bei NIL als Parameter die mit SetDefaultCipherClass() installierte Klasse zurück. Du hast also deine globalen Konstanten nicht richtig initialisert, eg. auf NIL stehen, alos hier
Delphi-Quellcode:
Es sei denn du benutzt die Methode aus dem allerersten Posting. Diese speichert natürlich die .Identity der benutzten Klassen in den TStream.
const
ACipherClass: TDECCipherClass = TCipher_Rijndael; AKDFClass: TDECHashClass = THash_SHA1; Dann musst du mit RegisterDECClasses([]) alle DEC Klassen, eg. Hash und Cipher, registrieren die du in der Gegenwart und Zukunft benutzen möchtest. Denn nur bei alle diesen registrierten Klassen ist sichergestellt das der Wert von .Identity auch eineindeutig ist, das ist wichtig. Der Aufruf von RegisterDECClasses([]) sollte in der Initialization Sektion der Unit steht, also nur einmalig aufgerufen werden (man kann es aber auch mehrmals aufrufen wenn nötig). Dabei ist WICHTIG das der Wert in BaseIdentity noch davor gesetzt wird !! Also auch vor dem Aufruf von SetDefaultCipherClass(), SetDefaultHashClass() und evtl. TCipher_XYZ.Register und THash_XYZ.Register. Gruß Hagen |
Re: DEC 5.1 wie benutzen?
Ich benutze so in etwa die function die ich so ziemlich am Anfang mal gepostet habe nur halt für n Memorysream umgeschrieben.
Und den Code:
Delphi-Quellcode:
Rufe ich beim Start in der Formcreate() auf. Da ich nur diese eine Verschlüsselung benutze sollte es da keine Probleme geben oder?
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1); IdentityBase := $84485225; RegisterDECClasses([TCipher_Rijndael, THash_SHA1]); Also ich benutze diese beiden Funktionen jeweils zum entschlüsseln bzw. verschlüsseln:
Delphi-Quellcode:
Und dann halt die Klassenregestrierungen im formcreate().
procedure EncodeMStream(const ADestFilename: String; const APassword: Binary;
ACipher: TDECCipherClass = nil; AMode: TCipherMode = cmCTSx; AHash: TDECHashClass = nil); var Dest: TStream; procedure Write(const Value; Size: Integer); begin Dest.WriteBuffer(Value, Size); end; procedure WriteByte(Value: Byte); begin Write(Value, SizeOf(Value)); end; procedure WriteLong(Value: LongWord); begin Value := SwapLong(Value); Write(Value, SizeOf(Value)); end; procedure WriteBinary(const Value: Binary); begin WriteByte(Length(Value)); Write(Value[1], Length(Value)); end; var Sourcestr: TMemoryStream; Seed: Binary; begin ACipher := ValidCipher(ACipher); AHash := ValidHash(AHash); Seed := RandomBinary(16); Sourcestr:=TMemorystream.Create(); try sourcestr.WriteComponent(Form1.listview1); SourceStr.Position := 0; Dest := TFileStream.Create(ADestFilename, fmCreate); try with ACipher.Create do try Mode := AMode; Init(AHash.KDFx(APassword, Seed, Context.KeySize)); WriteLong(Identity); WriteByte(Byte(Mode)); WriteLong(AHash.Identity); WriteBinary(Seed); WriteLong(Sourcestr.Size); EncodeStream(Sourcestr, Dest, Sourcestr.Size); WriteBinary(CalcMAC); finally Free; end; finally Dest.Free; end; //ProtectStream(Source); finally Sourcestr.Free; end; //DeleteFile(AFileName); end; procedure TForm1.DecodeMStream(const ASourceFileName: String; const APassword: Binary); var Source: TStream; procedure Read(var Value; Size: Integer); begin Source.ReadBuffer(Value, Size); end; function ReadByte: Byte; begin Read(Result, SizeOf(Result)); end; function ReadLong: LongWord; begin Read(Result, SizeOf(Result)); Result := SwapLong(Result); end; function ReadBinary: Binary; begin SetLength(Result, ReadByte); Read(Result[1], Length(Result)); end; var Dest: TMemoryStream; error:Boolean; begin error:=false; Source := TFileStream.Create(ASourceFileName, fmOpenRead or fmShareDenyNone); try try Dest := TMemorystream.Create; try try with CipherByIdentity(ReadLong).Create do try Mode := TCipherMode(ReadByte); Init(HashByIdentity(ReadLong).KDFx(APassword, ReadBinary, Context.KeySize)); DecodeStream(Source, Dest, ReadLong); if ReadBinary <> CalcMAC then //raise EDECException.Create('Invalid decryption'); begin showmessage('Fehler: falsches Passwort'); error:=true; end; finally Free; end; except //ProtectStream(Dest); raise; end; finally dest.Position := 0; if error = false then dest.ReadComponent(Form1.ListView1); Dest.Free; end; except //DeleteFile(ChangeFileExt(AFileName, '')); raise; end; finally Source.Free; end; if error = true then begin form1.close; PasswordDlg.Close; end else begin form1.Enabled:=true; form1.Visible:=true; end; end; Gruß |
Re: DEC 5.1 wie benutzen?
Hallo zusammen,
ich hoffe, die Eier sind gefunden im Schnee... :-) Ich habe mir diesen Thread mal durchgelesen und bin bei der Unit "MyCrypt" hängen geblieben, die für meine Zwecke OK ist. Wie kann ( muss ) ich abfragen, ob das Passwort richtig eingegeben wurde. Und wie man ggf. auf ein falsches Kennwort reagiert. Bei mir klappt das irgendwie nicht Kann mir jemand helfen ? Gruß Thomas |
Re: DEC 5.1 wie benutzen?
Hai Thomas,
ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS". Zitat:
![]() Der sollte Dir helfen. |
Re: DEC 5.1 wie benutzen?
Hallo Sharky,
danke erstmal für das "Willkommen" und wür die schnelle Antwort. Ich bin jetzt nicht so der große Delphianer und bekommt das irgendwie nicht umgesetzt. Hilfe ???? :oops: Tom |
Re: DEC 5.1 wie benutzen?
Hallo zusammen,
habe mir mal den Beitrag durchgelesen, kann ihn nur nicht umsetzen
Delphi-Quellcode:
Finde diese KDF und MGF funktionen nicht
Salt_1 = RandomBinary(16);
Salt_2 = RandomBinary(16); SessonKey = KDF(Salt_1, Passwort); Checksum = MGF(Salt_2, SessionKey); CipherText = ENCYPT(SessionKey, Salt_2 + Checksum + PlainText); FinalData = Salt_1 + CipherText; Kann mir das jemand übersetzen Wäre echt gut Danke schonmal noway |
Re: DEC 5.1 wie benutzen?
Zitat:
Also z.B.:
Delphi-Quellcode:
SessionKey := THash_RipeMD256.KDFx(Salt_1, Passwort);
SessionKey := THash_RipeMD256.KDF1(Salt_1, Passwort); // oder CheckSum := THash_MD5.MGF1(Salt_2, SessionKey); CheckSum := THash_MD5.MGFx(Salt_2, SessionKey); |
Re: DEC 5.1 wie benutzen?
Hallo zusammen,
ich bekomme folgende Meldung
Delphi-Quellcode:
Was bedeutet das ?
There is no overloaded version of 'KDFx' that can be called with these arguments
Ratlos Noway (der Name ist Programm :-D ) |
Re: DEC 5.1 wie benutzen?
Das höchstwahrscheinlich die Parameteranzahl oder der Parametertyp nicht stimmt.
Solltest Du Dich auf meine Beispiele von oben beziehen: das sind nur grobe Beispiele!!! Genauere Funktionen/Beschreibungen findest Du aber auch hier im Forum -> ![]() Ansonsten: Wenn Du 'Codevervollständigung' in der IDE benutzt oder mit der Maus über den Eintrag 'KDFx' fährst, solltest Du die Anzahl und Typen der erwarteten Parameter erhalten. Auch ein Blick in die entspr. DEC-Unit könnte helfen... |
Re: DEC 5.1 wie benutzen?
Danke erstmal für die Anwtwirt.
Leider finde ich im Forum nicht das, was ich suche bzw. ich such falsch Irgendwie habe ich es hinbekommen, das o.g. Meldungen nicht mehr erscheinen. (Fragt sich nur, ob das die richtigen Parameter waren.) Jetzt wird mir "ENCYPT" angemeckert. Wird nicht erkannt. Ist es nicht möglich, von den Cracks hier, mir den Code mal zu übersetzen ? Wenn nicht , dann auch gut :?
Delphi-Quellcode:
Gruß
Salt_1 = RandomBinary(16);
Salt_2 = RandomBinary(16); SessonKey = KDF(Salt_1, Passwort); Checksum = MGF(Salt_2, SessionKey); CipherText = ENCYPT(SessionKey, Salt_2 + Checksum + PlainText); FinalData = Salt_1 + CipherText; und entschlüsselt dann so: Salt_1 = EXTRACT(FinalData, 1, 16); SessionKey = KDF(Salt_1, Passwort); Temp = DECRYPT(SessonKey, EXTRACT(FinalData, 16, MaxInt)); Salt_2 = EXTRACT(Temp, 1, 16); Checksum = EXTRACT(Temp, 16, 16); if Checksum <> MGF(Salt_2, SessionKey) then ShowMessage('Falsches Passwort'); PlainText := EXTRACT(Temp, 32, MaxInt); Noway |
Re: DEC 5.1 wie benutzen?
Zitat:
Und das hier sind eher Vergleiche als Zuweisungen (vermute aber mal das es nur Typo's sind, oder???)
Code:
Wie das ver- und entschlüsseln funktioniert, bzw. was dabei beachtet werden muss/sollte und die Handhabung insbesondere der Funktionen KDF usw. ist an mehreren Stellen hier im Forum sehr schön beschrieben: z.B.:
Salt_1 = RandomBinary(16); // Vergleich (allerdings ohne Sinn)
Salt_1 := RandomBinary(16); // Zuweisung (so sollte es sein) ![]() |
Re: DEC 5.1 wie benutzen?
Kleine Frage am Rande:
Gibt es sowas wie eine "offizielle Homepage" für DEC? Ich will in den Abouts von meinem Programm DEC erwähnen und gleich zu der Homapage verlinken... Ist ![]() |
Re: DEC 5.1 wie benutzen?
Ist veraltet, da arbeite ich schon lange nicht mehr.
Mein obige "Sourcecode" ist nur ein Pseudocode, sprich eine Formel oder Algorithmus oder Arbeitsanweisung. Das kannst du nicht direkt mit DEC so übernehmen. Gruß Hagen |
Re: DEC 5.1 wie benutzen?
Zitat:
ich versuche es noch ein letztes Mal. Woher kommt die Funktion "EXTRACT" ? Kann mir da jenmand helfen Danke Noway |
Re: DEC 5.1 wie benutzen?
Zitat:
|
Re: DEC 5.1 wie benutzen?
Zitat:
sich selber zu zitieren sieht nie gut aus ;-) Aber das nur am Rande. hast Du denn gelesen was Hagen (der Entwickler des DEC) geschrieben hat? |
Re: DEC 5.1 wie benutzen?
Hallo sharky,
was soll ich denn wo gelesen haben ? :?: Soweit ich gelesen habe, habe ich keine Antwort auf meine Frage gefunden, sonst hätte ich sie wohl kaum gestellt. :wink: Ich möchte echt nicht böse klingen, aber wenn das hier in Rätselraten ausartet, dann kann ich auch so weitermachen wie bisher, und sinnlos experimentieren. Ich habe Verständnis dafür, dass man hier nicht die Programme für andere schreiben will und kann. Ist auch in Ordnung. Aber wenn man halt nicht den Durchblick hat und nur die Funktion benötigt, brauche ich doch nicht unbedingt das komplette Verständnis, wie in diesem Fall, für die Verschlüsselung zu haben. Ich habe seit 20 Jahren einen Führerschein sowie ein Auto, und trotzdem habe ich nur rudimentäre Kenntnisse in Sachen Motoren. So.... bis denne oder auch nicht :mrgreen: Noway (Der Name der Programm ist) |
Re: DEC 5.1 wie benutzen?
Na dann für dich nochmal extra zitiert aus den Beiträgen:
Zitat:
|
Re: DEC 5.1 wie benutzen?
Also doch Rätselraten :gruebel:
|
Re: DEC 5.1 wie benutzen?
Zitat:
Wenn es auch OT ist - aber Threads entwickeln sich eben manchmal: Die Einstellung, in Foren möglichst sauber zu schreiben, finde ich gut und ich kann auch verstehen, dass man als Wissender bei so manchem Posting kein Interesse an einer Antwort hat. Aber das Ausgangsposting ist eigentlich noch ganz human und die Frage insgesamt verständlich. Wenn man sich so manches andere Posting anschaut, wird einem da schon eher flau im Magen. Ja, es sind einige seltsame Worte darin, bei denen man an defekte Tasten denkt. Am Rande: Wer ausdrücklich auf korrektem Deutsch besteht, braucht deswegen zwar selber nicht jeden Tippfehler zu vermeiden, aber einen guten bis sehr guten Standard, sollte man dann schon selbst halten. Ich kann und will ja gar keinen Druck ausüben, aber mal als Polemik formuliert: Zwischen dass und das gibt es einen Unterschied, der auch Kommas nach sich zieht. Und wer Deutsch groß schreibt, der sollte das auch tun. Manche Leute heißen Nationalisten, man findet sie aber nicht bei Heise. Ich will damit nur eines sagen: Wir sind alle nicht perfekt und ich fände es schade, wenn man ein hervorragendes Wissen in einem Bereich nutzt, um in einem anderen Bereich, in dem man nicht so gut ist, Standards setzen zu wollen. Dieses Posting soll keinen Sprachstreit begründen. Ich bewundere Deine Kenntnisse im Thema Verschlüsselung. Die Beiträge hier im Forum sind ein echter Lichtblick in der Praxis der Kryptografie für jeden, der sich mühsam in das Thema einzulesen versucht. Ehrlich danke dafür! Insofern freue ich mich, dass Du in diesem Thread trotz der Sprache im Ausgangsposting geantwortet hast, denn die Ausführungen lassen mich einiges besser verstehen, was ich hier gerade im Theoriebuch gelesen habe. Deine Antworten helfen also nicht nur den Fragestellern. "Keine Antwort" übt also auch Druck auf die aus, die gar keine Frage gestellt haben! In dem Sinn - viele Grüße und weiter so! :thumb: Hepdepaddel |
Re: DEC 5.1 wie benutzen?
Tote sollte man ruhen lassen. Davon abgesehen ging es nicht um korrektes Deutsch sondern um absichtlich eingeführten Slang, der nur den Nutzen hat sich zu separieren oder ein Produkt zu verkaufen. Die Entscheidung ob und wie ich antworten möchte oder nicht obliegt einzig mir, fakt. Die Entscheidung meine Gründe für meine getroffene Entscheidung einem Anderen darzulegen, also warum ich welche Konsequenzen für mich ziehe, obliegt ebenfalls nur mir. Es gibt darüber keinerlei Urteile zu fällen, da sonst jedes solches Urteil ein Eingriff in die Meinungsfreiheit darstellt, also respektlos wäre.
Du kannst natürlich eine andere Meinung vertreten und auch Kritik üben, das respektiere ich. Ich habe letzendlich garkeine Kritik geübt sondern einfach mein Handeln und das Warum erklärt, also eine Tatsache. Das mag für dich arrogant klingen aber wenn du mal darüber nachdenkst dann ist es nur Konsequenz. Zitat:
Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 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