Hallo @all!
Ich habe ein Programm geschrieben, welches in einer ASCII-Datei seine Einstellungen durch | getrennt speichert.
Jetzt möchte ich jedoch diese Einstellungen verschlüsseln, damit nicht jeder direkt darin etwas verpfuschen kann, da manche Einstellungen vom Programm selbst errechnet werden.
Was nehme ich hierfür am besten? Die Daten müssen praktisch verschlüsselt werden und auch wieder entschlüsselt werden können. Es reicht eigentlich, wenn diese nur unleserlich gemacht werden, da darin keine Passwörter oder ähnliches hinterlegt werden.
Die Auswahl eines Verschlüsselungsalgorithmus ist weniger vom Inhalt (ok, bei dir scheint die geforderte Sicherheit nicht groß zu sein) als eher vom Einsatzszeanrio abhängig (Schlüsselaustausch, Angriffsmöglichkeiten, wer hat potentiellen Zugriff auf die Daten,.usw).
In deinem Fall scheint ein symmetrischer Algorithmus wie DES oder AES geeignet zu sein.
Wenn es nur um simple Unleserlichkeit geht, dann kannst du auch einfach den Inhalt nach base64 oder Hex-Text encodieren. Kann zwar jeder rückgängig machen der weiss wie es geht, aber der normale 0815-User wird wohl daran scheitern. Dann brauchst du auch kein Passwort.
Verschlüsselung ist für mich Neuland.
DES habe ich gefunden, aber was ist AES.
Habe zu DES ein Beispiel gefunden:
private static void EncryptData(String inName, String outName, byte[] desKey, byte[] desIV)
{
//Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time.
DES des = new DESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write);
Console.WriteLine("Encrypting...");
//Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.WriteLine("{0} bytes processed", rdlen);
}
encStream.Close();
fout.Close();
fin.Close();
}
Hier wird jedoch eine komplette Datei ausgelesen und verschlüsselt.
Wie mache ich es, wenn ich in meinem Programm einen String habe, welchen ich lediglich verschlüsselt abspeichern möchte?
EDIT: Wie funktioniert deine andere erwähnte Methode?
DES war bis vor kurzer Zeit der Standardalgorithmus für symmetrische Verschlüsselung. Mittlerweile gilt er jedoch als zu unsicher. AES ist einer seiner Nachfolger.
Wenn du also damit leben kannst, dass die CIA dein File in ein paar Tagen entschlüsseln kann, dann nimm ruhig DES. 🙂
Wenn du Daten verschlüsseln willst, die nicht aus einem File kommen, dann verwende einen MemoryStream anstelle eines FileStreams als Input.
Wie funktioniert deine andere erwähnte Methode mit base64 oder Hex-Text encodieren?
Die macht aus deinen Daten einfach unleserlichen Hex-Code-Brei (siehe System.Convert.ToBase64String) .Verschlüsselt ist da aber nix. Der normalsterbliche Anwender wird aber kaum dahinter kommen.
Ein Passwort braucht man nicht. Genausogut kann du eine einfache "Verschlüsselung" verwenden, wie sie schon die Griechen anwandten. Also einfach eine Ersetzungstabelle definieren und die Zeichen austauschen oder einfach mit einem festen Offset versehen.
Beispiel:
A wird zu 01
B wird zu 02 usw.
HALLO wird zu 0801121717.
Kommt auch ohne Passwort aus.... hier hat man einen "geheimen" Algorithmus als Sicherungsmaßnahme.
Ok, wenn ich es mit System.Convert.ToBase64String machen möchte, dann benötige ich ja erst ein Byte-Array. Ich habe jedoch einen String.
Wie bekomme ich den String am einfachsten in ein Byte-Array?
Hallöchen, Brovnig,
Du kannst einen kleinen Umweg über System.Text.Encoding machen, z.B:
byte[] stuff;
string str = "Hello world!";
stuff = Encoding.ASCII.GetBytes(str);
Gruß,
Manny
PS: retour geht der Spaß dann mit der Methode GetString(byte[] stuff)
PPS: Jetzt mit 0.5% weniger Rechtschreibfehler!
byte[] barray = System.Text.Encoding.GetBytes(mystring);
*EDIT*
Mist, nur Zweiter... 🙂
Vielen Dank euch beiden ! ! ! 👍