Guten Abend.
Ich möchte euch heute mein Verschlüsselungsverfahren Cryptor vorstellen: Das ganze ist ein symmetrisches Verschlüsselungsverfahren, d.h. es wird das gleiche Passwort zum ver- und entschlüsseln verwendet. Mit diesem Verfahren kann man sowohl Texte als auch Dateien mit Texten oder Dateien verschlüsseln. Das ganze ist relativ einfach: Zuerst wird die binär Datei eingelesen, bzw. der String in ein Byte-Array konvertiert. Danach erfolgt das selbe für das Passwort. Danach geht man jedes Byte im Input durch und addiert zu jedem Byte des Inputs jedes Byte des Passworts. Am Ende erhält man eine relativ lange Zahl, welche dann in der Ausgangsdatei abgespeichert wird. Zum Entschlüsseln subtrahiert man einfach jedes Byte des Passworts von jedem Byte des Inputs, sodass man wieder die Originaldatei erhält.
Ich weiß nicht, ob es an meiner Implementierung liegt, oder generell am Verfahren, aber in der Ausgangsdatei folgen immer nach zwei Bytes, deren Wert ungleich Null ist, sechs leere. Wenn man diese nun löscht ist die verschlüsselte Datei unabhängig vom Passwort immer genau doppelt so groß wie der Input.
Meine Implementierung dieses Verfahrens ist nicht sonderlich gut, da sowohl Passwort als auch Dateigröße vom Input beschränkt sind. Wenn man sich mühe gibt und einen gescheiten Algo schreibt, ist dies natürlich nicht der Fall. Weiterhin erfolgt die Verschlüsselung einer Datei in wenigen Millisekunden bis Sekunden, während die Entschlüsselung der selben Datei mehrere Minuten bis Stunden braucht. Aber auch dies kann an meiner Implementierung liegen.
Implementierung
Im Anhang ist eine nicht ganz so saubere -dafür aber ausführbare- Implementierung des Verfahrens, die auch nur die Verwendung einer Zeichenfolge als Passwort erlaubt. Es ist besser, wenn Ihr euch eine eigene Version mit dem obigen Quellcode kompiliert.
Verwendung: Dieses Projekt ist nur zum Spaß irgendwann morgends in der Früh entstanden, aus langeweile. Trotzdem bin ich vorerst nicht damit einverstanden, dass ihr den Quellcode in irgendeiner Art und Weiße verwendet (außer zum testen) oder veröffentlicht (auch nicht in abgewandelter Version!). Ich möchte erstmal euer Feedback zum Verfahren an sich hören, eventuell ist das ganze ja nicht mal sicher.
Bin gespannt auf euer Feedback
LG
~ides
Ich möchte euch heute mein Verschlüsselungsverfahren Cryptor vorstellen: Das ganze ist ein symmetrisches Verschlüsselungsverfahren, d.h. es wird das gleiche Passwort zum ver- und entschlüsseln verwendet. Mit diesem Verfahren kann man sowohl Texte als auch Dateien mit Texten oder Dateien verschlüsseln. Das ganze ist relativ einfach: Zuerst wird die binär Datei eingelesen, bzw. der String in ein Byte-Array konvertiert. Danach erfolgt das selbe für das Passwort. Danach geht man jedes Byte im Input durch und addiert zu jedem Byte des Inputs jedes Byte des Passworts. Am Ende erhält man eine relativ lange Zahl, welche dann in der Ausgangsdatei abgespeichert wird. Zum Entschlüsseln subtrahiert man einfach jedes Byte des Passworts von jedem Byte des Inputs, sodass man wieder die Originaldatei erhält.
Ich weiß nicht, ob es an meiner Implementierung liegt, oder generell am Verfahren, aber in der Ausgangsdatei folgen immer nach zwei Bytes, deren Wert ungleich Null ist, sechs leere. Wenn man diese nun löscht ist die verschlüsselte Datei unabhängig vom Passwort immer genau doppelt so groß wie der Input.
Meine Implementierung dieses Verfahrens ist nicht sonderlich gut, da sowohl Passwort als auch Dateigröße vom Input beschränkt sind. Wenn man sich mühe gibt und einen gescheiten Algo schreibt, ist dies natürlich nicht der Fall. Weiterhin erfolgt die Verschlüsselung einer Datei in wenigen Millisekunden bis Sekunden, während die Entschlüsselung der selben Datei mehrere Minuten bis Stunden braucht. Aber auch dies kann an meiner Implementierung liegen.
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.IO;
- // inputData enthält die Datei, die ver- oder entschlüsselt werden soll
- // passwordData enthält das Passwort
- static byte[] inputData, passwordData;
- // hier drin wird entweder das passwort als Zeichenfolge
- // oder der pfad zu der datei, die als Passwort genutzt
- // werden soll gespeichert
- static string password, outputPath; // im outputPath wird der Pfad zur Ausgabedatei gespeichert
- void LoadPasswordData()
- {
- // falls das Passwort keine Datei sondern eine Zeichenfolge ist,
- // soll diese in ein Byte-Array konvertiert werden
- passwordData = new byte[password.Length];
- int index = 0;
- foreach (char c in password)
- {
- password[index++] = Convert.ToByte(c);
- }
- // falls eine Datei als "Passwort" verwendet werden soll, muss
- // diese eingelesen werden
- passwordData = File.ReadAllBytes(password); // try catchen nicht vergessen ;)
- }
- void Encrypt()
- {
- List<ulong> encrypted = new List<ulong>(); // enthält jedes verschlüsselte byte
- List<byte> encryptedData = new List<byte>(); // enthält jede ulong aus encrypted
- List<byte> outputData = new List<byte>(); // enthält die fertige, verschlüsselte datei
- LoadPasswortData();
- // nun wird jedes Byte in passwordData zu jedem Byte in inputData addiert
- // das ganze wird jeweils in einer ulong gesichert, da dabei eine große Zahl rauskommen kann
- ulong currentByte;
- foreach (byte b in inputData)
- {
- currentByte = b;
- foreach (byte c in passwordData)
- {
- currentByte += c;
- }
- encrypted.Add(currentByte); // das ganze nun noch der List hinzufügen
- }
- // jetzt wird jede ulong in ihre 8 bytes aufgespalten und jedes ihrer bytes
- // der encryptedData hinzugefügt
- foreach (ulong ul in ecrypted)
- {
- for (int i = 0; i < 8; i++)
- {
- encryptedData.Add(BitConverter.GetBytes(ul)[i]);
- }
- }
- // nun werden die seches leeren Bytes, die immer nach zwei "vollen"
- // Bytes auftreten entfernt, bzw. immer die beiden vollen werden
- // zur outputData hinzugefügt
- for (int i = 0; i < encryptedData.Count; i += 8)
- {
- outputData.AddRange(new byte[] { encryptedData[i], encryptedData[i + 1] });
- }
- // nun enthält outputData die fertige verschlüsselte Datei und kann
- // so gespeichert werden
- File.WriteAllBytes(outputPath, outputData.ToArray()); // try catch nicht vergessen ;)
- }
- void Decrypt()
- {
- List<byte> inputFilled = new List<byte>(); // enthält die inputData mit den eingefügten, fehlenden bytes
- // enhält die fertige, entschlüsselte datei oder zeichenfolge zum speichern
- // falls es ursprünglich eine zeichenfolge war, einfach als *.txt (Raw Text) speichern
- List<byte> outputData = new List<byte>();
- LoadPasswordData();
- // nun fügen wir der inputData die fehlenden, leeren bytes wieder hinzu
- inputFilled.AddRange(inputData);
- int index = 2;
- do
- {
- // falls der index größer ist, als der count der liste
- // noch die letzten sechs hinzufügen und danach die schleife verlassen
- if (index >= inputFilled.Count -1)
- {
- inputFilled.AddRange(new byte[] { 0, 0, 0, 0, 0, 0 });
- break;
- }
- inputFilled.InsertRange(index, new byte[] { 0, 0, 0, 0, 0, 0 });
- index += 8;
- } while (inputFilled[inputFilled.Count - 1] != 0);
- // nun muss die datei wieder entschlüsselt werden, d.h. von jedem
- // byte im input jedes byte des passwortes wieder abziehen
- ulong currentByte;
- for (int i = 0; i < inputFilled.Count; i += 8)
- {
- currentByte = BitConverter.ToUInt64(inputFilled.ToArray(), i);
- // diese for-schleife muss eigentlich nicht rückwärts laufen,
- // ist aber noch ein überbleibsel aus einer alten version
- for (int it = passwordData.Length - 1; it > - 1; it--)
- {
- currentByte -= passwordData[it];
- }
- // zum schluss das byte noch der fertigen datei hinzufügen
- // mir ist klar, dass das ganze abstürzt, wenn man bspw.
- // ein falsches passwort verwendet, ist mir aber egal :D
- outputData.Add(Convert.ToByte(currentByte));
- }
- // zum schluss noch die fertige datei speichern
- File.WriteAllBytes(outputPath, outputData.ToArray());
- }
Im Anhang ist eine nicht ganz so saubere -dafür aber ausführbare- Implementierung des Verfahrens, die auch nur die Verwendung einer Zeichenfolge als Passwort erlaubt. Es ist besser, wenn Ihr euch eine eigene Version mit dem obigen Quellcode kompiliert.
Verwendung: Dieses Projekt ist nur zum Spaß irgendwann morgends in der Früh entstanden, aus langeweile. Trotzdem bin ich vorerst nicht damit einverstanden, dass ihr den Quellcode in irgendeiner Art und Weiße verwendet (außer zum testen) oder veröffentlicht (auch nicht in abgewandelter Version!). Ich möchte erstmal euer Feedback zum Verfahren an sich hören, eventuell ist das ganze ja nicht mal sicher.
Bin gespannt auf euer Feedback
LG
~ides