source: trunk/CrypPlugins/PlayfairAnalysis/PlayfairAnalysis.cs @ 1939

Last change on this file since 1939 was 1939, checked in by Christoph Hartmann, 11 years ago

Playfair Analysis Plugin (basically runs, but not ready yet)

File size: 11.2 KB
Line 
1/* HOWTO: Change year, author name and organization.
2   Copyright 2010 Christoph Hartmann, Johannes Gutenberg-Universität Mainz
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*/
16using System;
17using System.Collections.Generic;
18using System.ComponentModel;
19using System.Linq;
20using System.Text;
21using System.Windows.Controls;
22using Cryptool.PluginBase;
23using Cryptool.PluginBase.Analysis;
24using Cryptool.PluginBase.Cryptography;
25using Cryptool.PluginBase.IO;
26using Cryptool.PluginBase.Miscellaneous;
27using Mischel.Collections;
28using System.Threading;
29
30
31namespace Cryptool.Plugins.PlayfairAnalysis
32{   
33    [Author("Christoph Hartmann", "chris-ha@freenet.de", "Johannes Gutenberg-Universität Mainz", "http://www.uni-mainz.de")]
34    [PluginInfo(false, "Playfair Analysis", "Ciphertext only attack on Playfair", "PlayfairAnalysis/DetailedDescription/Description.xaml", "PlayfairAnalysis/Images/icon.png")]
35    [EncryptionType(EncryptionType.Classic)]
36    public class PlayfairAnalysis : ISpecific
37    {
38        #region Private Variables
39               
40        private PlayfairAnalysisSettings settings = new PlayfairAnalysisSettings();
41        private string inputString;
42        private string outputString;
43        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
44        private Thread playFairAttackThread;
45        private bool executionStopped;
46
47        #endregion
48
49        #region Data Properties
50
51        /// <summary>
52        /// You can add more input properties of other type if needed.
53        /// </summary>
54        [PropertyInfo(Direction.InputData, "Text input", "Input a string to be analyzed", null, DisplayLevel.Beginner)]
55        public string InputString
56        {
57            get { return this.inputString; }
58            set
59            {
60                if (value != inputString)
61                {
62                    this.inputString = value;
63                    OnPropertyChanged("InputString");
64                }
65            }
66        }
67
68        /// <summary>
69        /// You can add more output properties ot other type if needed.
70        /// </summary>
71        [PropertyInfo(Direction.OutputData, "Text output", "The output string after playfair analysis", null, DisplayLevel.Beginner)]
72        public string OutputString
73        {
74            get { return this.outputString; }
75            set
76            {
77                this.outputString = value;
78                OnPropertyChanged("OutputString");
79            }
80        }
81
82
83        [PropertyInfo(Direction.OutputData, "CryptoolStream output", "The raw CryptoolStream data after playfair analysis", null, DisplayLevel.Beginner)]
84        public CryptoolStream OutputData
85        {
86            get
87            {
88                if (outputString != null)
89                {
90                    CryptoolStream cs = new CryptoolStream();
91                    listCryptoolStreamsOut.Add(cs);
92                    cs.OpenRead(Encoding.Default.GetBytes(outputString.ToCharArray()));
93                    return cs;
94                }
95                else
96                {
97                    return null;
98                }
99            }
100            set { }
101        }
102
103        #endregion
104
105        #region IPlugin Members
106
107        public ISettings Settings
108        {
109            get { return settings; }
110        }
111
112        /// <summary>
113        /// HOWTO: You can provide a custom (tabbed) presentation to visualize your algorithm.
114        /// Return null if you don't provide one.
115        /// </summary>
116        public UserControl Presentation
117        {
118            get { return null; }
119        }
120
121        /// <summary>
122        /// HOWTO: You can provide custom (quickwatch) presentation to visualize your algorithm.
123        /// Return null if you don't provide one.
124        /// </summary>
125        public UserControl QuickWatchPresentation
126        {
127            get { return null; }
128        }
129
130        public void PreExecution()
131        {
132            executionStopped = false;           
133        }
134
135       
136
137        /// <summary>
138        /// HOWTO: Enter the algorithm you'd like to implement in this method.
139        /// </summary>
140        public void Execute()
141        {
142            Double[,] BigraphStat;
143            string BsPath;
144            int matrixSize;                     
145
146            ProgressChanged(0, 1);
147
148            // Check settings
149            if (settings.HeapSize < 1)
150            {
151                System.Windows.MessageBox.Show("Heap size hast to be a positiv integer!\nHeap size is set to 5000");
152                settings.HeapSize = 5000;
153            }
154
155
156            // BigraphStatistic.CreateBS(@"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\", 6);
157
158
159            // Read Bigraph Statistic from xml file
160           
161            switch (settings.MatrixSize)
162            {
163                case 0:
164                    if (settings.Language == 0)
165                    {
166                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
167                    }
168                    else
169                    {
170                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10seng.xml";
171                    }
172                    matrixSize = 5;
173                    break;
174
175                case 1:
176                    if (settings.Language == 0)
177                    {
178                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10lde.xml";
179                    }
180                    else
181                    {
182                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10leng.xml";
183                    }
184                    matrixSize = 6;
185                    break;
186
187                default:
188                    BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
189                    matrixSize = 5;
190                    break;
191            }
192
193            GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
194           
195
196            BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
197           
198            System.Xml.Serialization.XmlSerializer ReadBS = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
199            System.Xml.XmlReader XmlReader = System.Xml.XmlReader.Create(BsPath);
200            Double[][] BigraphStatDummy = (Double[][])ReadBS.Deserialize(XmlReader);
201            XmlReader.Close();
202
203            for (int i = 0; i < Math.Pow(matrixSize, 2); i++)
204            {
205                for (int j = 0; j < Math.Pow(matrixSize, 2); j++)
206                {
207                    BigraphStat[i, j] = BigraphStatDummy[i][j];
208                }
209            }
210           
211            GuiLogMessage("Bigraph statistics loaded: " + BsPath, NotificationLevel.Info);
212            GuiLogMessage("Starting Analysis", NotificationLevel.Info);
213
214            KeySearcher keySearcher = new KeySearcher(matrixSize, settings.HeapSize, BigraphStat, InputString);
215
216            keySearcher.LogMessageByKeySearcher += new KeySearcher.LogMessageByKeySearcherEventHandler(OnLogMessageByKeySearcher);
217            keySearcher.ProgressChangedByKeySearcher += new KeySearcher.ProgressChangedByKeySearcherEventHandler(OnProgressChangedByKeySearcher);
218
219            playFairAttackThread = new Thread(keySearcher.Attack);
220            playFairAttackThread.IsBackground = true;
221           
222            playFairAttackThread.Start();
223            playFairAttackThread.Join();
224           
225            if (!executionStopped)
226            {
227                OutputString = keySearcher.PlainText;
228                OnPropertyChanged("OutputString");
229                OnPropertyChanged("OutputData");
230                GuiLogMessage("Analysis completed", NotificationLevel.Info);
231                ProgressChanged(1, 1);
232            }
233            else
234            {
235                GuiLogMessage("Analysis aborted", NotificationLevel.Info);
236                ProgressChanged(0, 1);
237            }
238
239        }
240
241       
242
243        public void PostExecution()
244        {
245        }
246
247        public void Pause()
248        {
249        }
250
251        public void Stop()
252        {
253            playFairAttackThread.Abort();
254            executionStopped = true;
255        }
256
257        public void Initialize()
258        {
259        }
260
261        public void Dispose()
262        {
263            foreach (CryptoolStream stream in listCryptoolStreamsOut)
264            {
265                stream.Close();
266            }
267            listCryptoolStreamsOut.Clear();
268        }
269
270        #endregion
271
272        #region Event Handling
273
274        public event StatusChangedEventHandler OnPluginStatusChanged;
275
276        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
277
278        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
279
280        public event PropertyChangedEventHandler PropertyChanged;
281               
282
283        private void GuiLogMessage(string message, NotificationLevel logLevel)
284        {
285            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
286        }
287
288        private void OnPropertyChanged(string name)
289        {
290            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
291        }
292
293        private void ProgressChanged(double value, double max)
294        {
295            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
296        }
297
298
299        // Events fired by other classes:
300               
301        void OnLogMessageByKeySearcher(string msg, NotificationLevel loglevel)
302        {
303            GuiLogMessage(msg, loglevel);
304        }
305
306        void OnProgressChangedByKeySearcher(double value, double max)
307        {
308            ProgressChanged(value, max);
309        }
310
311
312        #endregion
313
314        #region public properties
315
316        public Thread PlayFairAttackThread
317        {
318            get
319            {
320                return playFairAttackThread;
321            }
322            set
323            {
324                playFairAttackThread = value;
325            }
326        }
327
328        #endregion
329    }
330
331}
Note: See TracBrowser for help on using the repository browser.