Ignore:
Timestamp:
Apr 29, 2009, 5:10:39 PM (13 years ago)
Author:
Arno Wacker
Message:
  • Bugfix for FrequencyTest
  • Fix (formula for FriedmanTest

(Fix provided by S. Holzapfel)

File:
1 edited

Legend:

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

    r216 r298  
    104104            if (arrayInput != null)
    105105            {
    106                 double Kp; //Kappa "plain-text"
    107                 //Now we set the Kappa plain-text coefficient. Default is English.
     106                double Kp; //Kappa "language"
     107                                long cipherTextLength = 0; //n
     108                                long countDoubleCharacters = 0;
     109
     110                                //Now we set the Kappa plain-text coefficient. Default is English.
    108111                switch (settings.Kappa)
    109112                {
     
    115118                    default: Kp = 0.0667; break;
    116119                }
     120 
     121                                for (int i = 0; i < arrayInput.Length; i++)
     122                                {
     123                                        cipherTextLength += arrayInput[i];
     124                                        countDoubleCharacters += (arrayInput[i] * (arrayInput[i] - 1));
     125                                }
     126
     127                                double kappaCiphertext = ((double)countDoubleCharacters / (double)(cipherTextLength * (cipherTextLength - 1)));
     128                                double keyLen = 0.0377 * cipherTextLength / (((cipherTextLength - 1) * kappaCiphertext) - (0.0385 * cipherTextLength) + Kp);
    117129               
    118                
    119                 //Now we put the needed absolute values of the letter frequencies into an array
    120                 int[] absolutevalue = new int[arrayInput.Length];
    121                 for (int i = 0; i <= arrayInput.Length-1;i++ )
    122                 {
    123                     absolutevalue[i] = arrayInput[i];
    124                 }
    125                 //Now we begin calculation of the arithmetic sum of the frequencies
    126                 int[] summ=new int [absolutevalue.Length];
    127                 for (int d = 0; d < absolutevalue.Length; d++)
    128                     {
    129                         summ[d] = absolutevalue[d] * (absolutevalue[d] - 1);
    130                        
    131                     }
    132                 int summ1 = 0;
    133                 foreach (int z in summ)
    134                 {
    135                      summ1 += z;
    136                      
    137                 }
    138                 //Now we calculate the length of text from the observed letter frequencies
    139                 int texLen = 0;
    140                 foreach (int y in absolutevalue)
    141                 {
    142                     texLen += y;
    143                 }
    144                 double normTexLen = texLen * (texLen - 1); //Normalize the text length in order to calculate the observed index of coincidence
    145                 double obIC = summ1/normTexLen; //Calculates the observed index of coincidence
    146                 double Kr = 0.019; //Kappa "random" - expected coincidence rate for a uniform distribution of the alphabet. In this case 1/26, hence we should have a 26 letter alphabet on the input.   
    147                 double keyLen = 0.027 * texLen / (((texLen - 1) * obIC) - (Kr * texLen) + Kp);
    148                 stringOutput = Convert.ToString(keyLen);
     130                                stringOutput = Convert.ToString(keyLen);
    149131                keyLength = keyLen;
    150132                OnPropertyChanged("OutputString");
     
    152134                if (OnPluginProgressChanged != null)
    153135                {
    154                     OnPluginProgressChanged(this, new PluginProgressEventArgs(texLen, texLen));
     136                                        OnPluginProgressChanged(this, new PluginProgressEventArgs(cipherTextLength, cipherTextLength));
    155137                }
    156138            }
Note: See TracChangeset for help on using the changeset viewer.