source: trunk/CrypPlugins/AutokorrelationFunction/AutokorrelationFunction.cs @ 1785

Last change on this file since 1785 was 1754, checked in by nolte, 11 years ago

Small changes on Autokey-Analyser

File size: 11.9 KB
Line 
1/* HOWTO: Change year, author name and organization.
2   Copyright 2010 Your Name, University of Duckburg
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.Linq;
19using System.Text;
20using Cryptool.PluginBase;
21using System.ComponentModel;
22using Cryptool.PluginBase.IO;
23using Cryptool.PluginBase.Miscellaneous;
24using System.Windows.Controls;
25using Cryptool.PluginBase.Analysis;
26using System.Windows.Media;
27using Cryptool.PluginBase.Utils.Graphics.Diagrams.Histogram;
28
29namespace Cryptool.Plugins.AutokorrelationFunction
30{
31    [Author("Dennis Nolte", "nolte@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
32    [PluginInfo(false, "AutokorrelationFunction", "Calculates the Autokorrelation of a cipher", "AutokorrelationFunction/DetailedDescription/Description.xaml", "AutokorrelationFunction/icon.png")]
33
34    public class AutokorrelationFunction : IStatistic
35    {
36        #region Private Variables
37
38        private readonly AutokorrelationFunctionSettings settings;
39        private AutocorrelationPresentation presentation;
40
41        private String cipher = "";                                     //The cipher to be analysed
42        private int probablelength = 0;                                 //estimated keylength
43        private double probablekorr = -999999.999999;                   //initialized probable korrelation of the length
44        private String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";         //used alphabet
45        private double same;                                            //Found same letter counter
46        private double[] ak;                                            // Autokorrelation Values
47        private HistogramElement bar;                                   
48        private HistogramDataSource data;
49
50        #endregion
51
52        #region Data Properties
53
54        /// <summary>
55        /// The input for the ciphertext
56        /// </summary>
57        [PropertyInfo(Direction.InputData, "Cipher Input", "Enter your cipher here", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
58        public String InputCipher
59        {
60            get
61            {
62                return cipher;
63            }
64            set
65            {
66                this.cipher = value;
67                OnPropertyChanged("InputCipher");
68            }
69        }
70
71        /// <summary>
72        /// The output for the found shift value (most probable keylength)
73        /// </summary>
74        [PropertyInfo(Direction.OutputData, "Keylength Output", "The most probable keylength for the analysed ciphertext", "", DisplayLevel.Beginner)]
75        public int OutputLength
76        {
77            get
78            {
79                return probablelength;
80            }
81            set
82            {
83                this.probablelength = value;
84                OnPropertyChanged("OutputLength");
85            }
86        }
87
88        #endregion
89
90        #region IPlugin Members
91
92        public AutokorrelationFunction()
93        {
94            settings = new AutokorrelationFunctionSettings();
95            presentation = new AutocorrelationPresentation();
96            HistogramElement bar = new HistogramElement(0, 0, "");
97            data = new HistogramDataSource();
98
99        }
100        public ISettings Settings
101        {
102            get { return settings; }
103        }
104
105        public UserControl Presentation
106        {
107            get { return presentation; }
108        }
109
110        public UserControl QuickWatchPresentation
111        {
112            get { return presentation; }
113        }
114
115        public void PreExecution()
116        {
117        }
118
119        public void Execute()
120        {
121
122//START------------------------------------------------------------------------------------------------------------
123//Preparations for the Analyse-------------------------------------------------------------------------------------
124
125            if (InputCipher != null)                                //Starts only if a ciphertext is set
126            {
127                ProgressChanged(0, 1);
128
129                cipher = InputCipher;                               //initialising the ciphertext
130                cipher = prepareForAnalyse(cipher);                 //and prepare it for the analyse (-> see private methods section)
131
132                ak = new double[cipher.Length];                     //initialise ak[]...there are n possible shifts where n is cipher.length
133
134                presentation.histogram.SetBackground(Brushes.Beige);              //sets the background colour for the quickwatch
135                presentation.histogram.SetHeadline("Autocorrelation matches");    //sets its title
136
137                //-----------------------------------------------------------------------------------------------------------------
138                //Analyse----------------------------------------------------------------------------------------------------------
139                //-----------------------------------------------------------------------------------------------------------------             
140
141                //for each possible shift value...
142                for (int t = 0; t < cipher.Length; t++)
143                {
144                    same = 0;
145
146                    //...calculate how often the letters match...
147                    for (int x = 0; x < cipher.Length - t; x++)
148                    {
149                        if (cipher[x] == cipher[x + t])
150                        {
151                            same++;
152                        }
153                    }
154
155                    try
156                    {
157                        //...and save the count for the matches at the shift position
158                        ak[t] = same;
159                    }
160                    catch
161                    {
162                    }
163                }
164
165                data.ValueCollection.Clear();
166
167                //for all observed shifts...
168                for (int y = 1; y < ak.Length; y++)
169                {
170                    //find the one with the highest match count...
171                    if (ak[y] > probablekorr)
172                    {
173                        probablekorr = ak[y];
174                        probablelength = y;                 //...and remember this shift value
175                    }
176                }
177
178                //find the top 13 matches...
179                if (ak.Length > 11)
180                {
181                    ak = findTopThirteen(ak);
182                }
183
184                for (int y = 1; y < ak.Length; y++)
185                {
186                    if (ak[y] > -1)                         //Adds a bar into the presentation if it is higher then the average matches
187                    {
188                        bar = new HistogramElement(ak[y], ak[y], "" + y);
189                        data.ValueCollection.Add(bar);
190                    }
191                }
192
193                presentation.histogram.SetHeadline("Highest match count " + probablekorr + " with shift: " + probablelength);
194
195                if (data != null)
196                {
197                    presentation.histogram.ShowData(data);
198                }
199
200                OutputLength = probablelength;              //sending the keylength via output
201                OnPropertyChanged("OutputLength");
202            } 
203
204
205            ProgressChanged(1, 1);
206
207//EXECUTE END------------------------------------------------------------------------------------------------------
208       
209        }
210
211        public void PostExecution()
212        {
213        }
214
215        public void Pause()
216        {
217        }
218
219        public void Stop()
220        {
221            presentation.histogram.SetBackground(Brushes.LightGray);
222        }
223
224        public void Initialize()
225        {
226        }
227
228        public void Dispose()
229        {
230        }
231
232        #endregion
233
234        #region Private Methods
235
236//PREPARE PART---------------------------------------------------------------------------------------------------------------------------
237
238        /// <summary>
239        /// Remove spaces and symbols not provided by the alphabet from the text
240        /// </summary>
241        private String prepareForAnalyse(String c)
242        {
243            String prepared = "";
244
245            c = c.ToUpper();
246
247            for (int x = 0; x < c.Length; x++)
248            {
249                if (getPos(c[x]) != -1)
250                {
251                    prepared = prepared + c[x];
252                }
253            }
254            return prepared;
255        }
256
257
258//---------------------------------------------------------------------------------------------------------------------------------------
259//LETTER TO NUMBER----------------------------------------------------------------------------------------------------------------------
260
261        /// <summary>
262        /// Convert a the letter to an int-value that resembles his position in the given alphabet
263        /// </summary>
264        private int getPos(char c)
265        {
266            int pos = -1;
267            for (int i = 0; i < alphabet.Length; i++)
268            {
269                if (alphabet[i] == c)
270                {
271                    pos = i;
272                }
273            }
274            return pos;
275        }
276
277
278//---------------------------------------------------------------------------------------------------------------------------------------
279//FIND TOP 13----------------------------------------------------------------------------------------------------------------------------
280
281        /// <summary>
282        /// Thirteen possible shift values with the highest match count are enough information
283        /// </summary>
284        private double[] findTopThirteen(double[] ak)
285        {
286            double[] top = ak;
287            int thrownaway = 0;
288
289            for(int match=0; match < probablekorr; match++)
290            {
291                for(int x=0;x<ak.Length;x++)
292                {
293                    if(top[x] == match)
294                    {
295                        top[x] = -1;
296                        thrownaway++;
297                    }
298                    if(thrownaway == (ak.Length)-13)
299                    {
300                        return top;
301                    }
302
303                }
304            }
305            return top;
306        }
307
308
309
310
311
312//---------------------------------------------------------------------------------------------------------------------------------------
313
314        #endregion
315
316        #region Event Handling
317
318        public event StatusChangedEventHandler OnPluginStatusChanged;
319
320        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
321
322        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
323
324        public event PropertyChangedEventHandler PropertyChanged;
325
326        private void GuiLogMessage(string message, NotificationLevel logLevel)
327        {
328            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
329        }
330
331        private void OnPropertyChanged(string name)
332        {
333            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
334        }
335
336        private void ProgressChanged(double value, double max)
337        {
338            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
339        }
340
341        #endregion
342    }
343}
Note: See TracBrowser for help on using the repository browser.