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

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

Code cleanup:

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