Changeset 8634


Ignore:
Timestamp:
Feb 18, 2020, 3:29:02 PM (2 years ago)
Author:
kopal
Message:
  • AnalysisMonoalphabeticSubstitution:

made subsitution analyzer more robust with respect to handling of too long ciphertext alphabets

  • LanguageStatistics:

maed calculation of language statistics more robust; unknown letters are ignored now

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/CrypPluginBase/Utils/LanguageStatistics.cs

    r8242 r8634  
    266266
    267267            for (int i = 0; i < end; i++)
     268            {
    268269                value += ngrams[plaintext[i]];
     270            }
    269271
    270272            return value / end;
     
    434436
    435437            for (int i = 0; i < end; i++)
     438            {
     439                if (plaintext[i] >= Alphabet.Length ||
     440                    plaintext[i] < 0)
     441                {
     442                    continue;
     443                }
    436444                value += Frequencies[plaintext[i]];
    437445
     446            }
    438447            return value / end;
    439448        }
     
    470479
    471480            for (int i = 0; i < end; i++)
     481            {
     482
     483                if (plaintext[i] >= Alphabet.Length ||
     484                    plaintext[i+1] >= Alphabet.Length ||
     485                    plaintext[i] < 0 ||
     486                    plaintext[i+1] < 0)
     487                {
     488                    continue;
     489                }
    472490                value += Frequencies[plaintext[i], plaintext[i + 1]];
    473 
     491            }
    474492            return value / end;
    475493        }
     
    506524
    507525            for (int i = 0; i < end; i++)
    508                 value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2]];
    509 
     526            {
     527                if (plaintext[i] >= Alphabet.Length ||
     528                    plaintext[i + 1] >= Alphabet.Length ||
     529                    plaintext[i + 2] >= Alphabet.Length ||
     530                    plaintext[i] < 0 ||
     531                    plaintext[i + 1] < 0 ||
     532                    plaintext[i + 2] < 0)
     533                {
     534                    continue;
     535                }
     536                value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2]];               
     537            }
    510538            return value / end;
    511539        }
     
    542570
    543571            for (int i = 0; i < end; i++)
    544                 value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2], plaintext[i + 3]];
    545 
     572            {
     573                if (plaintext[i] >= Alphabet.Length ||
     574                    plaintext[i + 1] >= Alphabet.Length ||
     575                    plaintext[i + 2] >= Alphabet.Length ||
     576                    plaintext[i + 3] >= Alphabet.Length ||
     577                    plaintext[i] < 0 ||
     578                    plaintext[i + 1] < 0 ||
     579                    plaintext[i + 2] < 0 ||
     580                    plaintext[i + 3] < 0)
     581                {
     582                    continue;
     583                }
     584                value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2], plaintext[i + 3]];               
     585            }
    546586            return value / end;
    547587        }
     
    578618
    579619            for (int i = 0; i < end; i++)
    580                 value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2], plaintext[i + 3], plaintext[i + 4]];
    581 
     620            {
     621                if (plaintext[i] >= Alphabet.Length ||
     622                   plaintext[i + 1] >= Alphabet.Length ||
     623                   plaintext[i + 2] >= Alphabet.Length ||
     624                   plaintext[i + 3] >= Alphabet.Length ||
     625                   plaintext[i + 4] >= Alphabet.Length ||
     626                   plaintext[i] < 0 ||
     627                   plaintext[i + 1] < 0 ||
     628                   plaintext[i + 2] < 0 ||
     629                   plaintext[i + 3] < 0 ||
     630                   plaintext[i + 4] < 0)
     631                {
     632                    continue;
     633                }
     634                value += Frequencies[plaintext[i], plaintext[i + 1], plaintext[i + 2], plaintext[i + 3], plaintext[i + 4]];             
     635            }
    582636            return value / end;
    583637        }
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/AnalysisMonoalphabeticSubstitution.cs

    r8511 r8634  
    243243            if (this.ctAlphabet.Length > this.ptAlphabet.Length)
    244244            {
    245                 GuiLogMessage(String.Format(Resources.error_alphabet_length, ciphertextalphabet, ciphertextalphabet.Length, plaintextalphabet, plaintextalphabet.Length), NotificationLevel.Error);
    246                 inputOK = false;
     245                //if ciphertext alphabet is too long, we fallback to the plaintext alphabet
     246                GuiLogMessage(String.Format(Resources.error_alphabet_length, ciphertextalphabet, ciphertextalphabet.Length, plaintextalphabet, plaintextalphabet.Length), NotificationLevel.Warning);
     247                ctAlphabet = ptAlphabet;
    247248            }
    248249           
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/DictionaryAttacker.cs

    r8240 r8634  
    182182            foreach (Word w in this.words)
    183183            {
    184                 for (int i = 0; i < w.ByteValue.Length;i++ )
    185                 {
    186                     letter_frequencies[w.ByteValue[i]]++;
     184                for (int i = 0; i < w.ByteValue.Length; i++)
     185                {
     186                    if (w.ByteValue[i] < letter_frequencies.Length)
     187                    {
     188                        letter_frequencies[w.ByteValue[i]]++;
     189                    }
    187190                }
    188191            }
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/HillclimbingAttacker.cs

    r8244 r8634  
    233233
    234234            for (int i = 0; i < ciphertext.Length; i++)
    235                 plaintext[i] = key[ciphertext[i]];
     235            {
     236                if (ciphertext[i] < key.Length)
     237                {
     238                    plaintext[i] = key[ciphertext[i]];
     239                }
     240                else
     241                {
     242                    plaintext[i] = key[key.Length - 1];
     243                }
     244            }
    236245
    237246            return plaintext;
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/Properties/Resources.Designer.cs

    r8628 r8634  
    387387        /// <summary>
    388388        ///   Sucht eine lokalisierte Zeichenfolge, die The ciphertext alphabet contains more letters than the plaintext alphabet.
    389         ///Ciphertext alphabet: &quot;{0}&quot; ({1} letters)
    390         ///Plaintext alphabet: &quot;{2}&quot; ({3} letters) ähnelt.
     389        ///ciphertext alphabet: &quot;{0}&quot; ({1} letters)
     390        ///plaintext alphabet: &quot;{2}&quot; ({3} letters)
     391        ///Using plaintext alphabet now also as ciphertex alphabet. ähnelt.
    391392        /// </summary>
    392393        public static string error_alphabet_length {
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/Properties/Resources.de.resx

    r8627 r8634  
    286286    <value>Das Geheimtext-Alphabet enthält mehr Buchstaben als das Klartext-Alphabet.
    287287Geheimtext-Alphabet: "{0}" ({1} Buchstaben)
    288 Klartext-Alphabet: "{2}" ({3} Buchstaben)</value>
     288Klartext-Alphabet: "{2}" ({3} Buchstaben)
     289Benutze Klartext-Alphabet nun auch als Geheimtext-Alphabet.</value>
    289290  </data>
    290291  <data name="error_ciphertext" xml:space="preserve">
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/Properties/Resources.resx

    r8628 r8634  
    288288  <data name="error_alphabet_length" xml:space="preserve">
    289289    <value>The ciphertext alphabet contains more letters than the plaintext alphabet.
    290 Ciphertext alphabet: "{0}" ({1} letters)
    291 Plaintext alphabet: "{2}" ({3} letters)</value>
     290ciphertext alphabet: "{0}" ({1} letters)
     291plaintext alphabet: "{2}" ({3} letters)
     292Using plaintext alphabet now also as ciphertex alphabet.</value>
    292293  </data>
    293294  <data name="error_ciphertext" xml:space="preserve">
  • trunk/CrypPlugins/AnalysisMonoalphabeticSubstitution/Properties/Resources.ru.resx

    r8240 r8634  
    287287  </data>
    288288  <data name="error_alphabet_length" xml:space="preserve">
    289     <value>Алфавит зашифрованного текста содержит больше букв, чем алфавит plaintext. Зашифрованный алфавит: «{0}» ({1} буквы) Псевдосимвольный алфавит: «{2}» ({3} буквы)</value>
     289    <value>Алфавит зашифрованного текста содержит больше букв, чем алфавит plaintext. Зашифрованный алфавит: «{0}» ({1} буквы)
     290Псевдосимвольный алфавит: «{2}» ({3} буквы)
     291Используйте открытый текст в качестве зашифрованного текста.</value>
    290292  </data>
    291293  <data name="error_ciphertext" xml:space="preserve">
Note: See TracChangeset for help on using the changeset viewer.