kostenloser Webspace werbefrei: lima-city


[c#] Verschlüsselung von Dateien

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    Hallo, ich möchte gerne mit c# eine oder mehrere Datein verschlüsseln.
    Allerdings findet man im Internet nicht sehr sichere Techniken. Ausserdem
    sollte Man einen ganz normalen String als Passwort angeben können.
    Gibt es da gute, vorgefertigte Klassen ?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    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…
  4. 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
  5. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    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 ?
  6. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ventos schrieb:
    Gut, danke an alle.
    Jezt noch ne Frage:
    Ich kenn TripleDES, AES und Rijndael
    TripleDES = 3x DES hintereinander
    Rijndael = AES ;-)

    Eventuell könntest du noch RSA in Verbindung mit AES oder TripleDES nutzen
  7. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    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 ?
  8. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ventos schrieb:
    und was is der unterschied zwischen Rijndael und AES ?
    Is das genau gleich, oder gibts nen unterschied =
    Auszug aus der Wikipedia:
    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:
    Aber wie macht man das in Verbindung ?
    Zweimal mit einem Algoritmus ?
    Nein, das funktioniert anders ;-)

    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.
  9. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    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
  10. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ventos schrieb:
    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..
    Vermutlich hab ich das zu undeutlich ausgedrückt…

    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.
  11. Autor dieses Themas

    ventos

    Kostenloser Webspace von ventos

    ventos hat kostenlosen Webspace.

    AAh, danke
    (Pfui 15 Zeichen sperre)
  12. vampiresilence

    Kostenloser Webspace von vampiresilence

    vampiresilence hat kostenlosen Webspace.

    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
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!