Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 198
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Generische, verschlüsselte Serialisierung und Deserialisieru


Autor: BlackDragon
Sprache: C#
Bewertung:
noch nicht bewertet
Anzahl der Aufrufe: 5549
  
Kick it on dotnet-kicks.de  

Beschreibung:

Mithilfe dieser Generischen Klasse ist es Möglich, ein Object auf einen Datenträger verschlüsselt zu Serialisieren und natürlich auch wieder entschlüsselt zu Deserialisieren.

Abgelegt unter: Verschlüselung, Serialisierung, Deserialisierung.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace ToolSet.Crypto {
    /// <summary>
    /// Mithilfe dieser Generischen Klasse ist es Möglich, ein Object auf einen Datenträger verschlüsselt zu Serialisieren und 
    /// natürlich auch wieder entschlüsselt zu Deserialisieren.
    /// </summary>
    /// <example>
    /// <code lang="C#">
    ///     ToolSet.Crypto.GenericCryptoClass gcc = new ToolSet.Crypto.GenericCryptoClass();
    ///
    ///     gcc.CryptoSerialize<DataSet>(@"d:\ttest.bin", (DataSet)dataGridView1.DataSource);
    ///     dataGridView2.DataSource = gcc.CryptoDeSerialize<DataSet>(@"d:\ttest.bin");
    ///     dataGridView2.DataMember = "table";
    /// </code>
    /// </example>
    public class GenericCryptoClass {
        /// <summary>
        /// Ein Default Key, dieser wird immer benutzt falls keiner angegeben wird.
        /// </summary>
        private const String DEFAULTKEY = "o[cc_IQETy";
        /// <summary>
        /// Ein Default initialisierungsvektor,dieser wird immer benutzt falls keiner angegeben wird.
        /// </summary>
        private const String DEFAULTIV = @"jOU\9_JpWt4";
        /// <summary>
        /// Initialisiert eine neue GenericCryptoClass Klasse
        /// </summary>
        public GenericCryptoClass() { }
        /// <summary>
        /// Erzeugt eine verschluesselts, Serialisiertes Abbild der jeweiligen Klassen auf einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <param name="toSerialize">Das Object, das Serialisiert werden soll</param>
        public void CryptoSerialize<T>(String path, T toSerialize) {
            CryptoSerialize(path, toSerialize, DEFAULTKEY);
        }
        /// <summary>
        /// Erzeugt eine verschluesselts, Serialisiertes Abbild der jeweiligen Klassen auf einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <param name="toSerialize">Das Object, das Serialisiert werden soll</param>
        /// <param name="key">Der Schlüssel, mit dem das Abbild verschlüsselt werden soll</param>
        public void CryptoSerialize<T>(String path, T toSerialize, string key) {
            CryptoSerialize(path, toSerialize, key, DEFAULTIV);
        }
        /// <summary>
        /// Erzeugt eine verschluesselts, Serialisiertes Abbild der jeweiligen Klassen auf einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <param name="toSerialize">Das Object, das Serialisiert werden soll</param>
        /// <param name="key">Der Schlüssel, mit dem das Abbild verschlüsselt werden soll</param>
        /// <param name="iv">Der Initialisierungsverktor, für die Initialisierung der Verschlüsselung</param>
        public void CryptoSerialize<T>(String path, T toSerialize, string key, string iv) {
            XmlSerializer xmlSerializer = null;
            CryptoStream cryptoStream = null;
            FileStream fileStream = null;

            try {
                fileStream = new FileStream(path, FileMode.Create, FileAccess.Write);
                cryptoStream = new CryptoStream(fileStream, CryptoTransformer(key, iv).CreateEncryptor(), CryptoStreamMode.Write);

                xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(cryptoStream, toSerialize);

                fileStream.Flush();
                cryptoStream.Flush();
            } finally {
                cryptoStream.Close();
                fileStream.Close();
            }
        }
        /// <summary>
        /// Deserialisiert ein verschlüsseltes, serialisiertes Abbild einer Klasse von einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <returns>Das Deserialisiert Object</returns>
        public T CryptoDeSerialize<T>(String path) { return CryptoDeSerialize<T>(path, DEFAULTKEY); }
        /// <summary>
        /// Deserialisiert ein verschlüsseltes, serialisiertes Abbild einer Klasse von einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <param name="key">Der Schlüssel, mit dem das Abbild verschlüsselt werden soll</param>
        /// <returns>Das Deserialisiert Object</returns>
        public T CryptoDeSerialize<T>(String path, string key) { return CryptoDeSerialize<T>(path, key, DEFAULTIV); }
        /// <summary>
        /// Deserialisiert ein verschlüsseltes, serialisiertes Abbild einer Klasse von einem Datenträger
        /// </summary>
        /// <typeparam name="T">Der Typ, Serialisiert werden soll</typeparam>
        /// <param name="path">Der Pfad, an dem das Serialisierte abbild erezugt werden soll</param>
        /// <param name="key">Der Schlüssel, mit dem das Abbild verschlüsselt werden soll</param>
        /// <param name="iv">Der Initialisierungsverktor, für die Initialisierung der Verschlüsselung</param>
        /// <returns>Das Deserialisiert Object</returns>
        public T CryptoDeSerialize<T>(String path, string key, string iv) {
            XmlSerializer xmlSerializer = null;
            FileStream fileStream = null;
            CryptoStream cryptoStream = null;

            try {
                if(!File.Exists(path)) {
                    throw new FileNotFoundException(String.Format("Die Datei, {0} konnte nicht geöffnet werden", path));
                }

                fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
                cryptoStream = new CryptoStream(fileStream, CryptoTransformer(key, iv).CreateDecryptor(), CryptoStreamMode.Read);
                xmlSerializer = new XmlSerializer(typeof(T));

                return (T)xmlSerializer.Deserialize(cryptoStream);
            } finally {
                fileStream.Close();
            }
        }
        /// <summary>
        /// Erzeugt einen einfachen Rijndael CryptoTransformer
        /// </summary>
        /// <param name="key">Der Schlüssel, mit dem das Abbild verschlüsselt werden soll</param>
        /// <param name="iv">Der Initialisierungsverktor, für die Initialisierung der Verschlüsselung</param>
        /// <returns>Ein Rijndael CryptoTransformer</returns>
        private Rijndael CryptoTransformer(string key, string iv) {
            Rijndael cryptoTransformer = Rijndael.Create();
            cryptoTransformer.Key = ASCIIEncoding.ASCII.GetBytes(GetPaddedString(key));
            cryptoTransformer.IV = ASCIIEncoding.ASCII.GetBytes(GetPaddedString(iv));
            cryptoTransformer.Padding = PaddingMode.Zeros;

            return cryptoTransformer;
        }
        /// <summary>
        /// Diese Methode, verstärkt noch ein wenig die Verschlüsselung.
        /// </summary>
        /// <param name="val">ein Wert der gepaddet werden soll</param>
        /// <returns>ein gepaddeter String</returns>
        private string GetPaddedString(string val) {
            //je nach länge wird entweder vorn oder hinten und mit unterschiedlichen Zeichen gepaddet

            if(val.Length % 2 == 0)
                return val.PadLeft(16, (char)(val.Length + 64));
            else
                return val.PadRight(16, (char)(90 - val.Length));
        }
    }
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

ConfusedGuy schrieb am:  03.02.2008 13:04:46

Sieht so aus als wäre da jemand dem Copy+Paste-Monster zum Opfer gefallen. Schau Dir doch nochmal die Funktionen an die einen Key mit gegeben bekommen. Sie nutzen alle immer noch den DEFAULTKEY..oder sehe ich da was falsch?
BlackDragon schrieb am:  03.02.2008 13:39:20

@ConfusedGuy da hast du natürlich recht, berichtigt
Maurizio schrieb am:  23.03.2008 20:30:17

Hallo!
Ich bin ein absoluter Anfänger.
Ich habe dein Code ausprobiert und folgendes festgestellt:
wenn ich beim Serialisieren ein Verschlüsselungsstring übergebe, beim deserialisieren aber nicht, so wird das Objekt trotzdem richtig deserialisiert.
Heißt das nicht, dass immernoch nur mit Standardstring verschlüsselt wird?
Jan Welker schrieb am:  25.03.2008 17:02:35

Hallo,

bitte frage im <a href="http://dotnet-forum.de">dotnet-forum.de</a> nach.

Jan
Raimund Schuldhaus schrieb am:  11.04.2008 14:46:55

Hallo,

in dem Code wird letztendlich nur der filestrean serialisiert, bzw. wieder deserialisiert. Der Aufruf der Serialize- bzw. Deserialize-Methoden muss mit dem CryptoStream erfolgen. Dann klappts auch!

Grüße

Raimund


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.