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()); }
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); }