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

Last change on this file since 2334 was 2334, checked in by Matthäus Wander, 11 years ago

removed 1006 occurences of DisplayLevel in 218 files (see #122)

File size: 14.7 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;
29using System.Windows;
30
31
32namespace Cryptool.Plugins.PlayfairAnalysis
33{   
34    [Author("Christoph Hartmann", "chris-ha@freenet.de", "Johannes Gutenberg-Universität Mainz", "http://www.uni-mainz.de")]
35    [PluginInfo(false, "Playfair (Bruteforce) Analysis", "Ciphertext only attack on Playfair", "PlayfairAnalysis/DetailedDescription/Description.xaml", "PlayfairAnalysis/Images/icon.png")]
36    [EncryptionType(EncryptionType.Classic)]
37    public class PlayfairAnalysis : ISpecific
38    {
39        #region Private Variables
40               
41        private PlayfairAnalysisSettings settings = new PlayfairAnalysisSettings();
42        private string inputString;
43        private string outputString;
44        private List<CryptoolStream> listCryptoolStreamsOut = new List<CryptoolStream>();
45        private Thread playFairAttackThread;
46        private bool executionStopped;
47        private double[,] customLogStat;
48        private double[] customLogStat2;
49        private string alphabet = "";
50
51        #endregion
52
53        #region Data Properties
54
55        /// <summary>
56        /// You can add more input properties of other type if needed.
57        /// </summary>
58        [PropertyInfo(Direction.InputData, "Text input", "Input a string to be analyzed", null)]
59        public virtual string InputString
60        {
61            get { return this.inputString; }
62            set
63            {
64                if (value != inputString)
65                {
66                    this.inputString = value;
67                    OnPropertyChanged("InputString");
68                }
69            }
70        }
71
72        /*
73        [PropertyInfo(Direction.InputData, "Bigraph Statistic", "Bigraph Statistic from Playfair Analysis Statistic Plugin", null, false, false, QuickWatchFormat.Hex, null)]
74        public virtual double[] CustomLogStat
75        {
76            get { return this.customLogStat2; }
77            set
78            {
79                if (value != this.customLogStat2)
80                {
81                    this.customLogStat2 = value;
82                    OnPropertyChanged("CustomLogStat");
83                }
84            }
85        }
86        */
87
88        CryptoolStream csBigraphStatistic;
89        [PropertyInfo(Direction.InputData, "Bigraph Statistic", "Bigraph Statistic from Playfair Analysis Statistic Plugin", null)]
90        public CryptoolStream CustomLogStat
91        {
92            get
93            {
94                if (this.csBigraphStatistic != null)
95                {
96                    CryptoolStream cs = new CryptoolStream();
97                    cs.OpenRead(this.csBigraphStatistic.FileName);
98                    return cs;
99                }
100                return null;
101            }
102
103            set
104            {
105                if (value != this.csBigraphStatistic)
106                {
107                    this.csBigraphStatistic = value;
108                    OnPropertyChanged("CustomLogStat");
109                }
110            }
111        }
112
113
114
115
116        /// <summary>
117        /// You can add more output properties ot other type if needed.
118        /// </summary>
119        [PropertyInfo(Direction.OutputData, "Text output", "The output string after playfair analysis", null)]
120        public virtual string OutputString
121        {
122            get { return this.outputString; }
123            set
124            {
125                this.outputString = value;
126                OnPropertyChanged("OutputString");
127            }
128        }
129
130
131        [PropertyInfo(Direction.OutputData, "CryptoolStream output", "The raw CryptoolStream data after playfair analysis", null)]
132        public virtual CryptoolStream OutputData
133        {
134            get
135            {
136                if (outputString != null)
137                {
138                    CryptoolStream cs = new CryptoolStream();
139                    listCryptoolStreamsOut.Add(cs);
140                    cs.OpenRead(Encoding.Default.GetBytes(outputString.ToCharArray()));
141                    return cs;
142                }
143                else
144                {
145                    return null;
146                }
147            }
148            set { }
149        }
150
151        #endregion
152
153        #region IPlugin Members
154
155        public ISettings Settings
156        {
157            get { return settings; }
158        }
159
160        /// <summary>
161        /// HOWTO: You can provide a custom (tabbed) presentation to visualize your algorithm.
162        /// Return null if you don't provide one.
163        /// </summary>
164        public UserControl Presentation
165        {
166            get { return null; }
167        }
168
169        /// <summary>
170        /// HOWTO: You can provide custom (quickwatch) presentation to visualize your algorithm.
171        /// Return null if you don't provide one.
172        /// </summary>
173        public UserControl QuickWatchPresentation
174        {
175            get { return null; }
176        }
177
178        public void PreExecution()
179        {
180            executionStopped = false;           
181        }
182
183       
184
185        /// <summary>
186        /// HOWTO: Enter the algorithm you'd like to implement in this method.
187        /// </summary>
188        public void Execute()
189        {
190            Double[,] BigraphStat;
191            string BsPath;
192            int matrixSize;                     
193
194            ProgressChanged(0, 1);
195
196            // Check settings
197            if (settings.HeapSize < 1)
198            {
199                System.Windows.MessageBox.Show("Heap size has to be a positiv integer!\nHeap size is set to 5000");
200                settings.HeapSize = 5000;
201            }
202
203
204            // BigraphStatistic.CreateBS(@"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\", 6);
205
206            if (settings.UseCustomStatistic == 1)       // Use Bigraph Statistic that is generated by PlayfairAnalysisStatistic plugin
207            {
208                int alphabetLength;
209                int offset = 0;
210                csBigraphStatistic = CustomLogStat;
211
212                alphabetLength = (int)csBigraphStatistic.Read(offset, 1)[0];
213                matrixSize = (int)(Math.Sqrt(alphabetLength));
214
215                BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
216                byte[] statisticBuffer = new byte[8 * BigraphStat.Length];
217
218                alphabet = "";
219                for (int i = 0; i < alphabetLength; i++)
220                {
221                    alphabet += (char)csBigraphStatistic.Read(offset, 1)[0];
222                }
223
224               
225                statisticBuffer = csBigraphStatistic.Read(offset, 8 * BigraphStat.Length);
226               
227
228                for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
229                {                               
230                    for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
231                    {                       
232                        BigraphStat[i, j] = BitConverter.ToDouble(statisticBuffer, offset);
233                        offset += 8;
234                    }                               
235                }
236
237                GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
238                GuiLogMessage("Custom Bigraph Stat successfully set", NotificationLevel.Info);
239            }
240
241            else          // Read Bigraph Statistic from xml file
242            {               
243                switch (settings.MatrixSize)
244                {
245                    case 0:
246                        if (settings.Language == 0)
247                        {
248                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
249                        }
250                        else
251                        {
252                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10seng.xml";
253                        }
254                        matrixSize = 5;
255                        alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
256
257                        break;
258
259                    case 1:
260                        if (settings.Language == 0)
261                        {
262                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10lde.xml";
263                        }
264                        else
265                        {
266                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10leng.xml";
267                        }
268                        matrixSize = 6;
269                        alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
270                        break;
271
272                    default:
273                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
274                        matrixSize = 5;
275                        alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
276                        break;
277                }
278
279                BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
280
281                System.Xml.Serialization.XmlSerializer ReadBS = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
282                System.Xml.XmlReader XmlReader = System.Xml.XmlReader.Create(BsPath);
283                Double[][] BigraphStatDummy = (Double[][])ReadBS.Deserialize(XmlReader);
284                XmlReader.Close();
285
286                for (int i = 0; i < Math.Pow(matrixSize, 2); i++)
287                {
288                    for (int j = 0; j < Math.Pow(matrixSize, 2); j++)
289                    {
290                        BigraphStat[i, j] = BigraphStatDummy[i][j];
291                    }
292                }
293
294                GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
295                GuiLogMessage("Bigraph statistics loaded: " + BsPath, NotificationLevel.Info);
296            }
297
298            GuiLogMessage("Starting Analysis", NotificationLevel.Info);
299
300            KeySearcher keySearcher = new KeySearcher(matrixSize, settings.HeapSize, BigraphStat, alphabet, InputString);
301
302            keySearcher.LogMessageByKeySearcher += new KeySearcher.LogMessageByKeySearcherEventHandler(OnLogMessageByKeySearcher);
303            keySearcher.ProgressChangedByKeySearcher += new KeySearcher.ProgressChangedByKeySearcherEventHandler(OnProgressChangedByKeySearcher);
304
305            playFairAttackThread = new Thread(keySearcher.Attack);
306            playFairAttackThread.IsBackground = true;
307           
308            playFairAttackThread.Start();
309            playFairAttackThread.Join();
310           
311            if (!executionStopped)
312            {
313                OutputString = keySearcher.PlainText;
314                OnPropertyChanged("OutputString");
315                OnPropertyChanged("OutputData");
316                GuiLogMessage("Analysis completed", NotificationLevel.Info);
317                ProgressChanged(1, 1);
318            }
319            else
320            {
321                GuiLogMessage("Analysis aborted", NotificationLevel.Info);
322                ProgressChanged(0, 1);
323            }
324
325        }
326
327       
328
329        public void PostExecution()
330        {
331        }
332
333        public void Pause()
334        {
335        }
336
337        public void Stop()
338        {
339            if (playFairAttackThread != null)
340            {
341                playFairAttackThread.Abort();
342            }
343            executionStopped = true;
344        }
345
346        public void Initialize()
347        {
348            settings.UseCustomStatistic = 0;
349        }
350
351        public void Dispose()
352        {
353            foreach (CryptoolStream stream in listCryptoolStreamsOut)
354            {
355                stream.Close();
356            }
357            listCryptoolStreamsOut.Clear();
358        }
359
360        #endregion
361
362        #region Event Handling
363
364        public event StatusChangedEventHandler OnPluginStatusChanged;
365
366        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
367
368        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
369
370        public event PropertyChangedEventHandler PropertyChanged;
371               
372
373        private void GuiLogMessage(string message, NotificationLevel logLevel)
374        {
375            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
376        }
377
378        private void OnPropertyChanged(string name)
379        {
380            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
381        }
382
383        private void ProgressChanged(double value, double max)
384        {
385            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
386        }
387
388
389        // Events fired by other classes:
390               
391        void OnLogMessageByKeySearcher(string msg, NotificationLevel loglevel)
392        {
393            GuiLogMessage(msg, loglevel);
394        }
395
396        void OnProgressChangedByKeySearcher(double value, double max)
397        {
398            ProgressChanged(value, max);
399        }
400
401
402        #endregion
403
404        #region public properties
405
406        public Thread PlayFairAttackThread
407        {
408            get
409            {
410                return playFairAttackThread;
411            }
412            set
413            {
414                playFairAttackThread = value;
415            }
416        }
417
418        #endregion
419    }
420
421}
Note: See TracBrowser for help on using the repository browser.