Hi
Hier mal ein theoretischer(er) Ansatz:
wie kann man in C# Passwörter sicher verschlüsseln und später wieder entschlüsseln?
Wenn man etwas nicht entschlüsseln kann, dann war es nicht verschlüsselt. Man könnte eine Datei ja durch eine Reihe von Zufallszahlen gleicher Länge ersetzen, was den Inhalt "verdeckt", aber halt keinerlei Information mehr beinhaltet (etwas ähnliches wird mit XOR und One-Time-Pad gleicher Länge erreicht).
Ich möchte Dateien gegen "normale" Hacker schützen
In der Information Security muss man spezifizieren, was die "Threats" und was die "Threat agents" sind.
Sheel's
stimmt nur bedingt.
Zum Beispiel ist eine Verschlüsselung immer sicher, wenn man annimmt, dass der Gegner weder den Schlüssel rausfinden kann noch einfache Mathematik versteht.
Nimmt man den
Dolev-Yao-Angreifer an, dann hat der Gegner vollen Zugriff auf das Netzwerk.
So wäre es zum Beispiel so, dass wenn du das Passwort ungeschützt über das Netzwerk sendest, dann keine Sicherheit besteht.
Nun scheinst du mit deiner Frage aber auf lokale Verschlüsselung, also ohne Netzwerkübertragung anzuspielen.
Hier lassen sich die folgenden Annahmen treffen:
a) Der Angreifer hat keinen Zugriff auf deinen Computer.
b) Der Angreifer hat eingeschränkten (=Keine Administratorrechte) auf deinen Computer.
c) Der Angreifer hat vollen Zugriff.
Zuerst die einfachen Fälle:
Im Fall a) ist Verschlüsselung nutzlos, da der Angreifer ohnehin nicht an die Datei kommen kann.
Im Fall c) ist die Verschlüsselung sinnlos, falls Passwörter und Dateien auf demselben Computer liegen.
Im Fall c) kommt es auf die Implementierung an: Liegen Passwörter in einem Administratorbereich, dann wären die Verschlüsselten Dateien "sicher"; der Angreifer kommt zwar an sie heran, kann sie aber nicht entschlüsseln.
In diesem Fall kommt es aber auch auf die Verschlüsselung an.
Es gibt symmetrische (Verschlüsselungschlüssel = Entschlüsselungsschlüssel) und asymmetrische (Verschlüsselungsschlüssel hat jeder, Entschlüsselungsschlüssel hat nur der, der es haben darf (private key)).
Asymmetrische Verschlüsselung ist teurer als symmetrische.
Heute als "sicher" gilt AES (Rjindael). Unsicher ist die Variation AES-ECB, aber AES-CBC ist der "de facto" Standard.
Und nun, um deine Frage zu beantworten:
https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx
Wichtig hier: Crypto ist konzeptuell sehr einfach, in der Implementierung sehr schwer.
Hier müsstest du der Implementierung von AES in C# vertrauen.
Default ist hier aber bereits CBC.
Um ein Passwort selbst zu setzen, musst du aber den Key selbst wählen und den IV (Initialization Vector) aufbewahren (Genau genommen muss der IV ein Teil des Passworts darstellen, d.h. mindestens den IV musst du im Klartext speichern).
Den IV kannst du dir (hoffentlich sicher, Vertrauensfrage) generieren lassen, den Key musst du selbst (wie auch immer) sicher machen.
Kryptographie ist schon schwer, das ganze dann korrekt zu nutzen (Information Security) ist noch viel schwerer.
Natürlich kannst du ruhig damit herumspielen, aber wenn du dann nicht ständig ein nagendes Gefühl der Unsicherheit hast, bist du entweder ein absolutes Genie oder du machst etwas falsch.
Aber wie gesagt: Viel Spass damit
Gruss
cwriter