Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#20

Re: Dateien verschlüsseln - aber wie?

  Alt 30. Sep 2003, 17:38
Hi Daniel,

In den vorherigen Postings habe ich eigentlich schon alles gezeigt was du benötigst. Angefangen damit wie man bei einer Verschlüsselung den Hash Algortihmus oder den Ciphermode einstellen kann, über die Verwendung dynamischer Klassen und deren Registration im DEC System um sie später per Name wieder zu lesen und zu benutzen. Dieser Thread zeigt sehr schön warum ich meine das ein Tutorial oder explizietere Dokumentation wenig hilfreich für die Anwender vom DEC ist. Man würde dadurch nur wie ein Pappagei diese Tutorials nachempfinden ohne sich jemals intensiv und tiefgreifender mit der Kryptographie und ihrer Anwendung beschäftigt zu haben.

Ok, trotzdem werde ich mal hier vesuchen dich tiefer einzuarbeiten.

Zitat:
Es geht nicht darum, dass ich überhaupt was verschlüsseln will (Strings und Dateien zu verschlüsseln ist kein Problem), sondern darum, dass ich nicht weiß, wie ich den Algorithmus auf Rijndael ändern kann, den Hashmode auf MD256 (was nutzt man hier eigentlich üblicherweise mit Rijndael?)
Geschmackssache:
SHA1 ist der am weitesten annerkannte Algorithmus und wird als sicher eingestuft.
MD4,MD5 sind sehr schnell aber in MD5 hat man kleinere Schwächen endteckt. Somit würde ich MD4/MD5 empfehlen um Indexe/Prüfsummen o.ä. aufzubauen, aber nicht um sicherheitsrelevante Passwörter o.ä. zu schützen.
RipeMD empfinde ich prsönlich als die beste Wahl, er ist sicher und analysiert wurden. Er ist in Europa ein Standardverfahren und für mich persönlich ist es wichtig das er eben NICHT amerikanisch ist. SHA1 z.B. wurde vom NIST und NSA abgesegnet.
Haval habe ich schon in einigen Anwendungen gesehen, er wird also benutzt und ist sicher. Der Vorteil von Haval ist das dessen Digestlänge sehr variabel ist. Das gleiche gilt für RipeMD.
Tiger ist ein sehr guter 64Bit Hash, also z.B. auf Itaniums sehr schnell. Allerdings ist er wie die nachfolgenden Hash's wenig bis garnicht analysiert. Denoch sind es Hash Algortihmen die durch Profis entwickelt wurden.
Square und Sapphiere sind Hash-Algos die auf Grund deren Entwicklungen ihrer gleichnamigen Verschlüsselungsalgos. entstanden sind. Da ich immer die Meinung vertrete das ein Hash Algo NICHT ein Cipher bzw. ein Cipher NICHT ein Hash sein sollte, würde ich diese nicht anwenden. Denoch gelten die Cipher Square/Sapphiere als gute Cipher und somit sind deren Hash-Pendants ebenfalls gut. Auf Sapphiere liegen Patente.
Snefru ist ein Ausnahme-Hash. Sollten irgendwan einmal ganz bestimmte Mathematischen Grundlagen gebrochen werden so würde ein ganze Latte von Hash/Cipher Algortihmen unsicher werden. In Punkto Hash wären das alle oben genannten, bis auf SHA1 und Snefru. Denn beide Verfahren haben wesentliche Unterschiede zu den anderen Verfahren.

Im Bereich der Cipher wird eine gute Analyse schwieriger für mich, da 1. im DEC 40 verschiedene Cipher sind und 2. diese sich untereinander stark unterscheiden.
Nungut, aös erste DES und seine Derivate 2DES, 3DES usw. DES ist ein Standard und will man auf andere Sorftwaredaten zugreifen die diesen Standard benutzen so muß man DES verwenden. Allerdings DES ist enorm alt (was ihn nicht unsicher sondern sicherer macht da er bis heute nicht offiziell gebrochen wurde) und deshalb würde ich ihn in neuen Projekten niemals verwenden. Besonders Single DES ist als unsicher einzustufen da dessen Schlüsslelänge nur 56 Bit beträgt.

Rijndael, Twofish, Blowfish und IDEA wären die Favoriten. Wobei Rijndael natürlich der AES Gewinner ist. Ob die politisch gesehen Gut oder Schlecht ist darüber lässt sich streiten. Man muß bedenken das das NIST unter Absegnung vom NSA Rijndael hauptsächlich ausgewählt hat weil das Verfahren über ein breite Palette von verschiedner Hardware scallierbar ist. Dies bedeutet z.B. das Rijndael auch enorm leicht in FPGA Hardware umzusetzen ist, diese FPGA aber genau das Instrument der mächtigen Organisationen sein wird um Brute Force Angriffe auf Rijndael Schlüssel durchzuführen.
IDEA gilt als Ausnahmecipher und als sicher ist aber duch Patente blockiert.
Twofish ist die Weiterentwicklung von Blowfish und beide wurden von Bruce Schneier entwickelt. Es fragt sich warum Schneier Blowfish weiterentwickeln musste zum Twofish. Beide sind sicher. Blowfish ist frei verwendbar.
TEA,RC4 und SCOP sind Streamcipher. Dadurch haben sie besondere Eigenschaften. RC4 ist ein anerkanntes Verfahren wogegen SCOP/TEA eher Undergrund Cipher sind. Beide wurden nicht expensiv analysiert. Denoch benutze ich gerade SCOP um enorm schnell große Datenmengen zu verschlüsseln, da SCOP eben eine der schnellsten Verschlüsselungen auf PC's ist. Natürlich muß man dann Abstriche in der Sicherheit machen.

