Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Fr 28.08.15 13:34 
Hallo Leute. Ich habe auf einer Windows Form zwei RichTextBoxen(x und y). Wenn ich sie speichere sollen sie 'Verschlüsselt' werden. Also mit einer Codierung ausgestattet werden, also von anderen personen nicht gelesen werden kann.
Und beim Öffnen sollen die Datein dann entschlüsselt werden, dass man sie lesen kann.

Könntet ihr mir hier bitte Code - Beispiele geben er mir weiterhelfen?
Mfg :D

Moderiert von user profile iconTh69: Titel geändert.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 28.08.15 16:33 
Hallo,

wie sicher soll die Verschlüsselung denn sein? Einfache wären XOR, Caesar (ROT13) oder ähnliche, z.B. Implementing XOR cipher encryption / decryption in C#

Ansonsten mal in den Namensbereich System.Security.Cryptography schauen (AesManaged, RijndaelManaged, etc.).

Ich selber habe immer gerne mit dem BlowFish-Algorithmus gearbeitet (damals in C++) - mußt mal schauen, ob es auch eine C#-Implementierung gibt.

Für diesen Beitrag haben gedankt: Csharp-programmierer
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 29.09.15 19:18 
Es muss jetzt nicht soo sicher sein. Jetzt ist ja hinzugekommen, dass das Programm mehrere RichTextBoxen erzeugt. Wenn ich das Projekt speichere, sollen die Daten der RichTextBox in einen Ordner verschlüsselt werden. Könnten Sie mir vielleicht eine Starthilfe geben?

Mfg :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 29.09.15 19:37 
Wie TH69 schon sagt gibt der Cryptography Namespace so ziemlich alles her was man sich bei Verschlüsselung denken kann (nur zaubern kann der auch nicht).
Wenn die Verschlüsselung Rechner und Account gebunden sein darf dann bekommt man was sicheres z.B mit der ProtectedData Klasse hin. Codebeispiel z.B. hier.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 29.09.15 21:46 
Ich habe es jetzt mit den beiden Algorithmen probiert. Das Verschlüsseln klappt. Jedoch kommt da immer was anderes raus, was ich natürlich nicht möchte. Der Algorithmus zum entschlüsseln haut nicht hin:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public static string Decrypt(string text)
        {
            string result = null;

            if (!String.IsNullOrEmpty(text))
            {
                byte[] encryptedBytes = Encoding.Unicode.GetBytes(text);

                SymmetricAlgorithm symmetricAlgorithm = DES.Create();
                symmetricAlgorithm.Key = new byte{12} ;
                using (MemoryStream memoryStream = new MemoryStream(encryptedBytes))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        byte[] decryptedBytes = new byte[encryptedBytes.Length];
                        cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);
                        result = Encoding.Unicode.GetString(decryptedBytes);
                    }
                }
            }

            return result;
        }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public static string Crypt(string text)
        {
            string result = null;

            if (!String.IsNullOrEmpty(text))
            {
                byte[] plaintextBytes = Encoding.Unicode.GetBytes(text);

                SymmetricAlgorithm symmetricAlgorithm = DES.Create();
                symmetricAlgorithm.Key = new byte[8] { 12345678 };
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
                    }

                    result = Encoding.Unicode.GetString(memoryStream.ToArray());
                }
            }

            return result;
        }


Und das Aufrufen der beiden Methoden:
ausblenden C#-Quelltext
1:
2:
this.richTextBox1.Text = Crypt(this.richTextBox2.Text);
this.richTextBox1.Text = Decrypt(null //Hier habe ich schon mehreres Probiert (null, this.richTextBox1.Text);


Wo liegt hier der Fehler?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 29.09.15 22:32 
Nur überflogen aber das mindeste was man tun sollte ist beim verschlüsseln und entschlüsseln den gleichen Key zu verwenden.
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 30.09.15 07:53 
ausblenden C#-Quelltext
1:
result = Encoding.Unicode.GetString(memoryStream.ToArray());					

Ah ja. Du gehst offenbar aus, du könntest beliebige Bytes in ein Unicode encoding stopfen und dann die gleichen Bytes wieder bekommen.
Dem ist nicht so. Der Rückgabewert deiner crypt-methode sollte entweder ein Byte[] oder ein hex string oder base64 sein.

Nicht jede Bytesequenz ist eine gültige Unicode Zeichenkette.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 30.09.15 19:23 
Also zu user profile iconRalf Jansen:
Ich habe es schon versucht mit nur einem Key.
ausblenden C#-Quelltext
1:
2:
symmetricAlgorithm.Key = new byte[1] { 1 };
    symmetricAlgorithm.Key = 1;


Bei beiden Zeilen wird mir jedoch ein Fehler vorgeworfen, dass die Zahl zu klein ist (oder in die Richtung so).
Bei der zweiten Methode ist es nicht möglich, da die Methode nur den Typ Byte annimmt.

Zu user profile iconjfheins:
Ich weiß nicht, wie ich das in ein String umwandeln soll. Wenn ich .ToString() einsetzte, gibt das Programm ein Fehler.

Könnten Sie mir bitte weiterhelfen?
Mfg :)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 30.09.15 19:54 
Jeder Algo benötigt eine bestimmte Schlüssellänge. Bei DES sind es 64 bit (d.h. 8 Byte), s.a. DES.Key.

