source: trunk/CrypPlugins/KeySearcher/KeyTranslators/ByteArrayKeyTranslator.cs @ 2010

Last change on this file since 2010 was 2010, checked in by Sven Rech, 11 years ago

new key finding algorithm for KeySearcher

This update is really huge.

File size: 5.8 KB
Line 
1/*                             
2   Copyright 2010 Sven Rech (svenrech at googlemail dot com), Uni Duisburg-Essen
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*/
16
17using System;
18using System.Collections.Generic;
19using System.Linq;
20using System.Text;
21using Cryptool.PluginBase.Control;
22using KeySearcher.KeyPattern;
23
24namespace KeySearcher.KeyTranslators
25{
26    /// <summary>
27    /// Implements a simple translator for bytearray keys that are represented by the pattern "[0-9A-F][0-9A-F]-[0-9A-F][0-9A-F]-...".
28    /// Is used by AES and DES.
29    /// </summary>
30    public class ByteArrayKeyTranslator : KeyTranslator
31    {
32        private int progress = 0;
33        private KeyPattern.KeyPattern pattern;
34        private int[] movementStatus;
35        private byte[] keya;
36        private int[] movementPointers;
37        private KeyMovement[] keyMovements;
38
39        #region KeyTranslator Members
40
41        public void SetKeys(object keys)
42        {
43            if (!(keys is KeyPattern.KeyPattern))
44                throw new Exception("Something went horribly wrong!");
45
46            pattern = (KeyPattern.KeyPattern)keys;
47
48            keyMovements = pattern.getKeyMovements();
49            movementStatus = pattern.getWildcardProgress();
50            if (movementStatus.Length != keyMovements.Length)
51                throw new Exception("Movements and Wildcards do not fit together!");
52           
53            movementPointers = new int[movementStatus.Length];
54            int mpc = 0;
55
56            byte[] keya2 = new byte[256];
57            int kc = 0;
58            string wildcardKey = pattern.WildcardKey;
59            int i = 0;
60
61            bool first = true;
62
63            while (i < wildcardKey.Length)
64            {
65                if (wildcardKey[i] == '[')
66                {
67                    i++;
68                    while (wildcardKey[i++] != ']') ;
69                    i--;
70
71                    movementPointers[mpc++] = kc++;
72
73                    first = false;
74                }
75                else if (wildcardKey[i] == '-')
76                {
77                    first = true;
78                }
79                else
80                {
81                    byte val = Convert.ToByte(""+wildcardKey[i], 16);
82                    if (first)
83                        keya2[kc/2] = (byte)((int)val << 4);
84                    else
85                        keya2[kc/2] |= val;
86
87                    kc++;
88
89                    first = false;
90                }
91
92                i++;
93            }
94
95            keya = new byte[kc/2];
96            for (int c = 0; c < (kc/2); c++)
97                keya[c] = keya2[c];
98
99            for (int x = 0; x < movementStatus.Length - 1; x++)
100                setWildcard(x);
101        }
102
103        public byte[] GetKey()
104        {
105            return keya;
106        }
107
108        public bool NextKey()
109        {
110            int i = movementStatus.Length - 1;
111
112            movementStatus[i]++;
113           
114            while (i >= 0 && !wildcardInRange(i))
115            {               
116                movementStatus[i] = 0;
117                setWildcard(i);
118
119                i--;
120                if (i >= 0)
121                    movementStatus[i]++;         
122            }
123
124            if (i >= 0)
125                setWildcard(i);
126
127            progress++;
128
129            return i >= 0;
130        }
131
132        public string GetKeyRepresentation()
133        {
134            return pattern.getKey(progress);
135        }
136
137        /// <summary>
138        /// Sets wildcard i in keya to the current progress
139        /// </summary>
140        /// <param name="i">the wildcard index</param>
141        private void setWildcard(int i)
142        {
143            int index = movementPointers[i] / 2;
144            byte mask;
145            byte shift;
146            if (movementPointers[i] % 2 == 0)
147            {
148                mask = 1+2+4+8;
149                shift = 4;
150            }
151            else
152            {
153                mask = 16+32+64+128;
154                shift = 0;
155            }
156
157            keya[index] = (byte)((keya[index] & mask) | (calcWildcard(i) << shift));
158        }
159
160        private int calcWildcard(int i)
161        {
162            KeyMovement mov = keyMovements[i];
163            if (mov is LinearKeyMovement)
164            {
165                return movementStatus[i] * (mov as LinearKeyMovement).A + (mov as LinearKeyMovement).B;
166            }
167            else if (mov is IntervalKeyMovement)
168            {
169                return (mov as IntervalKeyMovement).IntervalList[movementStatus[i]];
170            }
171
172            throw new Exception("Movement not implemented!");
173        }
174
175        private bool wildcardInRange(int i)
176        {
177            KeyMovement mov = keyMovements[i];
178            if (mov is LinearKeyMovement)
179            {
180                return movementStatus[i] < (mov as LinearKeyMovement).UpperBound;
181            }
182            else if (mov is IntervalKeyMovement)
183            {
184                return movementStatus[i] < (mov as IntervalKeyMovement).IntervalList.Count;
185            }
186
187            return false;           
188        }
189
190        public int GetProgress()
191        {
192            int result = progress;
193            pattern.addKey(progress);
194
195            progress = 0;
196            return result;
197        }
198
199        #endregion
200
201    }
202}
Note: See TracBrowser for help on using the repository browser.