source: trunk/CrypPlugins/MonoalphabeticAnalysis/MonoalphabeticAnalysis.cs @ 325

Last change on this file since 325 was 325, checked in by angelov, 13 years ago

Added MonoalphabeticAnalysis plug-in
Has working initial proposition for key alphabet.

File size: 7.5 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.IO;
6using Cryptool.PluginBase;
7using Cryptool.PluginBase.Analysis;
8using System.ComponentModel;
9using System.Windows.Controls;
10using System.Windows.Documents;
11using System.Windows.Markup;
12using Cryptool.PluginBase.IO;
13using System.Collections.ObjectModel;
14using Cryptool.MonoalphabeticAnalysis;
15using System.Collections;
16using System.Threading;
17using System.Windows;
18using System.Windows.Threading;
19using System.Runtime.CompilerServices;
20using Cryptool.PluginBase.Miscellaneous;
21
22using System.Runtime.Remoting.Contexts;
23
24
25namespace Cryptool.MonoalphabeticAnalysis
26{
27    [Author("Georgi Angelov", "angelov@cryptool.org", "Uni Duisburg", "http://www.uni-duisburg-essen.de")]
28    [PluginInfo(false,
29    "MonoalphabeticAnalysis",
30    "Proposes Alphabet for the substitution cypher.",
31    "",
32    "MonoalphabeticAnalysis/icon.png")]
33
34
35
36    public partial class MonoalphabeticAnalysis : IStatistic
37    {
38        private string stringOutput = "";
39        private string statisticTextInput;
40        private string letterFrequencyInput;
41       
42       
43       // private int[] arrayOutput;
44
45        // public static DataSource Data = new DataSource();
46
47
48
49        #region Properties (Inputs/Outputs)
50
51        [PropertyInfo(Direction.Input, "Statistic text used for analysis", "Statistic Text Input", "", true, true, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
52        public string StatisticTextInput
53        {
54            get
55            {
56                return statisticTextInput;
57            }
58            set { statisticTextInput = value; OnPropertyChanged("StatisticTextInput"); }
59        }
60
61
62
63        [PropertyInfo(Direction.Input, "Letter Frequency From FrequencyTest Plug-in", "Letter Frequency Input", "", true, true, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
64        public string LetterFrequencyInput
65        {
66            get
67            {
68                return letterFrequencyInput;
69            }
70            set { letterFrequencyInput = value; OnPropertyChanged("LetterFrequencyInput"); }
71        }
72
73
74        [PropertyInfo(Direction.Output, "String output", "Proposal Alphabets", "", false, false, DisplayLevel.Beginner, QuickWatchFormat.Text, null)]
75        public string StringOutput
76        {
77            get { return stringOutput; }
78            set
79            {
80                StringOutput = value;
81                OnPropertyChanged("StringOutput");
82
83            }
84        }
85        #endregion
86
87
88        #region IPlugin Members
89
90        public event StatusChangedEventHandler OnPluginStatusChanged;
91
92        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
93
94        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
95
96        private MonoalphabeticAnalysisSettings settings;
97        public ISettings Settings
98        {
99            get { return settings; }
100            set { settings = (MonoalphabeticAnalysisSettings)value; }
101        }
102        // private FrequencyTestPresentation presentation;
103        public MonoalphabeticAnalysis()
104        {
105            settings = new MonoalphabeticAnalysisSettings();
106            // presentation = new FrequencyTestPresentation(this);
107            // Presentation = presentation;
108            //  QuickWatchPresentation = presentation;
109        }
110        public UserControl Presentation { get; private set; }
111
112
113        public UserControl QuickWatchPresentation { get; private set; }
114
115        public void PreExecution()
116        {
117            //throw new NotImplementedException();
118        }
119
120        public void Execute()
121        {
122            if (letterFrequencyInput != null)
123            {
124
125
126                string alphabet = "";
127               
128                ArrayList mapping1 = InitialMapping(LetterFrequencyInput, statisticTextInput);
129
130                for (int i = 0; i < mapping1.Count; i++)
131                {
132                    CollectionElement a1 = (CollectionElement)mapping1[i];
133                    alphabet += a1.Mapping;
134                }
135
136                alphabet=alphabet.ToUpper();
137
138               stringOutput = alphabet;
139
140                             
141
142            }
143
144
145        }
146
147
148
149        public void PostExecution()
150        {
151            //throw new NotImplementedException();
152        }
153
154        public void Pause()
155        {
156            //throw new NotImplementedException();
157        }
158
159        public void Stop()
160        {
161            //throw new NotImplementedException();
162        }
163
164        public void Initialize()
165        {
166            //throw new NotImplementedException();
167        }
168
169        public void Dispose()
170        {
171            //throw new NotImplementedException();
172        }
173
174
175        #endregion
176
177        #region INotifyPropertyChanged Members
178
179        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
180
181        protected void OnPropertyChanged(string name)
182        {
183            if (PropertyChanged != null)
184            {
185                PropertyChanged(this, new PropertyChangedEventArgs(name));
186            }
187        }
188
189        #endregion
190
191
192        #region CUSTOM METHODS
193
194        public ArrayList ReturnSortedList(string str,SortElements.SortElemetsBy sort_type)        // The Method returns a sorted list from the FrequenscyTest string output.
195        {
196           
197            str = str.Replace(Environment.NewLine, ":");
198
199            char[] splitter = { ':' };
200
201           
202            string[] splitfrequencies = str.Split(splitter);
203            // splitfrequencies.
204
205            ArrayList sortingfrequencyList = new ArrayList();
206
207                       
208                for (int i = 0; i < splitfrequencies.Length - 1; i = i + 3)
209                {
210                    CollectionElement row = new CollectionElement(splitfrequencies[i], System.Convert.ToDouble(splitfrequencies[i + 2]),"");
211                    sortingfrequencyList.Add(row);
212                }
213             
214                                 
215
216            SortElements mySortingType = new SortElements(sort_type);
217            sortingfrequencyList.Sort(mySortingType);
218
219            return sortingfrequencyList;
220        }
221
222
223        ArrayList InitialMapping(string cyString, string statString)
224        {
225
226            ArrayList cypherTextFrequencies = ReturnSortedList(cyString, SortElements.SortElemetsBy.byFrequency);
227            ArrayList shogunFrequencies = ReturnSortedList(statString, SortElements.SortElemetsBy.byFrequency);
228
229            ArrayList mappings = new ArrayList();
230
231            if (cypherTextFrequencies.Count == shogunFrequencies.Count)
232            {
233                for (int i = 0; i < cypherTextFrequencies.Count ; i++)
234                {
235                    CollectionElement a1 = (CollectionElement)cypherTextFrequencies[i];
236                    CollectionElement a2 = (CollectionElement)shogunFrequencies[i];
237                    double frequencyDifference = Math.Abs(a1.Frequency - a2.Frequency);
238                    CollectionElement row = new CollectionElement(a1.Caption, frequencyDifference, a2.Caption);
239                    mappings.Add(row);
240
241                }
242
243
244            }
245            SortElements mySortingType = new SortElements(SortElements.SortElemetsBy.byString);
246            mappings.Sort(mySortingType);
247
248            return mappings;
249        }
250       
251        #endregion CUSTOM METHODS
252
253    }
254
255       
256
257
258
259
260   
261
262   
263}
264
265
266
267
268
269
270
271
272
273
Note: See TracBrowser for help on using the repository browser.