示例#1
0
        static void AttackLastRound()
        {
            Encryption encryption = new Encryption();
            Analysis   analysis   = new Analysis();

            Console.WriteLine("Current keys: " + encryption.PrintKeys());

            //analysis the sbox
            List <Differential> diffList = analysis.CountDifferentialsSingleSBox();

            bool[] attackSBox = new bool[] { true };

            //Check the attack new
            CipherThreeDifferentialKeyRecoveryAttack keyRecoveryConfiguration = new CipherThreeDifferentialKeyRecoveryAttack();

            SearchPolicy   curSearchPolicy   = SearchPolicy.FirstBestCharacteristicDepthSearch;
            AbortingPolicy curAbortingPolicy = AbortingPolicy.Threshold;

            //attack round 3
            DifferentialAttackRoundConfiguration configRound3SBox1 = analysis.GenerateConfigurationAttack(3, attackSBox, curAbortingPolicy, curSearchPolicy, diffList, keyRecoveryConfiguration, encryption);
            DifferentialAttackRoundResult        resultRound3SBox1 = analysis.RecoverKeyInformation(keyRecoveryConfiguration, configRound3SBox1, encryption);

            keyRecoveryConfiguration.RoundConfigurations.Add(configRound3SBox1);
            keyRecoveryConfiguration.RoundResults.Add(resultRound3SBox1);

            //Result
            keyRecoveryConfiguration.Subkey3          = resultRound3SBox1.PossibleKey;
            keyRecoveryConfiguration.RecoveredSubkey3 = true;
            Console.WriteLine(keyRecoveryConfiguration.printRecoveredSubkeyBits());
        }
示例#2
0
        public DifferentialAttackRoundResult RecoverKeyInformation(DifferentialKeyRecoveryAttack attack,
                                                                   DifferentialAttackRoundConfiguration configuration, IEncryption encryption)
        {
            if (configuration.ActiveSBoxes == null)
            {
                throw new ArgumentException("activeSBoxes should contain at least one active SBox");
            }

            DifferentialAttackRoundResult roundResult = new DifferentialAttackRoundResult();

            //Generate border for the loop
            int loopBorder = CalculateLoopBorder(configuration.ActiveSBoxes);

            for (int i = 0; i < loopBorder; i++)
            //Parallel.For(0, loopBorder, i =>
            {
                int guessedKey = GenerateValue(configuration.ActiveSBoxes, i);

                KeyProbability curTry = new KeyProbability()
                {
                    Counter = 0, Key = guessedKey
                };

                foreach (var curPair in configuration.FilteredPairList)
                {
                    Pair encryptedPair = new Pair()
                    {
                        LeftMember = encryption.EncryptBlock(curPair.LeftMember), RightMember = encryption.EncryptBlock(curPair.RightMember)
                    };

                    //reverse round with the guessed key
                    int leftMemberSingleDecrypted  = ReverseSBoxBlock(encryptedPair.LeftMember ^ curTry.Key);
                    int rightMemberSingleDecrypted = ReverseSBoxBlock(encryptedPair.RightMember ^ curTry.Key);

                    int differentialToCompare = (leftMemberSingleDecrypted ^ rightMemberSingleDecrypted);

                    if (differentialToCompare == configuration.ExpectedDifference)
                    {
                        curTry.Counter++;
                    }
                }

                //synchronize access to resultList
                _semaphoreSlim.Wait();
                try
                {
                    roundResult.KeyCandidateProbabilities.Add(curTry);
                }
                finally
                {
                    _semaphoreSlim.Release();
                }
            }//);

            //sort by counter
            KeyProbability bestPossibleKey = new KeyProbability()
            {
                Counter = 0, Key = 0
            };

            foreach (var curKey in roundResult.KeyCandidateProbabilities)
            {
                if (curKey.Counter > bestPossibleKey.Counter)
                {
                    bestPossibleKey = curKey;
                }
            }

            roundResult.PossibleKey               = bestPossibleKey.Key;
            roundResult.Probability               = bestPossibleKey.Counter / (double)configuration.UnfilteredPairList.Count;
            roundResult.ExpectedProbability       = configuration.Probability;
            roundResult.KeyCandidateProbabilities = roundResult.KeyCandidateProbabilities.OrderByDescending(item => item.Counter).ToList();

#if DEBUG
            Console.WriteLine("Expected probability: {0:N4}" + " Expected count: " + (configuration.Probability * configuration.UnfilteredPairList.Count), configuration.Probability);
            foreach (var curKeyProbability in roundResult.KeyCandidateProbabilities)//.GetRange(0,3))
            {
                Console.WriteLine("Guessed key: " + curKeyProbability.Key + " Count: " + curKeyProbability.Counter + " Probability: {0:N4}", ((curKeyProbability.Counter / (double)configuration.UnfilteredPairList.Count)));
            }
#endif

            return(roundResult);
        }