Ignore:
Timestamp:
Feb 24, 2010, 12:08:31 AM (12 years ago)
Author:
Sven Rech
Message:

better entropy implementation

and changed nativecryptography settings

Location:
trunk/CrypPlugins/CostFunction
Files:
2 edited

Legend:

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

    r991 r1176  
    2727using System.IO;
    2828using System.Text.RegularExpressions;
     29using System.Threading;
    2930namespace Cryptool.Plugins.CostFunction
    3031{
     
    341342        /// <returns>Index of Coincidence</returns>
    342343        public double calculateIndexOfCoincidence(byte[] text, int bytesToUse)
    343         {
     344        {           
    344345            if (bytesToUse > text.Length)
    345346                bytesToUse = text.Length;
     
    370371        }//end calculateIndexOfCoincidence
    371372
     373
     374        private int lastUsedSize = -1;
     375        private double[] xlogx;
     376        private Mutex prepareMutex = new Mutex();
     377
     378        private void prepareEntropy(int size)
     379        {
     380            xlogx = new double[size + 1];
     381            //precomputations for fast entropy calculation     
     382            xlogx[0] = 0.0;
     383            for (int i = 1; i <= size; i++)
     384                xlogx[i] = -1.0 * i * Math.Log(i / (double)size) / Math.Log(2.0);
     385        }
     386
    372387        /// <summary>
    373388        /// Calculates the Entropy of a given byte array
     
    392407                bytesToUse = text.Length;
    393408
    394             double[] n = new double[256];
     409            if (lastUsedSize != bytesToUse)
     410            {
     411                try
     412                {
     413                    prepareMutex.WaitOne();
     414                    if (lastUsedSize != bytesToUse)
     415                    {
     416                        prepareEntropy(bytesToUse);
     417                        lastUsedSize = bytesToUse;
     418                    }
     419                }
     420                finally
     421                {
     422                    prepareMutex.ReleaseMutex();
     423                }
     424            }
     425
     426            int[] n = new int[256];
    395427            //count all ASCII symbols
    396428            int counter = 0;
     
    406438            //calculate probabilities and sum entropy
    407439            for (int i = 0; i < n.Length; i++)
    408             {
    409                 double pz = n[i] / bytesToUse; //probability of character n[i]
    410                 if (pz > 0)
    411                     entropy = entropy + pz * Math.Log(pz, 2);
    412             }
    413 
    414             return -1 * entropy; // because of log we have negative values, but we want positive
     440                entropy += xlogx[n[i]];
     441
     442            return entropy / (double)bytesToUse;
    415443
    416444        }//end calculateEntropy
    417 
    418445
    419446        /// <summary>
     
    601628            try
    602629            {
    603                 bytesToUse = int.Parse(((CostFunctionSettings)this.plugin.Settings).BytesToUse);
     630                bytesToUse = ((CostFunctionSettings)this.plugin.Settings).BytesToUseInteger;
    604631            }
    605632            catch (Exception ex)
  • trunk/CrypPlugins/CostFunction/CostFunctionSettings.cs

    r991 r1176  
    3232        private int functionType;
    3333        private String bytesToUse = "256";
     34        private int bytesToUseInteger = 256;
    3435        #endregion
    3536       
     
    5657            {
    5758                bytesToUse = value;
    58                 OnPropertyChanged("BytesToUse");
     59                bytesToUseInteger = int.Parse(value);
     60                OnPropertyChanged("BytesToUse");
    5961            }
     62        }
     63
     64        public int BytesToUseInteger
     65        {
     66            get { return bytesToUseInteger; }
    6067        }
    6168
Note: See TracChangeset for help on using the changeset viewer.