Ignore:
Timestamp:
Aug 10, 2009, 1:50:20 PM (12 years ago)
Author:
Danail Vazov
Message:

Further modification to the chi-square method. Added a setting for choosing between methods of analysis for the columns of ciphertext.

Location:
trunk/CrypPlugins/VigenereAnalyser
Files:
2 edited

Legend:

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

    r390 r426  
    4444        public List <int> keys;
    4545        public List<string> fStats=new List<string>();
    46         //private bool inputChange = false;
    4746        public class Stats
    4847        {
     
    9897                    }
    9998                }
    100 
    10199                var items = (from k in Dic.Keys
    102100                             orderby Dic[k] descending
     
    114112                    if (tmp == 0)
    115113                        keys.Add(tmp);
    116 
    117 
    118114                }
    119115                return keys;
     
    137133                textLength += s.absoluteFrequency;
    138134            });
    139             double[] expectedFrequencies = elf;
     135            double[] expectedFrequencies = new double[elf.Length];
     136            for (int g = 0; g <= elf.Length - 1;g++ )
     137            {
     138                expectedFrequencies[g] = elf[g]/100;
     139            }
    140140            if (freqStats.Count != elf.Length)
    141141            {
    142                 char []check =new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
     142                char[] check = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
    143143                int l = 0;
    144144                int c = 0;
    145                
    146                 for (int t = 0; t <= check.Length - 1;t++ )
     145
     146                for (int t = 0; t <= check.Length - 1; t++)
    147147                {
    148148
    149149                    if (c <= freqStats.Count - 1)
    150150                    {
    151                        
     151
    152152                        Stats r = freqStats.ElementAt(c);
    153153                        if (check[t] == r.letter)
    154154                        {
    155                             observedFrequencies.Add(r.relativeFrequency);
     155                            observedFrequencies.Add(r.relativeFrequency/100);
    156156                            l++;
    157157                            c++;
     
    159159                        else
    160160                        {
    161                             observedFrequencies.Add(0.0);
     161                            observedFrequencies.Add(0.00000);
    162162                            l--;
    163163                        }
    164164                    }
    165                     else
    166                     {
    167                         observedFrequencies.Add(0.0);
    168                     }
    169                 }
     165                    else
     166                    {
     167                        observedFrequencies.Add(0.00000);
     168                    }
     169                }
     170            }
     171            else
     172            {
     173                freqStats.ForEach(delegate(Stats s)
     174                {
     175                    observedFrequencies.Add(s.relativeFrequency/100);
     176                });
    170177            }
    171178            double [] chiStats = new double[26];
    172             for (int y = 0; y <= observedFrequencies.Count - 1;y++)
     179            for (int y = 0; y <=25 ;y++)
    173180            {
    174181                double chi = 0;
    175182                double chiS = 0;
    176                 for (int j = 0; j <= 25; j++)
    177                 {
    178                     int n = y + j;
    179                     if (n > 25)
     183                for (int j = 0; j<=observedFrequencies.Count - 1; j++)
     184                {
     185                    int n = (y + j)%26;
     186                    /*if (n > 25)
    180187                    {
    181188                        n = n - 25;
    182                     }
    183                     chi = observedFrequencies[n]-expectedFrequencies[y];
    184                     chiS = Math.Pow(chi, 2);
    185                     chiS = chiS / expectedFrequencies[y];
    186                     chiStats[j] += chiS;
     189                    }*/
     190                    chi = expectedFrequencies[j]-observedFrequencies[n];
     191                    chiS = (Math.Pow(chi, 2));
     192                    chiStats[y] += chiS;
    187193                }
    188194               
    189 
    190195            }
    191196            shiftKey = 0;
     
    193198            foreach (double k in chiStats)
    194199            {
    195                  if (chiStats[b]<chiStats[shiftKey] )
     200                 if (chiStats[b]-chiStats[shiftKey]<0.002 )
    196201                 {
    197202                     shiftKey = b;
    198203                 }
    199204                 b++;
    200              }
    201              return shiftKey;
    202 
    203 
     205            }
     206            /*if (shiftKey > 19)
     207            {
     208                shiftKey++;
     209            }*/
     210            return shiftKey;
    204211        }
    205212
     
    443450                    int[] kasiskiFactors = kasiskiInput;
    444451                    string workString = stringInput;
    445                     string workstring2 = "";
    446                     //int probableKeylength=0;
    447452                    //Convert the cipher text into a format suitable for analysing i.e. remove all non-plaintext characters. //TO DO alphabet input...
    448453                   
     
    458463                    }
    459464
    460                     workstring2 = workstring1.ToString(); // Now copy workstring1 to workstring2. Needed because workstring1 can not be altered once its built
    461                     workstring2 = workstring2.ToLower();
    462                     cipherText = workstring2;
     465                    cipherText = workstring1.ToString(); // Now copy workstring1 to workstring2. Needed because workstring1 can not be altered once its built
     466                    cipherText = cipherText.ToLower();
    463467                    if (settings.internalKeyLengthAnalysis == 1)
    464468                    {
     
    634638                if (v == probableKeylength)
    635639                {
    636                     List<List<int>> keyList= new List<List<int>>();
    637                     List<int> chiList = new List<int>();
    638                     foreach (string c in fStats)
    639                     {
    640                         if (c != null)
    641                         {
    642                             CaesarAnalysis(c);
    643                             chiSquare(c);
    644                             keyList.Add(keys);
    645                             chiList.Add(shiftKey);
    646                         }
    647                     }
    648640                    int[] probableKeyword = new int[probableKeylength];
    649                     for (int f = 0; f <= probableKeylength - 1; f++)
    650                     {
    651                         int [] tempKey = keyList.ElementAt(f).ToArray();
    652                         probableKeyword[f]=tempKey[0];
    653                         tempKey = null;
    654                         //probableKeyword[f] = chiList.ElementAt(f);
    655                     }
    656                     keyList = null;
     641                    if (settings.columnAnalysis == 0)
     642                    {
     643                        List<List<int>> keyList = new List<List<int>>();
     644                        foreach (string c in fStats)
     645                        {
     646                            if (c != null)
     647                            {
     648                                CaesarAnalysis(c);
     649                                keyList.Add(keys);
     650                            }
     651                        }
     652                        for (int f = 0; f <= probableKeylength - 1; f++)
     653                        {
     654                            int[] tempKey = keyList.ElementAt(f).ToArray();
     655                            probableKeyword[f]=tempKey[0];
     656                            tempKey = null;
     657                        }
     658                        keyList = null;
     659
     660                    }
     661                    if (settings.columnAnalysis == 1)
     662                    {
     663                        List<int> chiList = new List<int>();
     664                        foreach (string c in fStats)
     665                        {
     666                            if (c != null)
     667                            {
     668                                chiSquare(c);
     669                                chiList.Add(shiftKey);
     670                            }
     671                        }
     672                        for (int f = 0; f <= probableKeylength - 1; f++)
     673                        {
     674                           
     675                            probableKeyword[f] = chiList.ElementAt(f);
     676                        }
     677                    }
    657678                    StringBuilder keywordstring = new StringBuilder();
    658679                    foreach(int r in probableKeyword)
  • trunk/CrypPlugins/VigenereAnalyser/VigenereAnalyserSettings.cs

    r390 r426  
    1515        private int elf = 0;
    1616        public int internalKeyLengthAnalysis = 0;
     17        public int columnAnalysis = 0;
    1718        private bool hasChanges = false;
    1819        [ContextMenu("Expected Letter Frequency of a language", "Select the Null hypothesis for the Chi-square statistic", 2, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, null, new String[] { "English", "German", "French", "Spanish", "Italian", "Portugeese" })]
     
    3738                if (((int)value) != internalKeyLengthAnalysis) hasChanges = true;
    3839                this.internalKeyLengthAnalysis = (int)value;
    39                 OnPropertyChanged("internalKeyLengthAnalysis");
     40                OnPropertyChanged("InternalKeyLengthAnalysis");
     41            }
     42        }
     43        [ContextMenu("Method of column analysis", "Select the method of analysis of the ciphertext columns", 2, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, null, new String[] { "Use most frequent letter", "Use sum of squares" })]
     44        [TaskPane("Method of column analysis", "Select the method of analysis of the ciphertext columns", null, 2, false, DisplayLevel.Experienced, ControlType.ComboBox, new String[] { "Use most frequent letter", "Use sum of squares" })]
     45        public int ColumnAnalysis
     46        {
     47            get { return this.columnAnalysis; }
     48            set
     49            {
     50                if (((int)value) != columnAnalysis) hasChanges = true;
     51                this.columnAnalysis = (int)value;
     52                OnPropertyChanged("ColumnAnalysis");
    4053            }
    4154        }
Note: See TracChangeset for help on using the changeset viewer.