source: trunk/CrypPlugins/KeySearcher/KeySearcher.cs @ 682

Last change on this file since 682 was 682, checked in by Sven Rech, 12 years ago

KeySearcher is now saveable
new KeySearcher-Sample

File size: 9.5 KB
Line 
1using System;
2using System.Linq;
3using System.Text;
4using Cryptool.PluginBase.Analysis;
5using Cryptool.PluginBase;
6using System.Windows.Controls;
7using System.ComponentModel;
8using Cryptool.PluginBase.Control;
9using System.Collections;
10
11namespace KeySearcher
12{
13    public class KeyPattern
14    {
15        private class Wildcard
16        {
17            private char[] values = new char[256];
18            private int length;
19            private int counter;           
20
21            public Wildcard(string valuePattern)
22            {               
23                counter = 0;
24                length = 0;
25                int i = 1;
26                while (valuePattern[i] != ']')
27                {
28                    if (valuePattern[i + 1] == '-')
29                    {
30                        for (char c = valuePattern[i]; c <= valuePattern[i + 2]; c++)
31                            values[length++] = c;
32                        i += 2;
33                    }
34                    else
35                        values[length++] = valuePattern[i];
36                    i++;
37                }
38            }
39
40            public char getChar()
41            {               
42                return (char)values[counter];
43            }
44
45            public bool succ()
46            {
47                counter++;
48                if (counter >= length)
49                {
50                    counter = 0;
51                    return true;
52                }
53                return false;
54            }
55
56        }
57
58        private string pattern;
59        private string key;       
60        private ArrayList wildcardList;
61
62        public KeyPattern(string pattern)
63        {
64            this.pattern = pattern;
65        }
66
67        public string giveWildcardKey()
68        {
69            string res = "";
70            int i = 0;
71            while (i < pattern.Length)
72            {
73                if (pattern[i] != '[')
74                    res += pattern[i];
75                else
76                {
77                    res += '*';
78                    while (pattern[i] != ']')
79                        i++;
80                }
81                i++;
82            }
83            return res;
84        }
85
86        public bool testKey(string key)
87        {
88            int kcount = 0;
89            int pcount = 0;
90            while (kcount < key.Length && pcount < pattern.Length)
91            {
92                if (pattern[pcount] != '[')
93                {
94                    if (key[kcount] != '*' && pattern[pcount] != key[kcount])
95                        return false;
96                    kcount++;
97                    pcount++;
98                }
99                else
100                {
101                    bool contains = false;
102                    pcount++;
103                    while (pattern[pcount] != ']')
104                    {
105                        if (key[kcount] != '*')
106                        {
107                            if (pattern[pcount + 1] == '-')
108                            {
109                                if (key[kcount] >= pattern[pcount] && key[kcount] <= pattern[pcount + 2])
110                                    contains = true;
111                                pcount += 2;
112                            }
113                            else
114                                if (pattern[pcount] == key[kcount])
115                                    contains = true;
116                        }
117                        pcount++;
118                    }
119                    if (!contains && !(key[kcount] == '*'))
120                        return false;
121                    kcount++;
122                    pcount++;
123                }               
124            }
125            if (pcount != pattern.Length || kcount != key.Length)
126                return false;
127            return true;
128        }
129
130        public void initKeyIteration(string key)
131        {
132            this.key = key;
133            int pcount = 0;
134            wildcardList = new ArrayList();
135            for (int i = 0; i < key.Length; i++)
136            {
137                if (key[i] == '*')
138                    wildcardList.Add(new Wildcard(pattern.Substring(pcount, pattern.IndexOf(']', pcount)+1-pcount)));
139
140                if (pattern[pcount] == '[')
141                    while (pattern[pcount] != ']')
142                        pcount++;
143                pcount++;
144            }
145        }
146
147        public bool nextKey()
148        {
149            int wildcardCount = wildcardList.Count-1;
150            bool overflow = ((Wildcard)wildcardList[wildcardCount]).succ();
151            wildcardCount--;
152            while (overflow && (wildcardCount >= 0))
153                overflow = ((Wildcard)wildcardList[wildcardCount--]).succ();
154            return !overflow;
155        }
156
157        public string getKey()
158        {
159            string res = "";
160            int wildcardCount = 0;
161            for (int i = 0; i < key.Length; i++)
162            {
163                if (key[i] != '*')
164                    res += key[i];
165                else
166                {
167                    Wildcard wc = (Wildcard)wildcardList[wildcardCount++];
168                    res += wc.getChar();
169                }
170            }
171            return res;
172        }
173    }
174   
175    [Author("Thomas Schmid", "thomas.schmid@cryptool.org", "Uni Siegen", "http://www.uni-siegen.de")]
176    //[Author("Sven Rech", "rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
177    [PluginInfo(true, "KeySearcher", "Bruteforces a decryption algorithm.", null, "KeySearcher/Images/icon.png")]
178    public class KeySearcher : IAnalysisMisc
179    {
180        private KeyPattern pattern = null;
181        public KeyPattern Pattern
182        {
183            get
184            {
185                return pattern;
186            }
187            set
188            {
189                pattern = value;
190                if (!pattern.testKey(settings.Key))
191                    settings.Key = pattern.giveWildcardKey();
192            }
193        }
194
195        private bool stop;
196
197        #region IPlugin Members
198
199        public event StatusChangedEventHandler OnPluginStatusChanged;
200
201        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
202
203        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
204
205        private KeySearcherSettings settings;       
206
207        public KeySearcher()
208        {
209            settings = new KeySearcherSettings(this);
210        }
211
212        public ISettings Settings
213        {
214            get { return settings; }
215        }
216
217        public UserControl Presentation
218        {
219            get { return null; }
220        }
221
222        public UserControl QuickWatchPresentation
223        {
224            get { return null; }
225        }
226
227        public void PreExecution()
228        {
229        }
230
231        public void Execute()
232        {
233            if (ControlMaster != null)
234            {
235                stop = false;
236                if (!Pattern.testKey(settings.Key))
237                {
238                    GuiLogMessage("Wrong key pattern!", NotificationLevel.Error);
239                    return;
240                }
241                Pattern.initKeyIteration(settings.Key);
242                string key;
243                do
244                {
245                    key = Pattern.getKey();
246                    GuiLogMessage("Try key " + key, NotificationLevel.Debug);
247                    byte[] decryption = ControlMaster.Decrypt(ControlMaster.getKeyFromString(key));
248                    //TODO: Check cost function here
249                } while (Pattern.nextKey() && !stop);
250            }
251        }
252
253        public void PostExecution()
254        {
255        }
256
257        public void Pause()
258        {
259        }
260
261        public void Stop()
262        {
263            stop = true;
264        }
265
266        public void Initialize()
267        {
268        }
269
270        public void Dispose()
271        {
272        }
273
274        #endregion
275
276        #region INotifyPropertyChanged Members
277
278        public event PropertyChangedEventHandler PropertyChanged;
279
280        public void OnPropertyChanged(string name)
281        {
282            if (PropertyChanged != null)
283            {
284                PropertyChanged(this, new PropertyChangedEventArgs(name));
285            }
286        }
287
288        #endregion
289
290        private void keyPatternChanged()
291        {
292            Pattern = new KeyPattern(controlMaster.getKeyPattern());
293        }
294
295        #region IControlEncryption Members
296
297        private IControlEncryption controlMaster;
298        [PropertyInfo(Direction.ControlMaster, "Control Master", "Used for bruteforcing", "", DisplayLevel.Beginner)]
299        public IControlEncryption ControlMaster
300        {
301            get { return controlMaster; }
302            set
303            {
304                if (controlMaster != null)
305                    controlMaster.keyPatternChanged -= keyPatternChanged;
306                if (value != null)
307                {
308                    Pattern = new KeyPattern(value.getKeyPattern());
309                    value.keyPatternChanged += keyPatternChanged;
310                    controlMaster = value;
311                    OnPropertyChanged("ControlMaster");
312                }
313                else
314                    controlMaster = null;
315            }
316        }
317
318        public void GuiLogMessage(string message, NotificationLevel loglevel)
319        {
320            if (OnGuiLogNotificationOccured != null)
321                OnGuiLogNotificationOccured(this, new GuiLogEventArgs(message, this, loglevel));
322        }
323
324        #endregion
325    }
326}
Note: See TracBrowser for help on using the repository browser.