Nicht unerwähnt soll bleiben das ich im DEC auch eine Eigenentwicklung eingebaut habe. Sie heist PMC=Polymoph Cipher. Bei diesem Verfahren gibt es keinen festen Verschlüsselungsalgorithmus mehr, sondern das Passwort und die Messages bestimmen wir der Cipher intern verschlüsselt. D.h. der PMC ist ein Verfahren das abhängig vom Passwort und der Messages erst zur Verschlüsselungszeit den Verschlüsselungsalgorithmus compiliert. Der PMC kann nicht auf FPGA Hardware implementiert werden, da er z.B. bei der Verschlüsselung von 1Kb Daten temporär ca. 10Mb an Verschlüsselungscode erzeugt.

Zitat:
und wie ich die Ausgabe auf MIME64 stelle (nur beim Ver- / Entschlüsseln von Strings).
Auch dieses habe ich in den vorherigen Postings gezeigt. Der letzte Parameter von TCipher.Encode-/DecodeString() gibt das Format an. Ich habe auf deine Wünsche hin mit fmtMIME64 gearbeitetm was exakt dem MIME Base 64 Verfahren entspricht. Um diese Sache dynamisch zu machen wurde eine Globale Variable DefStringFormat: Integer = fmtmIME64 benutzt.


Willst du in deiner Awendung nun z.B. mit Blwofish,SCOP,Rijndael,MD4,SHA1,RipeMD arbeiten so müssen die Unit Hash,Cipher,DECUtils eingebunden werden. DEC enthält nun alles ws nötig ist um mit dynamischen Klassen zu arbeiten, also so ähnlich wie die VCL es tut mit RegisterClass() und getClass().

Zur Intialisierungsphase der Anwendung müssen also dem DEC alle verwendbaren Algos. mitgeteilt werden.


Delphi-Quellcode:
uses Hash,Cipher,DECUtils;

initialization
  RegisterDECClasses([TCipher_Blowfish, TCipher_SCOP, TCipher_Rijndael, THash_MD4, THash_SHA1, THash_RipeMD128, .....]);
end.
Nun findest du in DECUtils.pas alle wichtigen Funktionen um auf diese registrierten Klassen zuzugreifen. Zb.

Delphi-Quellcode:
var
  Cipher: TCipherClass;
  Hash: THashClass;
begin
  Cipher := DECClassByName('SCOP', TCipher) as TCipher;
  with Cipher.Create() do ......

// oder
  Hash := DECClassByName('MD4', THash) as THash;
  Hash.CalcString('Test', nil, fmtMIME64);
end;
Das heist alle registrierten Klassen können durch ihren Klassennamen, z.B. "THash_MD4" oder deren Kurzname = "MD5", also dem Namen nach dem Unterstrich "_" über DECClassByName gefunden werden.

Zusätzlich zu dieser Methode implementiert DEC noch eine sogenante Identity. Dies ist ein 32 Bit Wert der eindeutig einen Algortihmus beschreibt. Würde man z.B. mit solchen durch den User auswählbaren Algos. arbeiten und eine Datei verschlüsseln, muß das Programm ja wissen welches Verfahren benutzt wurde. Nun dazu speichert man einfach Cipher.Identity in den Header der Datei. Mit

Delphi-Quellcode:
var
  Cipher: TCipherClass;
  Hash: THashClass;
  CipherIdentity: Cardinal;
  HashIdentity: Cardinal;
begin
// lade header aus verschlüsseltem Stream
  Stream.Read(CipherIdentity, SizeOf(CipherIdentity));
  Stream.Read(HashIdentity, SizeOf(HashIdentity));
  Cipher := DECClassByIdentiy(CipherIdentity, TCipher) as TCipher;
  Hash := DECClassByIdentity(HashIdentity, THash) as THash;
  
  with Cipher.Create('', nil) do
  try
    Mode := cmCTS;
    HashClass := Hash; // <--- ändere hier den Password-Hash-Algo.
    InitKey(Password, nil);
    DecodeStream(Stream, Dest, Stream.Size - Stream.Position);
  finally
    Free;
  end;
   
end;
wird dies demonstriert. Dies Identites können sehr einfach für jede Anwendung separat angepasst werden, sprich serialisiert werden. Einfach IdentityBase in DECUtils.pas ändern.

Oben wurde auch gezeigt wie du den Hash-Algortihmus der das Password in den Sessionkey umwandelt geändert werden kann. Dieses Verhalten habe ich auch schon in den letzten Posting gezeigt.

Schau dir bitte die DECUtils.pas genauer an, dort findest du neben DECRegisterClasses() usw. andere wichtige Funktionen.

Gruß Hagen
  Mit Zitat antworten Zitat