Ignore:
Timestamp:
Jun 14, 2010, 1:23:24 PM (11 years ago)
Author:
Paul Lelgemann
Message:

o Fixed KeySearcher progress display
+ Work on the distributed KeySearcher part

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/KeySearcher/KeySearcher.cs

    r1456 r1634  
    22using System.Linq;
    33using System.Text;
     4using Cryptool.P2P;
    45using Cryptool.PluginBase.Analysis;
    56using Cryptool.PluginBase;
     
    1516using Cryptool.PluginBase.IO;
    1617using System.Numerics;
     18using KeySearcher.Helper;
     19using KeySearcher.P2P;
    1720
    1821namespace KeySearcher
     
    3336        private Mutex maxThreadMutex = new Mutex();
    3437
     38        private KeyQualityHelper _keyQualityHelper;
     39
    3540        private KeyPattern pattern = null;
    3641        public KeyPattern Pattern
     
    4853        }
    4954
    50         private bool stop;
     55        internal bool stop;
    5156
    5257        #region IControlEncryption + IControlCost + InputFields
     
    9095            {
    9196                costMaster = value;
     97                _keyQualityHelper = new KeyQualityHelper(costMaster);
    9298            }
    9399        }
     
    199205
    200206        private KeySearcherSettings settings;
     207        private AutoResetEvent _connectResetEvent;
    201208
    202209        public KeySearcher()
     
    204211            settings = new KeySearcherSettings(this);
    205212            QuickWatchPresentation = new KeySearcherQuickWatchPresentation();
    206            
    207213        }
    208214
     
    231237        {
    232238            //either byte[] CStream input or CryptoolStream Object input
    233             if (this.encryptedData != null || this.csEncryptedData != null) //to prevent execution on initialization
    234             {
    235                 if (this.ControlMaster != null)
    236                     this.process(this.ControlMaster);
     239            if (encryptedData != null || csEncryptedData != null) //to prevent execution on initialization
     240            {
     241                if (ControlMaster != null)
     242                    process(ControlMaster);
    237243                else
    238244                {
     
    533539            }
    534540            Pattern.WildcardKey = settings.Key;
    535             bruteforcePattern(Pattern, sender);
    536         }
     541            this.sender = sender;
     542
     543            bruteforcePattern(Pattern);
     544        }
     545
     546        internal LinkedList<ValueKey> costList = new LinkedList<ValueKey>();
     547        private int bytesToUse;
     548        private IControlEncryption sender;
     549        private DateTime beginBruteforcing;
    537550
    538551        // modified by Christian Arnold 2009.12.07 - return type LinkedList (top10List)
    539552        // main entry point to the KeySearcher
    540         private LinkedList<ValueKey> bruteforcePattern(KeyPattern pattern, IControlEncryption sender)
     553        private LinkedList<ValueKey> bruteforcePattern(KeyPattern pattern)
    541554        {
    542555            //For evaluation issues - added by Arnold 2010.03.17
    543             DateTime beginBruteforcing = DateTime.Now;
     556            beginBruteforcing = DateTime.Now;
    544557            GuiLogMessage("Start bruteforcing pattern '" + pattern.getKey() + "'", NotificationLevel.Debug);
    545558
     
    547560                       
    548561            int maxInList = 10;
    549             LinkedList<ValueKey> costList = new LinkedList<ValueKey>();
     562            costList = new LinkedList<ValueKey>();
    550563            fillListWithDummies(maxInList, costList);
     564            valuequeue = Queue.Synchronized(new Queue());
    551565
    552566            stop = false;
     
    557571            }
    558572
    559             int bytesToUse = 0;
     573            bytesToUse = 0;
    560574
    561575            try
     
    569583            }
    570584
     585            if (settings.UsePeerToPeer)
     586            {
     587                BruteForceWithPeerToPeerSystem();
     588                return null;
     589            }
     590
     591            return BruteForceWithLocalSystem(pattern);
     592        }
     593
     594        private Dispatcher _dispatcher;
     595
     596        private void BruteForceWithPeerToPeerSystem()
     597        {
     598            _dispatcher = Dispatcher.CurrentDispatcher;
     599            GuiLogMessage("Launching p2p based bruteforce logic...", NotificationLevel.Info);
     600            ValidateConnectionToPeerToPeerSystem();
     601            new P2PBruteForce(this, pattern, settings, _keyQualityHelper);
     602        }
     603
     604
     605        #region P2P connection validation
     606
     607        private void ValidateConnectionToPeerToPeerSystem()
     608        {
     609            if (P2PManager.IsConnected)
     610            {
     611                return;
     612            }
     613
     614            if(settings.AutoconnectPeerToPeer)
     615            {
     616                HandleAutoconnect();
     617            } else
     618            {
     619                GuiLogMessage("P2P network not connected and autoconnect disabled. Cannot compute job.",
     620                              NotificationLevel.Error);
     621            }
     622        }
     623
     624        private void HandleAutoconnect()
     625        {
     626            P2PManager.ConnectionManager.OnP2PConnectionStateChangeOccurred += HandleConnectionStateChange;
     627            _connectResetEvent = new AutoResetEvent(false);
     628
     629            P2PManager.Connect();
     630
     631            _connectResetEvent.WaitOne();
     632
     633            if (P2PManager.IsConnected)
     634            {
     635                GuiLogMessage("P2P network was connected due to plugin setting.",
     636                              NotificationLevel.Info);
     637            }
     638            else
     639            {
     640                GuiLogMessage("P2P network could not be connected.",
     641                              NotificationLevel.Error);
     642                throw new ApplicationException("Workaround for wrong error handling... Workspace should be stopped now.");
     643            }
     644        }
     645
     646        void HandleConnectionStateChange(object sender, bool newState)
     647        {
     648            _connectResetEvent.Set();
     649        }
     650
     651        #endregion
     652
     653        internal LinkedList<ValueKey> BruteForceWithLocalSystem(KeyPattern pattern)
     654        {
    571655            BigInteger size = pattern.size();
    572656            KeyPattern[] patterns = splitPatternForThreads(pattern);
    573 
    574             valuequeue = Queue.Synchronized(new Queue());
    575657
    576658            BigInteger[] doneKeysA = new BigInteger[patterns.Length];
     
    585667                Thread.Sleep(1000);
    586668
    587                 updateToplist(costList);
     669                updateToplist();
    588670
    589671                #region calculate global counters from local counters
     
    670752        }
    671753
    672         private void showProgress(LinkedList<ValueKey> costList, BigInteger size, BigInteger keycounter, BigInteger doneKeys)
     754        internal void showProgress(LinkedList<ValueKey> costList, BigInteger size, BigInteger keycounter, BigInteger doneKeys)
    673755        {
    674756            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    675757
    676758            LinkedListNode<ValueKey> linkedListNode;
    677             ProgressChanged((double)(keycounter/size), 1.0);
     759            ProgressChanged((double)keycounter / (double) size, 1.0);
    678760
    679761            if (QuickWatchPresentation.IsVisible && doneKeys != 0 && !stop)
     
    791873        }
    792874
    793         private void updateToplist(LinkedList<ValueKey> costList)
     875        internal void IntegrateNewResults(LinkedList<ValueKey> costList)
     876        {
     877            foreach (var valueKey in costList)
     878            {
     879                if (_keyQualityHelper.IsBetter(valueKey.value, value_threshold))
     880                {
     881                    valuequeue.Enqueue(valueKey);
     882                }
     883            }
     884
     885            updateToplist();
     886            UpdateWithShowProgress();
     887        }
     888
     889        internal void updateToplist()
    794890        {
    795891            LinkedListNode<ValueKey> node;
     
    797893            {
    798894                ValueKey vk = (ValueKey)valuequeue.Dequeue();
     895
     896                //if (costList.Contains(vk)) continue;
     897                var result = costList.Where(valueKey => valueKey.key == vk.key);
     898                if (result.Count() > 0)
     899                {
     900                    continue;
     901                }
     902
    799903                if (this.costMaster.getRelationOperator() == RelationOperator.LargerThen)
    800904                {
     
    838942                }
    839943            }
     944        }
     945
     946        private void UpdateWithShowProgress()
     947        {
     948            showProgress(costList, 1, 0, 0);
    840949        }
    841950
     
    9191028            this.initVector = initVector;
    9201029            /* End: New stuff because of changing the IControl data flow - Arnie 2010.01.18 */
    921            
    922             LinkedList<ValueKey> lstRet = bruteforcePattern(pattern, encryptControl);
     1030
     1031            this.sender = encryptControl;
     1032            LinkedList<ValueKey> lstRet = bruteforcePattern(pattern);
    9231033            if(OnBruteforcingEnded != null)
    9241034                OnBruteforcingEnded(lstRet);
Note: See TracChangeset for help on using the changeset viewer.