Changeset 1852


Ignore:
Timestamp:
Aug 21, 2010, 1:01:41 AM (11 years ago)
Author:
Sven Rech
Message:

added index-calculus to discrete logarithm plugin (do not try it yet, because it doesn't seem to work efficient at the moment).

Location:
trunk/CrypPlugins/DiscreteLogarithm
Files:
3 edited

Legend:

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

    r1850 r1852  
    126126            }
    127127
     128            switch (settings.Algorithm)
     129            {
     130                case 0:
     131                    Enumeration();
     132                    break;
     133                case 1:
     134                    IndexCalculus();
     135                    break;
     136            }
     137        }
     138
     139        private void IndexCalculus()
     140        {
     141            IndexCalculusMethod ic = new IndexCalculusMethod();
     142            try
     143            {
     144                BigInteger res = ic.DiscreteLog(inputValue, inputBase, inputMod);
     145                OutputLogarithm = res;
     146            }
     147            catch (Exception ex)
     148            {
     149                GuiLogMessage("Index-Calculus error: " + ex.Message, NotificationLevel.Error);
     150            }
     151        }
     152
     153        private void Enumeration()
     154        {
    128155            BigInteger t = inputBase;
    129156            BigInteger counter = 1;
     
    137164            else
    138165                GuiLogMessage("Input base not a generator of given residue class", NotificationLevel.Error);
    139         }//end Execute
     166        }
    140167
    141168        /// <summary>
  • trunk/CrypPlugins/DiscreteLogarithm/DiscreteLogarithmSettings.cs

    r1785 r1852  
    3333
    3434        private bool hasChanges = false;
     35        private int algorithm;
    3536
    3637        #endregion
     
    5152        }       
    5253
    53         /*
    5454        /// <summary>
    55         /// Getter/Setter for the action (encryption or decryption)
     55        /// Getter/Setter for the algorithm
    5656        /// </summary>
    57         [ContextMenu("Action", "Do you want the input data to be encrypted or decrypted?", 1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 1, 2 }, "Encryption", "Decryption")]
    58         [TaskPane("Action", "Do you want the input data to be encrypted or decrypted?", null, 1, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Encryption", "Decryption" })]
    59         public int Action
     57        [ContextMenu("Algorithm", "Which algorithm do you want to use?", 1, DisplayLevel.Beginner, ContextMenuControlType.ComboBox, new int[] { 1, 2 }, "Enumeration", "Index-Calculus")]
     58        [TaskPane("Algorithm", "Which algorithm do you want to use?", null, 1, false, DisplayLevel.Beginner, ControlType.ComboBox, new string[] { "Enumeration", "Index-Calculus" })]
     59        public int Algorithm
    6060        {
    61             get { return this.action; }
     61            get { return this.algorithm; }
    6262            set
    6363            {
    64                 action = value;
    65                 OnPropertyChanged("Action");
     64                algorithm = value;
     65                OnPropertyChanged("Algorithm");
    6666            }
    6767        }
    68          */
    6968
    7069        /// <summary>
  • trunk/CrypPlugins/DiscreteLogarithm/IndexCalculusMethod.cs

    r1851 r1852  
    2727                while (linearSystem.NeedMoreEquations())
    2828                {
    29                     BigInteger[] coefficients = factorBase.Factorize(BigInteger.ModPow(logbase, r, mod));
     29                    BigInteger gr = BigInteger.ModPow(logbase, r, mod);
     30                    if (gr == 1)
     31                        throw new Exception("Input base not a generator of given residue class");
     32
     33                    BigInteger[] coefficients = factorBase.Factorize(gr);
    3034                    if (coefficients != null)
    3135                        linearSystem.AddEquation(coefficients, r);
     
    3337                    r++;
    3438                    if (r > mod - 2)
    35                         throw new Exception("Not enough relations!");
     39                        throw new Exception("Index-Calculus step 1 Exception: Not enough relations!");
    3640                }
    3741
     
    3943            } while (logs == null);
    4044
    41             //TODO: Implement second part of algorithm
     45            //Second part: Find the discrete logarithm of n:
    4246
    43             return 0;
     47            r = 0;
     48            BigInteger[] factorization;
     49            do
     50            {
     51                r++;
     52                if (r > mod - 2)
     53                    throw new Exception("Index-Calculus step 2 Exception: Not factorizable!");
     54
     55                factorization = factorBase.Factorize(BigInteger.ModPow(logbase, r, mod) * n);               
     56            } while (factorization == null);
     57
     58            BigInteger result = -r;
     59            for (int i = 0; i < logs.Length; i++)
     60                result += (factorization[i] * logs[i]) % (mod-1);
     61
     62            result %= (mod - 1);
     63            while (result < 0)
     64                result += (mod - 1);
     65
     66            return result;
    4467        }
    4568
Note: See TracChangeset for help on using the changeset viewer.