source: trunk/CrypPlugins/XOR/Xor.cs @ 1941

Last change on this file since 1941 was 1259, checked in by Matthäus Wander, 12 years ago

shortened license text to boilerplate notice in all source files

File size: 8.0 KB
Line 
1/*
2   Copyright 2008 Sebastian Przybylski, University of Siegen
3
4   Licensed under the Apache License, Version 2.0 (the "License");
5   you may not use this file except in compliance with the License.
6   You may obtain a copy of the License at
7
8       http://www.apache.org/licenses/LICENSE-2.0
9
10   Unless required by applicable law or agreed to in writing, software
11   distributed under the License is distributed on an "AS IS" BASIS,
12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   See the License for the specific language governing permissions and
14   limitations under the License.
15*/
16
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using Cryptool.PluginBase;
22using Cryptool.PluginBase.Cryptography;
23
24using System.IO;
25using System.ComponentModel;
26using Cryptool.PluginBase.IO;
27using System.Windows.Controls;
28
29namespace Cryptool.XOR
30{
31    [Author("Sebastian Przybylski", "sebastian@przybylski.org", "Uni-Siegen", "http://www.uni-siegen.de")]
32    [PluginInfo(false, "XOR", "XOR -- substitution cipher which is build by simple exclusive disjunction (XOR) operations", "XOR/DetailedDescription/Description.xaml",
33      "XOR/Images/icon.png", "XOR/Images/encrypt.png", "XOR/Images/decrypt.png")]
34    [EncryptionType(EncryptionType.Classic)]
35    public class Xor : IEncryption
36    {
37
38        #region Private variables
39
40        private XORSettings settings;
41        private string inputString;
42        private string outputString;
43        private string key;
44        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
45
46        #endregion
47       
48        #region Public interface
49
50        /// <summary>
51        /// Contructor
52        /// </summary>
53        public Xor()
54        {
55            this.settings = new XORSettings();
56            ((XORSettings)(this.settings)).LogMessage += Xor_LogMessage;
57        }
58
59        /// <summary>
60        /// Get or set all settings for this algorithm
61        /// </summary>
62        public ISettings Settings
63        {
64            get { return (ISettings)this.settings; }
65            set { this.settings = (XORSettings)value; }
66        }
67
68        [PropertyInfo(Direction.OutputData, "Stream output", "The string after processing with the Xor cipher is converted to a stream. Default encoding is used.", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
69        public CryptoolStream OutputData
70        {
71            get
72            {
73                if (outputString != null)
74                {
75                    CryptoolStream cs = new CryptoolStream();
76                    listCryptoolStreamsOut.Add(cs);
77                    cs.OpenRead(Encoding.Default.GetBytes(outputString.ToCharArray()));
78                    return cs;
79                }
80                else
81                {
82                    return null;
83                }
84            }
85            set { }
86        }
87
88        [PropertyInfo(Direction.InputData, "Text input", "Input a string to be processed by the Xor cipher", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
89        public string InputString
90        {
91            get { return this.inputString; }
92            set
93            {
94                if (value != inputString)
95                {
96                    this.inputString = value;
97                    OnPropertyChanged("InputString");
98                }
99            }
100        }
101
102        [PropertyInfo(Direction.InputData, "Key input", "Input a key string", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
103        public string Key
104        {
105            get { return this.key; }
106            set
107            {
108                if (value != this.key)
109                {
110                    this.key = value;
111                }
112            }
113        }
114
115        [PropertyInfo(Direction.OutputData, "Text output", "The string after processing with the Xor cipher", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
116        public string OutputString
117        {
118            get { return this.outputString; }
119            set
120            {
121                outputString = value;
122                OnPropertyChanged("OutputString");
123            }
124        }
125
126        #endregion
127
128        #region IPlugin members
129
130        public void Initialize()
131        {
132        }
133
134        public void Dispose()
135        {
136            foreach (CryptoolStream stream in listCryptoolStreamsOut)
137            {
138                stream.Close();
139            }
140            listCryptoolStreamsOut.Clear();
141        }
142
143        public bool HasChanges
144        {
145            get { return settings.HasChanges; }
146            set { settings.HasChanges = value; }
147        }
148
149        /// <summary>
150        /// Fire, if progress bar has to be updated
151        /// </summary>
152        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
153
154        /// <summary>
155        /// Fire, if new message has to be shown in the status bar
156        /// </summary>
157        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
158
159        public UserControl Presentation
160        {
161            get { return null; }
162        }
163
164        public UserControl QuickWatchPresentation
165        {
166            get { return null; }
167        }
168
169        public void Stop()
170        {
171        }
172
173        public void PostExecution()
174        {
175            Dispose();
176        }
177
178        public void PreExecution()
179        {
180            Dispose();
181        }
182
183        #endregion
184
185        #region INotifyPropertyChanged Members
186
187        public event PropertyChangedEventHandler PropertyChanged;
188
189        public void OnPropertyChanged(string name)
190        {
191            if (PropertyChanged != null)
192            {
193                PropertyChanged(this, new PropertyChangedEventArgs(name));
194            }
195        }
196
197        #endregion
198
199        #region Private methods
200
201        /// <summary>
202        /// Does the actual Xor processing
203        /// </summary>
204        private void ProcessXor()
205        {
206            if (inputString != null)
207            {
208                StringBuilder output = new StringBuilder(string.Empty);
209
210                string longKey = key;
211                //resize key string to same length as input
212                if (inputString.Length > key.Length)
213                {
214                    int keyPos = 0;
215                    for (int i = key.Length; i < inputString.Length; i++)
216                    {
217                        longKey += key[keyPos];
218                        keyPos++;
219                        if (keyPos == key.Length)
220                            keyPos = 0;
221                    }
222                }
223
224                char cpos = '\0';
225                for (int i = 0; i < inputString.Length; i++)
226                {
227                    cpos = (char)(inputString[i] ^ longKey[i]);
228                    output.Append(Convert.ToString(cpos));
229
230                    //show the progress
231                    if (OnPluginProgressChanged != null)
232                    {
233                        OnPluginProgressChanged(this, new PluginProgressEventArgs(i, inputString.Length - 1));
234                    }
235                }
236
237                outputString = output.ToString();
238                OnPropertyChanged("OutputString");
239                OnPropertyChanged("OutputData");
240            }
241        }
242
243        private void Xor_LogMessage(string msg, NotificationLevel logLevel)
244        {
245            if (OnGuiLogNotificationOccured != null)
246            {
247                OnGuiLogNotificationOccured(this, new GuiLogEventArgs(msg, this, logLevel));
248            }
249        }
250
251        #endregion
252
253        #region IPlugin Members
254
255#pragma warning disable 67
256                                public event StatusChangedEventHandler OnPluginStatusChanged;
257#pragma warning restore
258
259        public void Execute()
260        {
261            ProcessXor();
262        }
263
264        public void Pause()
265        {
266        }
267
268        #endregion
269    }
270}
Note: See TracBrowser for help on using the repository browser.