source: trunk/CrypPlugins/MD5Collider/Algorithm/MD5ColliderBase.cs @ 1355

Last change on this file since 1355 was 1355, checked in by pretzsch, 12 years ago

+ MD5Collider: Added multithreaded execution

File size: 3.9 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Windows.Threading;
6using System.Timers;
7
8namespace Cryptool.Plugins.MD5Collider.Algorithm
9{
10    abstract class MD5ColliderBase : IMD5ColliderAlgorithm
11    {
12        public byte[] FirstCollidingData { get; protected set; }
13        public byte[] SecondCollidingData { get; protected set; }
14        public byte[] RandomSeed { protected get; set; }
15        public byte[] IHV { protected get; set; }
16
17        public MD5ColliderBase()
18        {
19            MatchProgressMax = 1;
20            MatchProgress = 0;
21
22            progressUpdateTimer.Interval = 100;
23            progressUpdateTimer.Elapsed += progressUpdateTimer_Tick;
24
25            timer.Interval = 1000;
26            timer.Elapsed += new ElapsedEventHandler(timer_Tick);
27        }
28
29        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
30        private void OnPropertyChanged(string propertyName)
31        {
32            if (PropertyChanged != null)
33                PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
34        }
35
36        private int _matchProgressMax;
37        public int MatchProgressMax
38        {
39            get { return _matchProgressMax; }
40            set { int old = _matchProgressMax; _matchProgressMax = value; }
41        }
42
43        private int _matchProgress;
44        public int MatchProgress
45        {
46            get { return _matchProgress; }
47            set { int old = _matchProgress; _matchProgress = value; }
48        }
49
50        private Timer progressUpdateTimer = new Timer();
51
52        void progressUpdateTimer_Tick(object sender, EventArgs e)
53        {
54            UpdateProgress();
55        }
56
57        abstract protected void PerformFindCollision();
58
59        abstract protected void PerformStop();
60
61        private DateTime startTime;
62
63        private Timer timer = new Timer();
64        private void StartTimer()
65        {
66            startTime = DateTime.Now;
67            ElapsedTime = TimeSpan.Zero;
68
69            timer.Start();
70            progressUpdateTimer.Start();
71        }
72
73        void timer_Tick(object sender, EventArgs e)
74        {
75            ElapsedTime = DateTime.Now - startTime;
76        }
77
78        private void StopTimer()
79        {
80            timer.Stop();
81            progressUpdateTimer.Stop();
82
83            UpdateProgress();
84        }
85
86        private void UpdateProgress()
87        {
88            OnPropertyChanged("MatchProgressMax");
89            OnPropertyChanged("MatchProgress");
90            OnPropertyChanged("CombinationsTried");
91        }
92
93        public void FindCollision()
94        {
95            CombinationsTried = 0;
96
97            CheckRandomSeed();
98            CheckIHV();
99
100            StartTimer();
101            PerformFindCollision();
102            StopTimer();
103        }
104
105        public void LogReturn(int progress)
106        {
107            MatchProgress = progress;
108            CombinationsTried++;
109        }
110
111
112
113        private void CheckIHV()
114        {
115            if (IHV == null || IHV.Length != 16)
116            {
117                IHV = new byte[] { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 };
118            }
119        }
120
121        private void CheckRandomSeed()
122        {
123            if (RandomSeed == null)
124            {
125                RandomSeed = new byte[35];
126                new Random().NextBytes(RandomSeed);
127            }
128        }
129
130        public void Stop()
131        {
132            PerformStop();
133            StopTimer();
134        }
135
136        private TimeSpan _elapsedTime;
137        public TimeSpan ElapsedTime
138        {
139            get { return _elapsedTime; }
140            set { _elapsedTime = value; OnPropertyChanged("ElapsedTime"); }
141        }
142
143        public long CombinationsTried { get; protected set; }
144
145    }
146}
Note: See TracBrowser for help on using the repository browser.