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

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

small KeySearcher fix

File size: 12.0 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;
10using System.Collections.Generic;
11
12namespace KeySearcher
13{
14    public class KeyPattern
15    {
16        private class Wildcard
17        {
18            private char[] values = new char[256];
19            private int length;
20            private int counter;           
21
22            public Wildcard(string valuePattern)
23            {               
24                counter = 0;
25                length = 0;
26                int i = 1;
27                while (valuePattern[i] != ']')
28                {
29                    if (valuePattern[i + 1] == '-')
30                    {
31                        for (char c = valuePattern[i]; c <= valuePattern[i + 2]; c++)
32                            values[length++] = c;
33                        i += 2;
34                    }
35                    else
36                        values[length++] = valuePattern[i];
37                    i++;
38                }
39            }
40
41            public char getChar()
42            {               
43                return (char)values[counter];
44            }
45
46            public bool succ()
47            {
48                counter++;
49                if (counter >= length)
50                {
51                    counter = 0;
52                    return true;
53                }
54                return false;
55            }
56
57        }
58
59        private string pattern;
60        private string key;       
61        private ArrayList wildcardList;
62
63        public KeyPattern(string pattern)
64        {
65            this.pattern = pattern;
66        }
67
68        public string giveWildcardKey()
69        {
70            string res = "";
71            int i = 0;
72            while (i < pattern.Length)
73            {
74                if (pattern[i] != '[')
75                    res += pattern[i];
76                else
77                {
78                    res += '*';
79                    while (pattern[i] != ']')
80                        i++;
81                }
82                i++;
83            }
84            return res;
85        }
86
87        public bool testKey(string key)
88        {
89            int kcount = 0;
90            int pcount = 0;
91            while (kcount < key.Length && pcount < pattern.Length)
92            {
93                if (pattern[pcount] != '[')
94                {
95                    if (key[kcount] != '*' && pattern[pcount] != key[kcount])
96                        return false;
97                    kcount++;
98                    pcount++;
99                }
100                else
101                {
102                    bool contains = false;
103                    pcount++;
104                    while (pattern[pcount] != ']')
105                    {
106                        if (key[kcount] != '*')
107                        {
108                            if (pattern[pcount + 1] == '-')
109                            {
110                                if (key[kcount] >= pattern[pcount] && key[kcount] <= pattern[pcount + 2])
111                                    contains = true;
112                                pcount += 2;
113                            }
114                            else
115                                if (pattern[pcount] == key[kcount])
116                                    contains = true;
117                        }
118                        pcount++;
119                    }
120                    if (!contains && !(key[kcount] == '*'))
121                        return false;
122                    kcount++;
123                    pcount++;
124                }               
125            }
126            if (pcount != pattern.Length || kcount != key.Length)
127                return false;
128            return true;
129        }
130
131        public void initKeyIteration(string key)
132        {
133            this.key = key;
134            int pcount = 0;
135            wildcardList = new ArrayList();
136            for (int i = 0; i < key.Length; i++)
137            {
138                if (key[i] == '*')
139                    wildcardList.Add(new Wildcard(pattern.Substring(pcount, pattern.IndexOf(']', pcount)+1-pcount)));
140
141                if (pattern[pcount] == '[')
142                    while (pattern[pcount] != ']')
143                        pcount++;
144                pcount++;
145            }
146        }
147
148        public bool nextKey()
149        {
150            int wildcardCount = wildcardList.Count-1;
151            bool overflow = ((Wildcard)wildcardList[wildcardCount]).succ();
152            wildcardCount--;
153            while (overflow && (wildcardCount >= 0))
154                overflow = ((Wildcard)wildcardList[wildcardCount--]).succ();
155            return !overflow;
156        }
157
158        public string getKey()
159        {
160            string res = "";
161            int wildcardCount = 0;
162            for (int i = 0; i < key.Length; i++)
163            {
164                if (key[i] != '*')
165                    res += key[i];
166                else
167                {
168                    Wildcard wc = (Wildcard)wildcardList[wildcardCount++];
169                    res += wc.getChar();
170                }
171            }
172            return res;
173        }
174    }
175   
176    [Author("Thomas Schmid", "thomas.schmid@cryptool.org", "Uni Siegen", "http://www.uni-siegen.de")]
177    //[Author("Sven Rech", "rech@cryptool.org", "Uni Duisburg-Essen", "http://www.uni-due.de")]
178    [PluginInfo(true, "KeySearcher", "Bruteforces a decryption algorithm.", null, "KeySearcher/Images/icon.png")]
179    public class KeySearcher : IAnalysisMisc
180    {
181        private KeyPattern pattern = null;
182        public KeyPattern Pattern
183        {
184            get
185            {
186                return pattern;
187            }
188            set
189            {
190                pattern = value;
191                if ((settings.Key == null) ||((settings.Key != null) && !pattern.testKey(settings.Key)))
192                    settings.Key = pattern.giveWildcardKey();
193            }
194        }
195
196        private bool stop;
197
198        #region IPlugin Members
199
200        public event StatusChangedEventHandler OnPluginStatusChanged;
201
202        public event GuiLogNotificationEventHandler OnGuiLogNotificationOccured;
203
204        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
205
206        private KeySearcherSettings settings;       
207
208        public KeySearcher()
209        {
210            settings = new KeySearcherSettings(this);
211        }
212
213        public ISettings Settings
214        {
215            get { return settings; }
216        }
217
218        public UserControl Presentation
219        {
220            get { return null; }
221        }
222
223        public UserControl QuickWatchPresentation
224        {
225            get { return null; }
226        }
227
228        public void PreExecution()
229        {
230        }
231
232        public void Execute()
233        {           
234            if (ControlMaster != null && costMaster != null)
235            {
236                int maxInList = 10;
237               
238                LinkedList<ValueKey> costList = new LinkedList<ValueKey>();
239               
240                stop = false;
241                if (!Pattern.testKey(settings.Key))
242                {
243                    GuiLogMessage("Wrong key pattern!", NotificationLevel.Error);
244                    return;
245                }
246                Pattern.initKeyIteration(settings.Key);
247                string key;
248                do
249                {
250                    key = Pattern.getKey();
251                    GuiLogMessage("Try key " + key, NotificationLevel.Debug);
252                    byte[] decryption = ControlMaster.Decrypt(ControlMaster.getKeyFromString(key));
253                   
254                    ValueKey valueKey = new ValueKey();
255                    valueKey.value = CostMaster.calculateCost(decryption);;
256                    valueKey.key = key;
257
258                    if(this.costMaster.getRelationOperator() == RelationOperator.LargerThen){
259
260                        LinkedListNode<ValueKey> node = costList.First;
261
262                        while (node != null)
263                        {
264
265                            if (valueKey.value > node.Value.value)
266                            {
267                                costList.AddBefore(node, valueKey);
268                                break;
269                            }
270                            node = node.Next;
271                        }     
272                    }else{
273                        LinkedListNode<ValueKey> node = costList.First;
274
275                        while (node != null)
276                        {
277
278                            if (valueKey.value < node.Value.value)
279                            {
280                                costList.AddBefore(node, valueKey);
281                                break;
282                            }
283                            node = node.Next;
284                        }                       
285                    }
286                    if (costList.Count > maxInList)
287                    {
288                        costList.RemoveLast();
289                    }
290                } while (Pattern.nextKey() && !stop);
291
292                GuiLogMessage("Calculated value/key - list:", NotificationLevel.Info);
293                LinkedListNode<ValueKey> n = costList.First;
294                while (n != null)
295                {
296                    GuiLogMessage(n.Value.value + " = " + n.Value.key, NotificationLevel.Info);
297                    n = n.Next;
298                }
299               
300            }//end if
301        }
302
303        public void PostExecution()
304        {
305        }
306
307        public void Pause()
308        {
309        }
310
311        public void Stop()
312        {
313            stop = true;
314        }
315
316        public void Initialize()
317        {
318        }
319
320        public void Dispose()
321        {
322        }
323
324        #endregion
325
326        #region INotifyPropertyChanged Members
327
328        public event PropertyChangedEventHandler PropertyChanged;
329
330        public void OnPropertyChanged(string name)
331        {
332            if (PropertyChanged != null)
333            {
334                PropertyChanged(this, new PropertyChangedEventArgs(name));
335            }
336        }
337
338        #endregion
339
340        private void keyPatternChanged()
341        {
342            Pattern = new KeyPattern(controlMaster.getKeyPattern());
343        }
344
345        #region IControlEncryption Members
346
347        private IControlEncryption controlMaster;
348        [PropertyInfo(Direction.ControlMaster, "Control Master", "Used for bruteforcing", "", DisplayLevel.Beginner)]
349        public IControlEncryption ControlMaster
350        {
351            get { return controlMaster; }
352            set
353            {
354                if (controlMaster != null)
355                    controlMaster.keyPatternChanged -= keyPatternChanged;
356                if (value != null)
357                {
358                    Pattern = new KeyPattern(value.getKeyPattern());
359                    value.keyPatternChanged += keyPatternChanged;
360                    controlMaster = value;
361                    OnPropertyChanged("ControlMaster");
362                }
363                else
364                    controlMaster = null;
365            }
366        }
367
368        #endregion
369
370        #region IControlCost Members
371
372        private IControlCost costMaster;
373        [PropertyInfo(Direction.ControlMaster, "Cost Master", "Used for cost calculation", "", DisplayLevel.Beginner)]
374        public IControlCost CostMaster
375        {
376            get { return costMaster; }
377            set
378            {
379                costMaster = value;
380            }
381        }
382
383        #endregion
384
385        public void GuiLogMessage(string message, NotificationLevel loglevel)
386        {
387            if (OnGuiLogNotificationOccured != null)
388                OnGuiLogNotificationOccured(this, new GuiLogEventArgs(message, this, loglevel));
389        }
390
391        private struct ValueKey
392        {
393            public double value;
394            public String key;
395        };
396    }
397}
Note: See TracBrowser for help on using the repository browser.