Delphi-Quellcode:
SetDefaultCipherClass(TCipher_Rijndael);
SetDefaultHashClass(THash_SHA1);
IdentityBase := $84485225;
RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);
das RegisterDECCasses() kannst du in diesem Falle weglassen, da beide Klassen schon bei SetDefaultCipherClass() und SetDefaultHashClass() automatisch registeriert werden.
Als Alternativ zu RegisterDECCalsses([..]) geht auch der dirkete Aufruf mit
Delphi-Quellcode:
THash_SHA1.Register;
TCipher_Rijndael.Register;
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.
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:
const
ACipherClass: TDECCipherClass = TCipher_Rijndael;
AKDFClass: TDECHashClass = THash_SHA1;
Es sei denn du benutzt die Methode aus dem allerersten Posting. Diese speichert natürlich die .Identity der benutzten Klassen in den TStream.
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