Changeset 1979


Ignore:
Timestamp:
Oct 15, 2010, 1:39:40 PM (11 years ago)
Author:
Christoph Hartmann
Message:

accepts a custom (user defined) bigraph statistic, wich is generated by the PlayfairAnalysisStatistic plugin

Location:
trunk/CrypPlugins/PlayfairAnalysis
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPlugins/PlayfairAnalysis/BigraphStatistic.cs

    r1939 r1979  
    210210                }
    211211            }
    212            
    213            
    214 
     212
     213            return Stat;
     214        }
     215
     216
     217        public double[,] CalcLogStat(string text, string alphabet)
     218        {
     219            double[,] Stat = new double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
     220            int Pos1, Pos2;
     221            int sum = 0;
     222                       
     223            for (int i = 0; i < text.Length - 1; i += 2)
     224            {
     225                Pos1 = alphabet.IndexOf(text[i]);
     226                Pos2 = alphabet.IndexOf(text[i + 1]);
     227
     228                Stat[Pos1, Pos2]++;
     229                sum++;
     230            }
     231                       
     232            for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
     233            {
     234                for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
     235                {
     236                    if (Stat[i, j] > 0)
     237                    {
     238                        Stat[i, j] = Math.Log(Stat[i, j] / sum);
     239                    }
     240                    else
     241                        Stat[i, j] = -10;
     242                }
     243            }
    215244            return Stat;
    216245        }
  • trunk/CrypPlugins/PlayfairAnalysis/Key.cs

    r1939 r1979  
    130130        }
    131131
    132         public static char[,] ConvertToChar(int[] matrix)
     132        public static char[,] ConvertToChar(int[] matrix, string alphabet)
    133133        {
    134134            int matrixSize = (int)Math.Sqrt(matrix.Length);
    135             char[,] matrixchar = new char[matrixSize, matrixSize]; 
     135            char[,] matrixChar = new char[matrixSize, matrixSize]; 
    136136         
    137137            for (int i = 0; i < matrixSize; i++)
     
    139139                for (int j = 0; j < matrixSize; j++)
    140140                {
     141                    matrixChar[i, j] = alphabet[matrix[(i * matrixSize) + j]];
     142                    /*
    141143                    switch (matrixSize)
    142144                    {
    143145                        case 5:
    144146                            if (matrix[i * 5 + j] + 'A' < 'J')
    145                                 matrixchar[i, j] = (char)(matrix[i * 5 + j] + 'A');
    146                             else
    147                                 matrixchar[i, j] = (char)(matrix[i * 5 + j] + 'B');
     147                                matrixChar[i, j] = (char)(matrix[i * 5 + j] + 'A');
     148                            else
     149                                matrixChar[i, j] = (char)(matrix[i * 5 + j] + 'B');
    148150                            break;
    149151
    150152                        case 6:
    151153                            if ((matrix[i * 6 + j] + 'A' >= 'A') && (matrix[i * 6 + j] + 'A' <= 'Z'))
    152                                 matrixchar[i, j] = (char)(matrix[i * 6 + j] + 'A');
    153                             else
    154                                 matrixchar[i, j] = (char)(matrix[i * 6 + j] + '0' - 26);
     154                                matrixChar[i, j] = (char)(matrix[i * 6 + j] + 'A');
     155                            else
     156                                matrixChar[i, j] = (char)(matrix[i * 6 + j] + '0' - 26);
    155157                            break;
    156158
     
    158160                            break;
    159161                    }
     162                    */
    160163                }               
    161164            }
    162             return matrixchar;
     165            return matrixChar;
    163166        }
    164167
  • trunk/CrypPlugins/PlayfairAnalysis/KeySearcher.cs

    r1939 r1979  
    2626        string plainText;       
    2727        int keyHeapSize;
     28        string alphabet;
    2829
    2930
     
    103104        }
    104105
    105         public KeySearcher(int matrixSize, int keyHeapSize, double[,] bs, string cipherText)
     106        public KeySearcher(int matrixSize, int keyHeapSize, double[,] bs, string alphabet, string cipherText)
    106107        {
    107108            this.matrixSize = matrixSize;
     
    112113            DecodingTab = new int[(int)Math.Pow(matrixSize, 2) * ((int)Math.Pow(matrixSize, 2) - 1), 2, 2];
    113114            this.bigraphStat = bs;
     115            this.alphabet = alphabet;
    114116        }
    115117
     
    277279
    278280        public void Attack()
    279         {
    280                        
     281        {                       
    281282            BigraphStatistic CS = new BigraphStatistic(matrixSize);
    282             CipherStat = CS.CalcLog(cipherText);           
     283            CipherStat = CS.CalcLogStat(cipherText, alphabet);           
    283284            int[] TestKey = new int[(int)Math.Pow(matrixSize, 2)];
    284285            double Score2;
     
    502503           
    503504           
    504             Key BestKeyMatrix = new Key(Key.ConvertToChar(BestKey));
    505 
    506 
     505            Key BestKeyMatrix = new Key(Key.ConvertToChar(BestKey, alphabet));
    507506
    508507            plainText =  Decrypt(BestKeyMatrix, cipherText);
  • trunk/CrypPlugins/PlayfairAnalysis/PlayfairAnalysis.cs

    r1939 r1979  
    2727using Mischel.Collections;
    2828using System.Threading;
     29using System.Windows;
    2930
    3031
     
    3233{   
    3334    [Author("Christoph Hartmann", "chris-ha@freenet.de", "Johannes Gutenberg-Universität Mainz", "http://www.uni-mainz.de")]
    34     [PluginInfo(false, "Playfair Analysis", "Ciphertext only attack on Playfair", "PlayfairAnalysis/DetailedDescription/Description.xaml", "PlayfairAnalysis/Images/icon.png")]
     35    [PluginInfo(false, "Playfair (Bruteforce) Analysis", "Ciphertext only attack on Playfair", "PlayfairAnalysis/DetailedDescription/Description.xaml", "PlayfairAnalysis/Images/icon.png")]
    3536    [EncryptionType(EncryptionType.Classic)]
    3637    public class PlayfairAnalysis : ISpecific
     
    4445        private Thread playFairAttackThread;
    4546        private bool executionStopped;
     47        private double[,] customLogStat;
     48        private double[] customLogStat2;
     49        private string alphabet = "";
    4650
    4751        #endregion
     
    5357        /// </summary>
    5458        [PropertyInfo(Direction.InputData, "Text input", "Input a string to be analyzed", null, DisplayLevel.Beginner)]
    55         public string InputString
     59        public virtual string InputString
    5660        {
    5761            get { return this.inputString; }
     
    6569            }
    6670        }
     71
     72        /*
     73        [PropertyInfo(Direction.InputData, "Bigraph Statistic", "Bigraph Statistic from Playfair Analysis Statistic Plugin", null, false, false, DisplayLevel.Beginner, QuickWatchFormat.Hex, null)]
     74        public virtual double[] CustomLogStat
     75        {
     76            get { return this.customLogStat2; }
     77            set
     78            {
     79                if (value != this.customLogStat2)
     80                {
     81                    this.customLogStat2 = value;
     82                    OnPropertyChanged("CustomLogStat");
     83                }
     84            }
     85        }
     86        */
     87
     88        CryptoolStream csBigraphStatistic;
     89        [PropertyInfo(Direction.InputData, "Bigraph Statistic", "Bigraph Statistic from Playfair Analysis Statistic Plugin", null, DisplayLevel.Beginner)]
     90        public CryptoolStream CustomLogStat
     91        {
     92            get
     93            {
     94                if (this.csBigraphStatistic != null)
     95                {
     96                    CryptoolStream cs = new CryptoolStream();
     97                    cs.OpenRead(this.csBigraphStatistic.FileName);
     98                    return cs;
     99                }
     100                return null;
     101            }
     102
     103            set
     104            {
     105                if (value != this.csBigraphStatistic)
     106                {
     107                    this.csBigraphStatistic = value;
     108                    OnPropertyChanged("CustomLogStat");
     109                }
     110            }
     111        }
     112
     113
     114
    67115
    68116        /// <summary>
     
    70118        /// </summary>
    71119        [PropertyInfo(Direction.OutputData, "Text output", "The output string after playfair analysis", null, DisplayLevel.Beginner)]
    72         public string OutputString
     120        public virtual string OutputString
    73121        {
    74122            get { return this.outputString; }
     
    82130
    83131        [PropertyInfo(Direction.OutputData, "CryptoolStream output", "The raw CryptoolStream data after playfair analysis", null, DisplayLevel.Beginner)]
    84         public CryptoolStream OutputData
     132        public virtual CryptoolStream OutputData
    85133        {
    86134            get
     
    149197            if (settings.HeapSize < 1)
    150198            {
    151                 System.Windows.MessageBox.Show("Heap size hast to be a positiv integer!\nHeap size is set to 5000");
     199                System.Windows.MessageBox.Show("Heap size has to be a positiv integer!\nHeap size is set to 5000");
    152200                settings.HeapSize = 5000;
    153201            }
     
    156204            // BigraphStatistic.CreateBS(@"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\", 6);
    157205
    158 
    159             // Read Bigraph Statistic from xml file
    160            
    161             switch (settings.MatrixSize)
    162             {
    163                 case 0:
    164                     if (settings.Language == 0)
     206            if (settings.UseCustomStatistic == 1)       // Use Bigraph Statistic that is generated by PlayfairAnalysisStatistic plugin
     207            {
     208                int alphabetLength;
     209                int offset = 0;
     210                csBigraphStatistic = CustomLogStat;
     211
     212                alphabetLength = (int)csBigraphStatistic.Read(offset, 1)[0];
     213                matrixSize = (int)(Math.Sqrt(alphabetLength));
     214
     215                BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
     216                byte[] statisticBuffer = new byte[8 * BigraphStat.Length];
     217
     218                alphabet = "";
     219                for (int i = 0; i < alphabetLength; i++)
     220                {
     221                    alphabet += (char)csBigraphStatistic.Read(offset, 1)[0];
     222                }
     223
     224               
     225                statisticBuffer = csBigraphStatistic.Read(offset, 8 * BigraphStat.Length);
     226               
     227
     228                for (int i = 0; i < (int)Math.Pow(matrixSize, 2); i++)
     229                {                               
     230                    for (int j = 0; j < (int)Math.Pow(matrixSize, 2); j++)
     231                    {                       
     232                        BigraphStat[i, j] = BitConverter.ToDouble(statisticBuffer, offset);
     233                        offset += 8;
     234                    }                               
     235                }
     236
     237                GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
     238                GuiLogMessage("Custom Bigraph Stat successfully set", NotificationLevel.Info);
     239            }
     240
     241            else          // Read Bigraph Statistic from xml file
     242            {               
     243                switch (settings.MatrixSize)
     244                {
     245                    case 0:
     246                        if (settings.Language == 0)
     247                        {
     248                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
     249                        }
     250                        else
     251                        {
     252                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10seng.xml";
     253                        }
     254                        matrixSize = 5;
     255                        alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
     256
     257                        break;
     258
     259                    case 1:
     260                        if (settings.Language == 0)
     261                        {
     262                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10lde.xml";
     263                        }
     264                        else
     265                        {
     266                            BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10leng.xml";
     267                        }
     268                        matrixSize = 6;
     269                        alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
     270                        break;
     271
     272                    default:
     273                        BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
     274                        matrixSize = 5;
     275                        alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
     276                        break;
     277                }
     278
     279                BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
     280
     281                System.Xml.Serialization.XmlSerializer ReadBS = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
     282                System.Xml.XmlReader XmlReader = System.Xml.XmlReader.Create(BsPath);
     283                Double[][] BigraphStatDummy = (Double[][])ReadBS.Deserialize(XmlReader);
     284                XmlReader.Close();
     285
     286                for (int i = 0; i < Math.Pow(matrixSize, 2); i++)
     287                {
     288                    for (int j = 0; j < Math.Pow(matrixSize, 2); j++)
    165289                    {
    166                         BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
     290                        BigraphStat[i, j] = BigraphStatDummy[i][j];
    167291                    }
    168                     else
    169                     {
    170                         BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10seng.xml";
    171                     }
    172                     matrixSize = 5;
    173                     break;
    174 
    175                 case 1:
    176                     if (settings.Language == 0)
    177                     {
    178                         BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10lde.xml";
    179                     }
    180                     else
    181                     {
    182                         BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10leng.xml";
    183                     }
    184                     matrixSize = 6;
    185                     break;
    186 
    187                 default:
    188                     BsPath = @"c:\Documents and Settings\PT7130\My Documents\Visual Studio 2010\Projects\Cryptool2\trunk\CrypPlugins\PlayfairAnalysis\Data\BSLog10sde.xml";
    189                     matrixSize = 5;
    190                     break;
    191             }
    192 
    193             GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
    194            
    195 
    196             BigraphStat = new Double[(int)Math.Pow(matrixSize, 2), (int)Math.Pow(matrixSize, 2)];
    197            
    198             System.Xml.Serialization.XmlSerializer ReadBS = new System.Xml.Serialization.XmlSerializer(typeof(Double[][]));
    199             System.Xml.XmlReader XmlReader = System.Xml.XmlReader.Create(BsPath);
    200             Double[][] BigraphStatDummy = (Double[][])ReadBS.Deserialize(XmlReader);
    201             XmlReader.Close();
    202 
    203             for (int i = 0; i < Math.Pow(matrixSize, 2); i++)
    204             {
    205                 for (int j = 0; j < Math.Pow(matrixSize, 2); j++)
    206                 {
    207                     BigraphStat[i, j] = BigraphStatDummy[i][j];
    208                 }
    209             }
    210            
    211             GuiLogMessage("Bigraph statistics loaded: " + BsPath, NotificationLevel.Info);
     292                }
     293
     294                GuiLogMessage("MatrixSize: " + Convert.ToString(matrixSize), NotificationLevel.Info);
     295                GuiLogMessage("Bigraph statistics loaded: " + BsPath, NotificationLevel.Info);
     296            }
     297
    212298            GuiLogMessage("Starting Analysis", NotificationLevel.Info);
    213299
    214             KeySearcher keySearcher = new KeySearcher(matrixSize, settings.HeapSize, BigraphStat, InputString);
     300            KeySearcher keySearcher = new KeySearcher(matrixSize, settings.HeapSize, BigraphStat, alphabet, InputString);
    215301
    216302            keySearcher.LogMessageByKeySearcher += new KeySearcher.LogMessageByKeySearcherEventHandler(OnLogMessageByKeySearcher);
     
    251337        public void Stop()
    252338        {
    253             playFairAttackThread.Abort();
     339            if (playFairAttackThread != null)
     340            {
     341                playFairAttackThread.Abort();
     342            }
    254343            executionStopped = true;
    255344        }
     
    257346        public void Initialize()
    258347        {
     348            settings.UseCustomStatistic = 0;
    259349        }
    260350
  • trunk/CrypPlugins/PlayfairAnalysis/PlayfairAnalysisSettings.cs

    r1939 r1979  
    3434        private int matrixSize = (int)supportedMatrixSizes.MatrixSize5x5;
    3535        private int language;
     36        private int useCustomStatistic;
    3637       
    3738        #endregion
     
    7071        }
    7172
    72         [TaskPane("Matrix Size", "Size of Matrix used for Encryption", null, 1, false, DisplayLevel.Beginner, ControlType.RadioButton, new string[] { "5 x 5", "6 x 6" })]
     73        [TaskPane("Bigraph Statistic", "Bigraph Statistic to be used", null, 2, false, DisplayLevel.Beginner, ControlType.RadioButton, new string[] { "Default", "Custom" })]
     74        public int UseCustomStatistic
     75        {
     76            get
     77            {
     78                return useCustomStatistic;
     79            }
     80            set
     81            {
     82                if (useCustomStatistic != value)
     83                {
     84                    if (value == 0)
     85                    {
     86                        if (TaskPaneAttributeChanged != null)
     87                        {
     88                            TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("MatrixSize", Visibility.Visible)));
     89                            TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("Language", Visibility.Visible)));
     90                        }
     91                    }
     92                    else
     93                    {
     94                        if (TaskPaneAttributeChanged != null)
     95                        {
     96                            TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("MatrixSize", Visibility.Collapsed)));
     97                            TaskPaneAttributeChanged(this, new TaskPaneAttributeChangedEventArgs(new TaskPaneAttribteContainer("Language", Visibility.Collapsed)));
     98                        }
     99                    }
     100
     101                    useCustomStatistic = value;
     102                    hasChanges = true;
     103                }
     104            }
     105        }
     106
     107        [TaskPane("Matrix Size", "Size of Matrix used for Encryption", null, 3, false, DisplayLevel.Beginner, ControlType.RadioButton, new string[] { "5 x 5", "6 x 6" })]
    73108        public int MatrixSize
    74109        {
     
    87122        }
    88123
    89         [TaskPane("Language", "Assumed Language of Ciphertext", null, 1, false, DisplayLevel.Beginner, ControlType.RadioButton, new string[] { "German", "English" })]
     124        [TaskPane("Language", "Assumed Language of Ciphertext", null, 4, false, DisplayLevel.Beginner, ControlType.RadioButton, new string[] { "German", "English" })]
    90125        public int Language
    91126        {
     
    131166
    132167        public event PropertyChangedEventHandler PropertyChanged;
     168        public event TaskPaneAttributeChangedHandler TaskPaneAttributeChanged;
    133169
     170       
    134171        protected void OnPropertyChanged(string name)
    135172        {
Note: See TracChangeset for help on using the changeset viewer.