Changeset 298


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)

Location:
trunk/CrypPlugins
Files:
2 edited

Legend:

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

    r214 r298  
    142142                    workstring2 = workstring;
    143143                }
    144                 string tempString="";
     144
    145145               
    146146                ArrayList gramms = new ArrayList();
    147147                int l = 0;
    148                 for (l = 0; l <= workstring2.Length - settings.GrammLength-1;l++ )
    149                 {
    150                    
     148                for (l = 0; l < workstring2.Length - settings.GrammLength + 1; l++ )
     149                {
    151150                    gramms.Add(workstring2.Substring(l,settings.GrammLength));
    152                              
    153                    
    154151                }
    155152               
    156153                gramms.Sort();
    157                 ArrayList amountCharacters=new ArrayList();
     154               
     155                                ArrayList amountCharacters=new ArrayList();
    158156                ArrayList percentageCharacters = new ArrayList();
    159157                ArrayList countedGramms= new ArrayList();
     
    161159                Data.ValueCollection.Clear();
    162160                double bigestheight=0;
     161
    163162                for (int n = 0; n < gramms.Count; n++)
    164163                {
    165 
    166164                    tempInt = gramms.LastIndexOf(gramms[n]) - gramms.IndexOf(gramms[n]) + 1;
    167165                    amountCharacters.Add(tempInt);
    168                     percentageCharacters.Add(Math.Round(Convert.ToDouble(tempInt) * settings.GrammLength / Convert.ToDouble(StringInput.Length) * 100, 3));
    169                     countedGramms.Add(gramms[n]);
     166                                       
     167                                        percentageCharacters.Add(Math.Round(Convert.ToDouble(tempInt) / Convert.ToDouble(StringInput.Length - settings.GrammLength +1) * 100, 3));
    170168                   
    171                  
     169                                        countedGramms.Add(gramms[n]);
     170                   
    172171                    if (bigestheight< (double)percentageCharacters[percentageCharacters.Count-1])
    173172                    {
  • 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.