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

Last change on this file since 1699 was 1699, checked in by nolte, 12 years ago

Exchanged the scale-event through a Viewbox (thx Paul)...now scaling the presentations gets a lot easier!!!

File size: 11.3 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            ProgressChanged(0, 1);
126
127            cipher = InputCipher;                               //initialising the ciphertext
128            cipher = prepareForAnalyse(cipher);                 //and prepare it for the analyse (-> see private methods section)
129
130            ak = new double[cipher.Length];                     //initialise ak[]...there are n possible shifts where n is cipher.length
131
132            presentation.histogram.SetBackground(Brushes.Beige);              //sets the background colour for the quickwatch
133            presentation.histogram.SetHeadline("Autocorrelation matches");    //sets its title
134
135//-----------------------------------------------------------------------------------------------------------------
136//Analyse----------------------------------------------------------------------------------------------------------
137//-----------------------------------------------------------------------------------------------------------------             
138
139            //for each possible shift value...
140                    for(int t=0; t<cipher.Length; t++)
141                    {
142                            same=0;
143                       
144                //...calculate how often the letters match...
145                            for(int x=0; x<cipher.Length-t;x++)
146                            {
147                                    if(cipher[x] == cipher[x+t])
148                                    {
149                                            same++;
150                                    }
151                            }
152
153                try
154                {
155                    //...and save the count for the matches at the shift position
156                    ak[t] = same;
157                }
158                catch
159                {
160                }
161                    }
162
163            data.ValueCollection.Clear();
164
165            //for all observed shifts...
166                    for(int y=1;y<ak.Length;y++)
167                    {             
168                //find the one with the highest match count...
169                            if(ak[y] > probablekorr)
170                            {
171                                    probablekorr = ak[y];
172                    probablelength = y;                 //...and remember this shift value
173                            }
174                    }
175
176            //find the top 13 matches...
177            if (ak.Length > 11)
178            {
179                ak = findTopThirteen(ak);
180            }
181
182            for (int y = 1; y < ak.Length; y++)
183            {
184                if (ak[y] > -1)                         //Adds a bar into the presentation if it is higher then the average matches
185                {
186                    bar = new HistogramElement(ak[y], ak[y], "" + y);
187                    data.ValueCollection.Add(bar);
188                }
189            }
190
191            presentation.histogram.SetHeadline("Highest match count " + probablekorr + " with shift: " + probablelength);
192
193            if(data != null)
194            {
195                presentation.histogram.ShowData(data);
196            }
197
198            OutputLength = probablelength;              //sending the keylength via output
199            OnPropertyChanged("OutputLength");         
200                   
201
202
203            ProgressChanged(1, 1);
204
205//EXECUTE END------------------------------------------------------------------------------------------------------
206       
207        }
208
209        public void PostExecution()
210        {
211        }
212
213        public void Pause()
214        {
215        }
216
217        public void Stop()
218        {
219            presentation.histogram.SetBackground(Brushes.LightGray);
220        }
221
222        public void Initialize()
223        {
224        }
225
226        public void Dispose()
227        {
228        }
229
230        #endregion
231
232        #region Private Methods
233
234//PREPARE PART---------------------------------------------------------------------------------------------------------------------------
235
236        /// <summary>
237        /// Remove spaces and symbols not provided by the alphabet from the text
238        /// </summary>
239        private String prepareForAnalyse(String c)
240        {
241            String prepared = "";
242
243            c = c.ToUpper();
244
245            for (int x = 0; x < c.Length; x++)
246            {
247                if (getPos(c[x]) != -1)
248                {
249                    prepared = prepared + c[x];
250                }
251            }
252            return prepared;
253        }
254
255
256//---------------------------------------------------------------------------------------------------------------------------------------
257//LETTER TO NUMBER----------------------------------------------------------------------------------------------------------------------
258
259        /// <summary>
260        /// Convert a the letter to an int-value that resembles his position in the given alphabet
261        /// </summary>
262        private int getPos(char c)
263        {
264            int pos = -1;
265            for (int i = 0; i < alphabet.Length; i++)
266            {
267                if (alphabet[i] == c)
268                {
269                    pos = i;
270                }
271            }
272            return pos;
273        }
274
275
276//---------------------------------------------------------------------------------------------------------------------------------------
277//FIND TOP 13----------------------------------------------------------------------------------------------------------------------------
278
279        /// <summary>
280        /// Thirteen possible shift values with the highest match count are enough information
281        /// </summary>
282        private double[] findTopThirteen(double[] ak)
283        {
284            double[] top = ak;
285            int thrownaway = 0;
286
287            for(int match=0; match < probablekorr; match++)
288            {
289                for(int x=0;x<ak.Length;x++)
290                {
291                    if(top[x] == match)
292                    {
293                        top[x] = -1;
294                        thrownaway++;
295                    }
296                    if(thrownaway == (ak.Length)-13)
297                    {
298                        return top;
299                    }
300
301                }
302            }
303            return top;
304        }
305
306
307
308
309
310//---------------------------------------------------------------------------------------------------------------------------------------
311
312        #endregion
313
314        #region Event Handling
315
316        public event StatusChangedEventHandler OnPluginStatusChanged;
317
318        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
319
320        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
321
322        public event PropertyChangedEventHandler PropertyChanged;
323
324        private void GuiLogMessage(string message, NotificationLevel logLevel)
325        {
326            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
327        }
328
329        private void OnPropertyChanged(string name)
330        {
331            EventsHelper.PropertyChanged(PropertyChanged, this, new PropertyChangedEventArgs(name));
332        }
333
334        private void ProgressChanged(double value, double max)
335        {
336            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
337        }
338
339        #endregion
340    }
341}
Note: See TracBrowser for help on using the repository browser.