source: trunk/CrypPlugins/FriedmanTest/FriedmanTest.cs @ 1507

Last change on this file since 1507 was 419, checked in by Thomas Schmid, 12 years ago
  • merged IControl branch to trunk
  • added KeySearcher sample: KeySearcher-Sample
  • changed some plugins to work with new enumeration
  • new bins
File size: 7.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Cryptool.PluginBase;
6using Cryptool.PluginBase.Analysis;
7using System.ComponentModel;
8using System.Collections;
9using Cryptool.PluginBase.Miscellaneous;
10
11namespace FriedmanTest
12{
13    [Author("Georgi Angelov & Danail Vazov", "vazov@cryptool.org", "Uni Duisburg", "http://www.uni-duisburg-essen.de")]
14    [PluginInfo(false,
15            "Friedman Test",
16            "Calculates the probable key lenght of a polyalphabetic substitution cipher.",
17            "FriedmanTest/DetailedDescription/Description.xaml",
18            "FriedmanTest/friedman.png")]
19    public class FriedmanTest : IStatistic
20    {
21        public FriedmanTest()
22        {
23            settings = new FriedmanTestSettings();
24        }
25
26        #region Private Variables
27
28        private FriedmanTestSettings settings;
29        private double keyLength = 0;
30        private double kappaCiphertext = 0;
31        private string stringOutput="";
32        private int [] arrayInput;
33
34        #endregion
35
36        #region Private methods
37
38        private void ShowStatusBarMessage(string message, NotificationLevel logLevel)
39        {
40            EventsHelper.GuiLogMessage(OnGuiLogNotificationOccured, this, new GuiLogEventArgs(message, this, logLevel));
41        }
42
43        private void ShowProgress(double value, double max)
44        {
45            EventsHelper.ProgressChanged(OnPluginProgressChanged, this, new PluginProgressEventArgs(value, max));
46        }
47
48        #endregion
49
50        #region Properties (Inputs/Outputs)
51
52        [PropertyInfo(Direction.OutputData, "Results", "This ouput provides the results of the Friedman test \nas key/value pairs, one per each line.", "", false,false, DisplayLevel.Beginner, QuickWatchFormat.Text,null)]
53        public string StringOutput
54        {
55            get { return this.stringOutput; }
56            set { }
57        }
58
59        [PropertyInfo(Direction.OutputData, "Probable key length value.", "This value gives the probable key length of the analyzed text.", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, "KeyLengthQuickWatchConverter")]
60        public double KeyLength
61        {
62            get { return keyLength; }
63            set { }
64        }
65
66        [PropertyInfo(Direction.OutputData, "Index of coincidence (IC)", "This output provides the calculated index of coincidence of the provided \noccurences of letters (frequency analysis).", "", false, false, DisplayLevel.Expert, QuickWatchFormat.Text, "KappaCiphertextQuickWatchConverter")]
67        public double KappaCiphertext
68        {
69            get { return kappaCiphertext; }
70            set { }
71        }
72
73        [PropertyInfo(Direction.InputData, "Letter count input", "This input accepts a list (array) with the absolute number of letter \noccurences in an encrypted text. This list can be generated e.g. with the frequency test.", "", true, false, DisplayLevel.Beginner, QuickWatchFormat.None, null)]
74        public int [] ArrayInput
75        {
76            get { return arrayInput; }
77            set
78            {
79                arrayInput = value;
80                OnPropertyChanged("ArrayInput");
81            }
82        }
83        #endregion
84
85        #region Input/Output convertor
86
87        public object KappaCiphertextQuickWatchConverter(string PropertyNameToConvert)
88        {
89            return kappaCiphertext.ToString();
90        }
91
92        public object KeyLengthQuickWatchConverter(string PropertyNameToConvert)
93        {
94            return keyLength.ToString();
95        }
96
97        #endregion
98
99        #region IPlugin Members
100
101#pragma warning disable 67
102        public event StatusChangedEventHandler OnPluginStatusChanged;
103#pragma warning restore
104        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
105        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
106
107       
108        public ISettings Settings
109        {
110            get { return settings; }
111            set { settings = (FriedmanTestSettings)value; }
112        }
113
114        public System.Windows.Controls.UserControl Presentation
115        {
116            get { return null; }
117        }
118
119        public System.Windows.Controls.UserControl QuickWatchPresentation
120        {
121            get { return null; }
122        }
123
124        public void PreExecution()
125        {
126            //nothing to do
127        }
128
129        public void Execute()
130        {
131            if (arrayInput != null)
132            {
133                double Kp; //Kappa "language"
134                                long cipherTextLength = 0; //n
135                                long countDoubleCharacters = 0;
136                string ciphermode = "monoalphabetic/cleartext";
137
138                                //Now we set the Kappa plain-text coefficient. Default is English.
139                switch (settings.Kappa)
140                {
141                    case 1: Kp = 0.0762; break;
142                    case 2: Kp = 0.0778; break;
143                    case 3: Kp = 0.0770; break;
144                    case 4: Kp = 0.0738; break;
145                    case 5: Kp = 0.0745; break;
146                    default: Kp = 0.0667; break;
147                }
148
149                ShowStatusBarMessage("Using IC = " + Kp.ToString() + " for analysis...", NotificationLevel.Debug);
150
151
152                if (arrayInput.Length < 2)
153                {
154                    // error, only one letter?
155                    ShowStatusBarMessage("Error - cannot analyze an array of a single letter.", NotificationLevel.Error);
156                    return;
157                }
158
159                                for (int i = 0; i < arrayInput.Length; i++)
160                                {
161                                        cipherTextLength += arrayInput[i];
162                                        countDoubleCharacters += (arrayInput[i] * (arrayInput[i] - 1));
163
164                    // show some progress
165                    ShowProgress(i, (arrayInput.Length + 1));
166                                }
167
168                ShowStatusBarMessage(String.Format("Input analyzed: Got {0} different letters in a text of total length {1}.",arrayInput.Length,cipherTextLength), NotificationLevel.Debug);
169
170                                kappaCiphertext = ((double)countDoubleCharacters / (double)(cipherTextLength * (cipherTextLength - 1)));
171                keyLength = 0.0377 * cipherTextLength / (((cipherTextLength - 1) * kappaCiphertext) - (0.0385 * cipherTextLength) + Kp);
172
173                if (Math.Abs(Kp - kappaCiphertext) > 0.01)
174                {
175                    ciphermode = "polyalphabetic";
176                }
177
178                stringOutput = String.Format("KeyLen = {0}\nIC_analyzed = {1}\nIC_provided = {2}\nMode = {3}", keyLength.ToString("0.00000"), kappaCiphertext.ToString("0.00000"), Kp,ciphermode);
179
180           
181                OnPropertyChanged("StringOutput");
182                OnPropertyChanged("KeyLength");
183                OnPropertyChanged("KappaCiphertext");
184                // final step of progress
185                ShowProgress(100, 100);
186            }
187
188        }
189
190        public void PostExecution()
191        {
192            //throw new NotImplementedException();
193        }
194
195        public void Pause()
196        {
197            //throw new NotImplementedException();
198        }
199
200        public void Stop()
201        {
202            //throw new NotImplementedException();
203        }
204
205        public void Initialize()
206        {
207            //throw new NotImplementedException();
208        }
209
210        public void Dispose()
211        {
212            //throw new NotImplementedException();
213        }
214
215        #endregion
216
217        #region INotifyPropertyChanged Members
218
219        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
220
221        protected void OnPropertyChanged(string name)
222        {
223            if (PropertyChanged != null)
224            {
225                PropertyChanged(this, new PropertyChangedEventArgs(name));
226            }
227        }
228
229        #endregion
230    }
231}
Note: See TracBrowser for help on using the repository browser.