Ignore:
Timestamp:
Nov 3, 2009, 2:18:58 PM (12 years ago)
Author:
Sven Rech
Message:

added dual core support for keysearcher (not perfect yet)

File:
1 edited

Legend:

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

    r793 r819  
    2323           
    2424            public Wildcard(string valuePattern)
    25             {               
     25            {
    2626                counter = 0;
    2727                length = 0;
     
    4141            }
    4242
     43            public Wildcard(Wildcard wc)
     44            {
     45                length = wc.length;
     46                counter = 0;
     47                for (int i = 0; i < 256; i++)
     48                    values[i] = wc.values[i];
     49            }
     50
     51            private Wildcard()
     52            {
     53            }
     54
     55            public Wildcard[] split()
     56            {
     57                Wildcard[] wcs = new Wildcard[2];
     58                wcs[0] = new Wildcard();
     59                wcs[0].counter = 0;
     60                wcs[0].length = length / 2;
     61                wcs[1] = new Wildcard();
     62                wcs[1].counter = 0;
     63                wcs[1].length = length - wcs[0].length;
     64                for (int i = 0; i < wcs[0].length; i++)
     65                    wcs[0].values[i] = values[i];
     66                for (int i = 0; i < wcs[1].length; i++)
     67                    wcs[1].values[i] = values[i + wcs[0].length];
     68                return wcs;
     69            }
     70
    4371            public char getChar()
    44             {               
    45                 return (char)values[counter];
     72            {
     73                char v = values[counter];
     74                if (v == 0)
     75                    Console.WriteLine("error");
     76                return values[counter];
    4677            }
    4778
     
    5788            }
    5889
    59             public int Size()
     90            public int size()
    6091            {
    6192                return length;
     
    71102        {
    72103            this.pattern = pattern;
     104        }
     105
     106        public KeyPattern[] split()
     107        {
     108            KeyPattern[] patterns = new KeyPattern[2];
     109            for (int i = 0; i < 2; i++)
     110            {
     111                patterns[i] = new KeyPattern(pattern);
     112                patterns[i].key = key;
     113                patterns[i].wildcardList = new ArrayList();
     114            }
     115            bool s = false;
     116            for (int i = 0; i < wildcardList.Count; i++)
     117            {
     118                if (!s && ((Wildcard)wildcardList[i]).size() > 1)
     119                {
     120                    Wildcard[] wc = ((Wildcard)wildcardList[i]).split();
     121                    patterns[0].wildcardList.Add(wc[0]);
     122                    patterns[1].wildcardList.Add(wc[1]);
     123                    s = true;
     124                }
     125                else
     126                {
     127                    patterns[0].wildcardList.Add(new Wildcard((Wildcard)wildcardList[i]));
     128                    patterns[1].wildcardList.Add(new Wildcard((Wildcard)wildcardList[i]));
     129                }
     130            }
     131            return patterns;
    73132        }
    74133
     
    136195        }
    137196
    138         public double initKeyIteration(string key)
    139         {
    140             double counter = 1;
     197        public long initKeyIteration(string key)
     198        {
     199            long counter = 1;
    141200            this.key = key;
    142201            int pcount = 0;
     
    148207                    Wildcard wc = new Wildcard(pattern.Substring(pcount, pattern.IndexOf(']', pcount) + 1 - pcount));
    149208                    wildcardList.Add(wc);
    150                     counter *= wc.Size();
     209                    counter *= wc.size();
    151210                }
    152211
     
    192251    public class KeySearcher : IAnalysisMisc
    193252    {
     253        private Queue valuequeue;
     254        private double value_threshold;
     255
    194256        private KeyPattern pattern = null;
    195257        public KeyPattern Pattern
     
    217279        public event PluginProgressChangedEventHandler OnPluginProgressChanged;
    218280
    219         private KeySearcherSettings settings;       
     281        private KeySearcherSettings settings;
    220282
    221283        public KeySearcher()
     
    249311        }
    250312
     313        private void KeySearcherJob(object param)
     314        {
     315            object[] parameters = (object[])param;
     316            KeyPattern pattern = (KeyPattern)parameters[0];
     317            int threadid = (int)parameters[1];
     318            Int64[] doneKeysArray = (Int64[])parameters[2];
     319            Int64[] keycounterArray = (Int64[])parameters[3];           
     320            IControlEncryption sender = (IControlEncryption)parameters[4];
     321            int bytesToUse = (int)parameters[5];
     322
     323            try
     324            {
     325
     326                long size = pattern.initKeyIteration(settings.Key);
     327
     328                do
     329                {
     330                    ValueKey valueKey = new ValueKey();
     331                    try
     332                    {
     333                        valueKey.key = Pattern.getKey();
     334                    }
     335                    catch (Exception ex)
     336                    {
     337                        GuiLogMessage("Could not get next Key: " + ex.Message, NotificationLevel.Error);
     338                        return;
     339                    }
     340
     341                    try
     342                    {
     343                        valueKey.decryption = sender.Decrypt(ControlMaster.getKeyFromString(valueKey.key), bytesToUse);
     344                    }
     345                    catch (Exception ex)
     346                    {
     347                        GuiLogMessage("Decryption is not possible: " + ex.Message, NotificationLevel.Error);
     348                        GuiLogMessage("Stack Trace: " + ex.StackTrace, NotificationLevel.Error);
     349                        return;
     350                    }
     351
     352                    try
     353                    {
     354                        valueKey.value = CostMaster.calculateCost(valueKey.decryption);
     355                    }
     356                    catch (Exception ex)
     357                    {
     358                        GuiLogMessage("Cost calculation is not possible: " + ex.Message, NotificationLevel.Error);
     359                        return;
     360                    }
     361
     362                    if (this.costMaster.getRelationOperator() == RelationOperator.LargerThen)
     363                    {
     364                        if (valueKey.value > value_threshold)
     365                            valuequeue.Enqueue(valueKey);
     366                    }
     367                    else
     368                    {
     369                        if (valueKey.value < value_threshold)
     370                            valuequeue.Enqueue(valueKey);
     371                    }
     372
     373                    doneKeysArray[threadid]++;
     374                    keycounterArray[threadid]++;
     375                } while (Pattern.nextKey() && !stop);
     376            }
     377            finally
     378            {
     379                sender.Dispose();
     380            }
     381        }
     382
    251383        public void process(IControlEncryption sender)
    252         {           
    253 
     384        {
    254385            if (sender != null && costMaster != null)
    255386            {
    256387                int maxInList = 10;
    257388                LinkedList<ValueKey> costList = new LinkedList<ValueKey>();
    258                 ValueKey valueKey = new ValueKey();               
     389                ValueKey valueKey = new ValueKey();
    259390                if (this.costMaster.getRelationOperator() == RelationOperator.LessThen)
    260391                    valueKey.value = double.MaxValue;
    261392                else
    262393                    valueKey.value = double.MinValue;
    263                 valueKey.key = "dummykey";               
     394                valueKey.key = "dummykey";
     395                valueKey.decryption = new byte[0];
     396                value_threshold = valueKey.value;
    264397                LinkedListNode<ValueKey> node = costList.AddFirst(valueKey);
    265398                for (int i = 1; i < maxInList; i++)
     
    274407                    return;
    275408                }
    276                
     409
    277410                int bytesToUse = 0;
    278                 double size = Pattern.initKeyIteration(settings.Key);
    279                
     411
    280412                try
    281413                {
     
    287419                    return;
    288420                }
    289  
    290                 double keycounter = 0;
    291                 double doneKeys = 0;
     421
    292422                LinkedListNode<ValueKey> linkedListNode;
    293423
    294                 DateTime lastTime = DateTime.Now;               
    295                 do
    296                 {
    297                    
    298                     try
    299                     {
    300                         valueKey.key = Pattern.getKey();
    301                     }
    302                     catch (Exception ex)
    303                     {
    304                         GuiLogMessage("Could not get next Key: " + ex.Message, NotificationLevel.Error);
    305                         return;
    306                     }
    307 
    308                     try
    309                     {
    310                         valueKey.decryption = sender.Decrypt(ControlMaster.getKeyFromString(valueKey.key), bytesToUse);
    311                     }
    312                     catch (Exception ex)
    313                     {
    314                         GuiLogMessage("Decryption is not possible: " + ex.Message, NotificationLevel.Error);
    315                         return;
    316                     }
     424                KeyPattern[] patterns;
     425                long size = Pattern.initKeyIteration(settings.Key);
     426
     427                if (settings.CoresUsed > 0)
     428                    patterns = Pattern.split();
     429                else
     430                {
     431                    patterns = new KeyPattern[1];
     432                    patterns[0] = Pattern;
     433                }
     434
     435                valuequeue = Queue.Synchronized(new Queue());
     436
     437                Int64[] doneKeysA = new Int64[patterns.Length];
     438                Int64[] keycounters = new Int64[patterns.Length];
     439                for (int i = 0; i < patterns.Length; i++)
     440                {
     441                    WaitCallback worker = new WaitCallback(KeySearcherJob);
     442                    doneKeysA[i] = new Int64();
     443                    keycounters[i] = new Int64();
     444                    ThreadPool.QueueUserWorkItem(worker, new object[] { patterns[i], i, doneKeysA, keycounters, sender.clone(), bytesToUse });
     445                }
    317446               
    318                     try
    319                     {
    320                         valueKey.value = CostMaster.calculateCost(valueKey.decryption);
    321                     }
    322                     catch (Exception ex)
    323                     {
    324                         GuiLogMessage("Cost calculation is not possible: " + ex.Message, NotificationLevel.Error);
    325                         return;
    326                     }
    327 
    328                     if (this.costMaster.getRelationOperator() == RelationOperator.LargerThen)
    329                     {
    330                         if(valueKey.value > costList.Last().value){                           
     447                //update message:
     448                while (!stop)
     449                {
     450                    Thread.Sleep(10000);
     451
     452                    //update toplist:
     453                    while (valuequeue.Count != 0)
     454                    {
     455                        ValueKey vk = (ValueKey)valuequeue.Dequeue();
     456                        if (this.costMaster.getRelationOperator() == RelationOperator.LargerThen)
     457                        {
     458                            if (vk.value > costList.Last().value)
     459                            {
     460                                node = costList.First;
     461                                while (node != null)
     462                                {
     463
     464                                    if (vk.value > node.Value.value)
     465                                    {
     466                                        costList.AddBefore(node, vk);
     467                                        costList.RemoveLast();
     468                                        value_threshold = costList.Last.Value.value;
     469                                        break;
     470                                    }
     471                                    node = node.Next;
     472                                }//end while
     473                            }//end if
     474                        }
     475                        else
     476                        {
    331477                            node = costList.First;
    332                             while (node != null)
     478                            if (vk.value < costList.Last().value)
    333479                            {
    334 
    335                                 if (valueKey.value > node.Value.value)
     480                                while (node != null)
    336481                                {
    337                                     costList.AddBefore(node, valueKey);
    338                                     costList.RemoveLast();
    339                                     break;
     482
     483                                    if (vk.value < node.Value.value)
     484                                    {
     485                                        costList.AddBefore(node, vk);
     486                                        costList.RemoveLast();
     487                                        value_threshold = costList.Last.Value.value;
     488                                        break;
     489                                    }
     490                                    node = node.Next;
     491                                }//end while
     492                            }//end if
     493                        }
     494                    }
     495
     496                    long keycounter = 0;
     497                    long doneKeys = 0;
     498                    foreach (Int64 dk in doneKeysA)
     499                        doneKeys += dk;
     500                    foreach (Int64 kc in keycounters)
     501                        keycounter += kc;
     502
     503                    ProgressChanged(keycounter, size);
     504
     505                    if (QuickWatchPresentation.IsVisible && doneKeys != 0)
     506                    {
     507                        double time = ((size - keycounter) / doneKeys);
     508                        TimeSpan timeleft = new TimeSpan(-1);
     509
     510                        try
     511                        {
     512                            if (time / (24 * 60 * 60) <= int.MaxValue)
     513                            {
     514                                int days = (int)(time / (24 * 60 * 60));
     515                                time = time - (days * 24 * 60 * 60);
     516                                int hours = (int)(time / (60 * 60));
     517                                time = time - (hours * 60 * 60);
     518                                int minutes = (int)(time / 60);
     519                                time = time - (minutes * 60);
     520                                int seconds = (int)time;
     521
     522                                timeleft = new TimeSpan(days, hours, minutes, (int)seconds, 0);
     523                            }
     524                        }
     525                        catch
     526                        {
     527                            //can not calculate time span
     528                        }
     529
     530                        ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     531                        {
     532                            ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).keysPerSecond.Text = "" + doneKeys/10;
     533                            if (timeleft != new TimeSpan(-1))
     534                            {
     535                                ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).timeLeft.Text = "" + timeleft;
     536                                try
     537                                {
     538                                    ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "" + DateTime.Now.Add(timeleft);
    340539                                }
    341                                 node = node.Next;
    342                             }//end while
    343                         }//end if
    344                     }
    345                     else
    346                     {
    347                         node = costList.First;
    348                         if (valueKey.value < costList.Last().value)
    349                         {
    350                             while (node != null)
    351                             {
    352 
    353                                 if (valueKey.value < node.Value.value)
     540                                catch
    354541                                {
    355                                     costList.AddBefore(node, valueKey);
    356                                     costList.RemoveLast();
    357                                     break;
    358                                 }
    359                                 node = node.Next;
    360                             }//end while
    361                         }//end if
    362                     }
    363                    
    364                     keycounter++;
    365                     doneKeys++;
    366                     TimeSpan duration = DateTime.Now - lastTime;
    367                     if (duration.Seconds >= 1)
    368                     {
    369                         ProgressChanged(keycounter, size);
    370                        
    371                         if (QuickWatchPresentation.IsVisible)
    372                         {
    373                             lastTime = DateTime.Now;
    374                             double time = ((size - keycounter) / doneKeys);
    375                             TimeSpan timeleft = new TimeSpan(-1);
    376 
    377                             try
    378                             {
    379                                 if (time / (24 * 60 * 60) <= int.MaxValue)
    380                                 {
    381                                     int days = (int)(time / (24 * 60 * 60));
    382                                     time = time - (days * 24 * 60 * 60);
    383                                     int hours = (int)(time / (60 * 60));
    384                                     time = time - (hours * 60 * 60);
    385                                     int minutes = (int)(time / 60);
    386                                     time = time - (minutes * 60);
    387                                     int seconds = (int)time;
    388 
    389                                     timeleft = new TimeSpan(days, hours, minutes, (int)seconds, 0);
     542                                    ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "in a galaxy far, far away...";
    390543                                }
    391544                            }
    392                             catch
     545                            else
    393546                            {
    394                                 //can not calculate time span
     547                                ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).timeLeft.Text = "incalculable :-)";
     548                                ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "in a galaxy far, far away...";
    395549                            }
    396550
    397                             ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
     551                            ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Clear();
     552                            linkedListNode = costList.First;
     553                            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
     554                            int i = 0;
     555                            while (linkedListNode != null)
    398556                            {
    399                                 ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).keysPerSecond.Text = "" + doneKeys;
    400                                 if (timeleft != new TimeSpan(-1))
    401                                 {
    402                                     ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).timeLeft.Text = "" + timeleft;
    403                                     try
    404                                     {
    405                                         ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "" + DateTime.Now.Add(timeleft);
    406                                     }catch{
    407                                         ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "in a galaxy far, far away...";
    408                                     }
    409                                 }
    410                                 else
    411                                 {
    412                                     ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).timeLeft.Text = "incalculable :-)";
    413                                     ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).endTime.Text = "in a galaxy far, far away...";
    414                                 }
    415                              
    416                                 ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Clear();
    417                                 linkedListNode = costList.First;
    418                                 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    419                                 int i=0;
    420                                 while (linkedListNode != null)
    421                                 {
    422                                     i++;
    423                                     ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Add(i + ") " + Math.Round(linkedListNode.Value.value,4) + " = " + linkedListNode.Value.key + " : \"" +
    424                                         enc.GetString(linkedListNode.Value.decryption).Replace("\n","").Replace("\r", "").Replace("\t", "") + "\"");
    425                                     linkedListNode = linkedListNode.Next;
    426                                 }                               
     557                                i++;
     558                                ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Add(i + ") " + Math.Round(linkedListNode.Value.value, 4) + " = " + linkedListNode.Value.key + " : \"" +
     559                                    enc.GetString(linkedListNode.Value.decryption).Replace("\n", "").Replace("\r", "").Replace("\t", "") + "\"");
     560                                linkedListNode = linkedListNode.Next;
    427561                            }
    428                             , null);
    429                         }//end if
    430                         doneKeys = 0;
     562                        }
     563                        , null);
    431564                    }//end if
    432 
    433                 } while (Pattern.nextKey() && !stop);
    434 
    435                 if (QuickWatchPresentation.IsVisible)
    436                 {
    437 
    438                     ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    439                     {
    440                         ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Clear();
    441                         linkedListNode = costList.First;
    442                         System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    443                         int i = 0;
    444                         while (linkedListNode != null)
     565                    doneKeys = 0;
     566                    for (int i = 0; i < doneKeysA.Length; i++)
     567                        doneKeysA[i] = 0;
     568
     569                    if (QuickWatchPresentation.IsVisible)
     570                    {
     571
     572                        ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).Dispatcher.Invoke(DispatcherPriority.Normal, (SendOrPostCallback)delegate
    445573                        {
    446                             i++;
    447                             ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Add(i + ") " + Math.Round(linkedListNode.Value.value, 4) + " = " + linkedListNode.Value.key + " : \"" +
    448                                 enc.GetString(linkedListNode.Value.decryption).Replace("\n", "").Replace("\r", "").Replace("\t", "") + "\"");
    449                             linkedListNode = linkedListNode.Next;
     574                            ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Clear();
     575                            linkedListNode = costList.First;
     576                            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
     577                            int i = 0;
     578                            while (linkedListNode != null)
     579                            {
     580                                i++;
     581                                ((KeySearcherQuickWatchPresentation)QuickWatchPresentation).listbox.Items.Add(i + ") " + Math.Round(linkedListNode.Value.value, 4) + " = " + linkedListNode.Value.key + " : \"" +
     582                                    enc.GetString(linkedListNode.Value.decryption).Replace("\n", "").Replace("\r", "").Replace("\t", "") + "\"");
     583                                linkedListNode = linkedListNode.Next;
     584                            }
    450585                        }
    451                     }
    452                     , null);
    453                 }
    454 
    455                 if(!stop)
    456                     ProgressChanged(1, 1);
    457 
     586                        , null);
     587                    }
     588
     589                    if (keycounter >= size)
     590                        break;
     591                }//end while 
    458592            }//end if
     593
     594            if (!stop)
     595                ProgressChanged(1, 1);
     596 
    459597        }
    460598
Note: See TracChangeset for help on using the changeset viewer.