In der Ausgabe des Beispiels findest du für die gebräuchlichsten Algos die entsprechende Schlüssellängen aufgelistet: SymmetricAlgorithm.LegalKeySizes
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 30.09.15 20:11 
Zitat:
Bei beiden Zeilen wird mir jedoch ein Fehler vorgeworfen, dass die Zahl zu klein ist (oder in die Richtung so).
Bei der zweiten Methode ist es nicht möglich, da die Methode nur den Typ Byte annimmt.

Ich zitiere mal die Doku zu DES und dessen Key.
MSDN hat folgendes geschrieben:
This algorithm supports a key length of 64 bits.

Bei deiner Crypt Methode würde es also passen. Wenn du nur einfach auch hingehen würdest und den gleichen Key auch beim entschlüsseln verwenden würdest wie beim verschlüsseln würde das also vermutlich meist hinhauen (solange du im verschlüsselten Bytestrom keine nicht als Unicode darstellbaren Bytefolgen bekommst. ).

Wieso eigentlich DES? Bei den vielen Möglichkeiten die es gibt wäre DES so ziemlich das letzte was mir einfallen würde. Wenn das wegen meinem Link war, sorry, es ging mir um die Lösung in diesem Threads nicht um den Code in der Frage des verlinkten Threads. Der Code den du von dort übernommen hast ist eher Mist und hat seine Probleme, darum hat er ja auch bei Stackoverflow dazu vermutlich nachgefragt ;)
Wenn du dich an was von dort orientieren willst dann eher an einer der Lösungen aus den 2 gut bewerteten Antworten dort.

Zitat:
Könnten Sie mir bitte weiterhelfen?


Unsere heutige Jugend :roll: Ist bei euch jetzt eine besondere Hartnäckigkeit üblich oder doch einfach nur Lernresistenz? Bei den hunderten Leuten die hier durchkommen und sich üblicherweise nicht kennen bist du der Einzige der sich gegen ein DU sträubt. Hab ich da einen trennt verpasst? Ich will dich nicht siezen und einseitiges duzen ist dämlich. Tu uns doch den gefallen und vergiss mal deine gute Erziehung sei einfach entspannt und duze hier einfach so rum.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 30.09.15 20:34 
Entschuldingung, war nicht böse gemeint. Mir fällt es nur schwer fremde Leute zu duzen. Lernresistent bin ich nicht (auf jeden Fall nicht was die Programmierung oder Informatik angeht. Genau das Gegenteil ist hier der Fall). Ich interessiere mich nur extrem für die Anwendungsentwicklung, möchte meine Programme so professionell wie möglich gestalten, soweit wie möglich. Ich weiß, ich nerve hier im Forum etwas, aber sobald ich eine neue Idee für ein Projekt habe, möchte ich diese auch veruchen so gut wie möglich umzusetzen. Manchmal weiß ich deswegen auch nicht mehr weiter - aber man lernt ja nie aus.

Gerade was Programmierung und PCs angeht bin ich der totale Freak (stellt euch jetzt nicht vor, dass ich ein Stubenhocker bin. Ich gehe natürlich mit Freunden raus und gehe schwimmen ... Meistens programmiere ich nur abends oder bei schlechtem Wetter). Ich möchte natürlich nicht mit absicht nerven, doch ich möchte so vieles wie möglich über Programmieren lernen.

Ich versuche die Ideen morgen umzusetzen, in der Hoffnung das es funktioniert :beer:.
Mit freundlichen Grüßen :)