Changeset 1208


Ignore:
Timestamp:
Feb 26, 2010, 7:12:21 PM (12 years ago)
Author:
Sven Rech
Message:

little bit faster entropy implementation

Location:
trunk
Files:
4 edited

Legend:

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

    r1204 r1208  
    404404        public double calculateEntropy(byte[] text, int bytesToUse)
    405405        {
     406            return NativeCryptography.Crypto.calculateEntropy(text, bytesToUse);
    406407            if (bytesToUse > text.Length)
    407408                bytesToUse = text.Length;
  • trunk/CrypPlugins/CostFunction/CostFunction.csproj

    r949 r1208  
    44    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    55    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    6     <ProductVersion>9.0.30729</ProductVersion>
     6    <ProductVersion>9.0.21022</ProductVersion>
    77    <SchemaVersion>2.0</SchemaVersion>
    88    <ProjectGuid>{3C72FF93-48C2-4929-B3B2-83F165AAE636}</ProjectGuid>
     
    6464      <Name>CrypPluginBase</Name>
    6565    </ProjectReference>
     66    <ProjectReference Include="..\..\NativeCryptography\NativeCryptography.vcproj">
     67      <Project>{97B06ADB-43E4-4320-9AD8-D167421F0644}</Project>
     68      <Name>NativeCryptography</Name>
     69    </ProjectReference>
    6670  </ItemGroup>
    6771  <ItemGroup>
  • trunk/NativeCryptography/NativeCryptography.cpp

    r1201 r1208  
    22
    33#include "NativeCryptography.h"
     4#include <stdlib.h>
     5#include <string.h>
    46
    57namespace NativeCryptography {
     
    144146        }
    145147
     148        double *xlogx = 0;
     149
     150        void prepareEntropy(int size)
     151    {
     152                if (xlogx != 0)
     153                        free(xlogx);
     154        xlogx = (double*)malloc((size + 1)*sizeof(double));
     155        //precomputations for fast entropy calculation 
     156        xlogx[0] = 0.0;
     157        for (int i = 1; i <= size; i++)
     158                        xlogx[i] = -1.0 * i * Math::Log(i / (double)size) / Math::Log(2.0);
     159    }
     160
     161
     162        double Crypto::calculateEntropy(array<unsigned char>^ text, int bytesToUse)
     163        {
     164        if (bytesToUse > text->Length)
     165            bytesToUse = text->Length;
     166                static int lastUsedSize = -1;
     167
     168        if (lastUsedSize != bytesToUse)
     169        {
     170            try
     171            {
     172                prepareMutex->WaitOne();
     173                if (lastUsedSize != bytesToUse)
     174                {
     175                    prepareEntropy(bytesToUse);
     176                    lastUsedSize = bytesToUse;
     177                }
     178            }
     179            finally
     180            {
     181                prepareMutex->ReleaseMutex();
     182            }
     183        }
     184
     185                pin_ptr<unsigned char> t = &text[0];
     186
     187        int n[256];
     188                memset(n,0,sizeof(n));
     189        //count all ASCII symbols
     190        for (int counter = 0; counter < bytesToUse; counter++)
     191        {
     192            n[t[counter]]++;
     193        }
     194
     195        double entropy = 0;
     196        //calculate probabilities and sum entropy
     197        for (short i = 0; i < 256; i++)                 
     198            entropy += xlogx[n[i]];
     199
     200        return entropy / (double)bytesToUse;
     201        }
     202
    146203}
  • trunk/NativeCryptography/NativeCryptography.h

    r1201 r1208  
    22#include "aes_core.h"
    33#include "DES/des.h"
    4 #include <stdlib.h>
    54
    65using namespace System::Threading;
     
    2423                static array<unsigned char>^ decryptAESorDES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode, const int blockSize, const cryptMethod method);
    2524
     25                static Mutex^ prepareMutex = gcnew Mutex();
     26               
     27
    2628        public:
     29                static double calculateEntropy(array<unsigned char>^ text, int bytesToUse);
     30
    2731                static array<unsigned char>^ decryptAES(array<unsigned char>^ Input, array<unsigned char>^ Key, array<unsigned char>^ IV, const int bits, const int length, const int mode)
    2832                {
Note: See TracChangeset for help on using the changeset viewer.