[c#] Verschlüsselung von Dateien
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
algorithmus
angreifer
aussuchen
byte
chiffre
datei
datum
fach
kennwort
nutzen
sicherheit
sinn
standard
string
system
text
unterschied
url
verbindung
zeichen
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Bevor du irgendwas verschlüsseln kannst solltest du dir mal einen Algorithmus aussuchen. Dann kannst du beginnen ihn entweder selbst auszuprogrammieren oder fertige Bibliotheken zu suchen. Aber ohne dieser Festlegung wird es etwas schwer, denn du könntest eine einfache monoalphabetische XOR-Verschlüsselung bis hin zu RSA meinen…
-
Hallo ventos,
das .Net-Framework liefert doch schon einen ganzen Haufen Algorithmen mit:
http://msdn.microsoft.com/de-de/library/system.security.cryptography.aspx
Da kannst Du Dir ja was aussuchen.
Und wenn der Algorithmus einen Schlüssel bestimmter Länge verlangt, dann kannst Du ja aus einem eingegebenen Passwort erst einen Hash erzeugen und diesen als Schlüssel verwenden.
Edit: Hier noch etwas Beispielcode:
http://ashwinrayaprolu.wordpress.com/2011/03/04/aes-encryption-sample-in-c-csharp/
Beitrag zuletzt geändert: 17.12.2012 21:22:51 von darkpandemic -
Gut, danke an alle.
Jezt noch ne Frage:
Ich kenn TripleDES, AES und Rijndael
Welches is das beste, oder gibt es bessere, die im System.Security.Cryptography namespace sind ? -
ventos schrieb:
TripleDES = 3x DES hintereinander
Gut, danke an alle.
Jezt noch ne Frage:
Ich kenn TripleDES, AES und Rijndael
Rijndael = AES
Eventuell könntest du noch RSA in Verbindung mit AES oder TripleDES nutzen… -
und was is der unterschied zwischen Rijndael und AES ?
Is das genau gleich, oder gibts nen unterschied =
Aber wie macht man das in Verbindung ?
Zweimal mit einem Algoritmus ? -
ventos schrieb:
Auszug aus der Wikipedia:
und was is der unterschied zwischen Rijndael und AES ?
Is das genau gleich, oder gibts nen unterschied =Der Advanced Encryption Standard (AES) ist ein symmetrisches Kryptosystem, das als Nachfolger für DES und 3DES im Oktober 2000 vom National Institute of Standards and Technology (NIST) als Standard bekanntgegeben wurde. Nach seinen Entwicklern Joan Daemen und Vincent Rijmen wird er auch Rijndael-Algorithmus genannt.
ventos schrieb:
Nein, das funktioniert anders
Aber wie macht man das in Verbindung ?
Zweimal mit einem Algoritmus ?
RSA ist zwar sehr sicher, aber dafür auch sehr langsam. Wenn du mit RSA größere Dateien verschlüsseln willst (größer = mehr als ein paar Kilobytes) brauchst du entweder einen sehr schnellen PC oder viel Geduld (oder beides).
Deshalb nutzt man in der Regel RSA zum Verschlüsseln des Schlüssels und danach ein schnelleres, symmetrisches Verfahren (wie AES) für die Daten. Dabei erzeugt man mit einem kryptographischen Zufallszahlengenerator einen Key für das symmetrische Verfahren und verschlüsselt diesen mit RSA. Dieser verschlüsselte Key sowie die mit dem symmetrischen Verfahren verschlüsselten Daten bekommt der Empfänger…
Vorteil: RSA muss nur wenige Daten (den Key) verschlüsseln, die Dateien selbst werden mit einem viel schnelleren Verfahren verschlüsselt. -
Gut.
Aber mit welchem Key soll ich den Key verschlüsseln ?
mit sich selber ?
Zufallsgernerieren geht schlecht, weil man es ja wieder entschlüsseln können muss..
Beitrag zuletzt geändert: 28.12.2012 15:30:13 von ventos -
ventos schrieb:
Vermutlich hab ich das zu undeutlich ausgedrückt…
Gut.
Aber mit welchem Key soll ich den Key verschlüsseln ?
mit sich selber ?
Zufallsgernerieren geht schlecht, weil man es ja wieder entschlüsseln können muss..
Sender und der Empfänger haben jeweils einen Teil des RSA-Keys (öffentlicher / privater Schlüssel). Der Sender verschlüsselt mit seinem Teil des RSA-Keys den zufällig generierte Key für das symmetrische Verfahren, mit dem die Daten selbst verschlüsselt werden. Der Empfänger entschlüsselt den zufälligen Key mit seinem RSA-Key und kann damit die Daten wieder entschlüsseln. -
Dateien mit RSA zu verschlüsseln liegt aber nicht im Sinne des Erfinders. Viel mehr soll es zur zuverlässigen Zuordnung der Identität eines Empfängers dienen, z.B. beim E-Mail-Verkehr und Ähnlichem. Dass AES etwas mehr Leistung beansprucht hat auch seinen Sinn, schließlich leben wir im Zeitalter von Security-by-Duration.
Wenn du einen sehr sicheren Algorithmus nutzen willst, kann ich dir DES (selbst 3-fach oder meinetwegen 100-fach) nicht empfehlen, denn einmal nicht sauber implementiert und schon fällt die Gesamtsicherheit auf die Sicherheit einer Einzelrunde zurück. Stattdessen kannst du tatsächlich AES nutzen, oder aber z.B. Twofish (keine bekannten Angriffsmöglichkeiten), MARS (genau wie Twofish als hoch-sicher eingestuft), RC6 oder Serpent. AES-Gewinner Rijndael ist im übrigen nur als hinreichend-sicher eingestuft worden. Und je nach Ausmaß der Paranoia (Achtung Humor ;) ) kannst du auch mehrere Algorithmen hintereinanderschalten. Dies erreichst du, indem du deine Daten der Reihe nach je von einem Algorithmus verschlüsseln lässt und das entstandene Chifrat anschließend mit dem nächsten Algorithmus verschlüsselst. Unnötig zu sagen, dass du zum Entschlüsseln die Algorithmen dann in umgekehrter Reihenfolge staffeln musst.
Um aus Benutzerkennwörtern ByteKeys fester länger zu generieren, kannst du RFC 2898 (RSA) nutzen, Codesnippet am Ende. Damit ist es später egal, wie lang oder komplex das ursprüngliche Kennwort einmal gewesen ist und es ist sicherer und vorallem in der Länge flexibler als bspw. ein MD5-Hash. Schau dir im Übrigen auch die Klasse genauer an, mit der du dies durchführst, die Iterationen sollten min. 1000 Runden betragen, um möglichst sicher zu sein. Mehr runden dauern länger, sind von einem Angreifer schlechter nachvollziehbar und sind somit sicherer. Beachte auch immer, dass dein Programm in die Hände des Angreifers gelangen könnte und die Anzahl der Iterationen, sowie der Salt (siehe Snippet) dann für ihn sichtbar würden und dann keine zusätzliche Sicherheit mehr bedeuten.
using System.Security.Cryptography; using System.IO; // Einstellungen string userPW = "Dieses Kennwort wurde vom Benutzer gewählt."; byte[] salt = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5 }; // Was hier steht hat einen Einfluss darauf, wie das Kennwort später aussehen wird. Die Werte müssen jedoch keiner bestimmten Struktur folgen und sollten möglichst zufällig sein. int keyLength = 32; // Welche Länge soll das Passwort später besitzen ? Oft sind es 32 Zeichen => 256 Bits. // Schlüssel generieren Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(userPW, salt); rfc2898.IterationCount = 5000; // Der Standard sind 1000, aber mehr schadet nicht. byte[] resultingKey = rfc2898.GetBytes(keyLength); // Verschlüsseln string rawData = "Dies hier möchten wir verschlüsseln."; byte[] data = Encoding.ASCII.GetBytes(rawData); // Dies wird aus dem Text ein Byte-Array machen. Es gibt verschiedene Encoder, aber ich bevorzuge ASCII, da es schnell ist und Arrays geringer Größe erzeugt. byte[] chiffre = UltimateEncryption(data, resultingKey); // Frei erfunden. Hier musst du einen Algorithmus wählen. // Abspeichern File.WriteAllBytes(@"X:\Ordner\Datei.ext", chiffre); // Roundtrip => Wir prüfen, ob wir wieder den ursprünglichen Text erhalten. Das ist nicht nötig, aber zum Üben anschaulich. byte[] roundtrip = UltimateDecryption(data, resultingKey); // Der entsprechende Algorithmus, um den Text wieder zu entschlüsseln. string decrypted = Encoding.ASCII.GetString(roundtrip); // Der gleiche Encoder wie vorher auch. Hier ASCII. // Überprüfen => Hat es geklappt ? if (decrypted == rawdata) JumpInTheAirAndShoutHurray("!");
mfg
- VampireSilence
Beitrag zuletzt geändert: 10.2.2013 18:10:13 von vampiresilence -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage