예제 #1
0
        private List <BigInteger> FractiontoContinuedFraction(BigFraction _fraction)
        {
            List <BigInteger>  _lstCF       = new List <BigInteger>();
            List <BigFraction> _lstFraction = new List <BigFraction>();
            BigInteger         _remainder;
            BigInteger         _qi;

            _qi = BigInteger.DivRem(_fraction.Numerator, _fraction.Denominator, out _remainder);
            _lstCF.Add(_qi);
            BigFraction _bfrac = new BigFraction(_remainder, _fraction.Denominator);

            _lstFraction.Add(_bfrac);
            int i = 0;

            while (true)
            {
                i++;
                _qi = BigInteger.DivRem(_lstFraction[i - 1].Denominator, _lstFraction[i - 1].Numerator, out _remainder);
                _lstCF.Add(_qi);
                _bfrac = new BigFraction(_remainder, _lstFraction[i - 1].Numerator);
                _lstFraction.Add(_bfrac);
                if (_remainder <= BigInteger.Zero)
                {
                    break;
                }
            }
            return(_lstCF);
        }
예제 #2
0
        private BigFraction ContinuedFractiontoFraction(List <BigInteger> _contfraction)
        {
            BigFraction       _bfraction      = new BigFraction();
            List <BigInteger> _lstNumerator   = new List <BigInteger>();
            List <BigInteger> _lstDenominator = new List <BigInteger>();
            int _iCount = _contfraction.Count;

            _lstNumerator.Add(_contfraction[0]);
            _lstDenominator.Add(1);
            if (_iCount > 1)
            {
                _lstNumerator.Add(_contfraction[0] * _contfraction[1] + 1);
                _lstDenominator.Add(_contfraction[1]);
                for (int i = 2; i < _iCount; i++)
                {
                    _lstNumerator.Add(_contfraction[i] * _lstNumerator[i - 1] + _lstNumerator[i - 2]);
                    _lstDenominator.Add(_contfraction[i] * _lstDenominator[i - 1] + _lstDenominator[i - 2]);
                }
            }
            _bfraction.Numerator   = _lstNumerator.Last();
            _bfraction.Denominator = _lstDenominator.Last();

            return(_bfraction);
        }
예제 #3
0
        public BigInteger WienerAlgorithm()
        {
            m_form.UpdateListbox("Calculating continued fraction from e/N");
            BigFraction _bfraction = new BigFraction(m_rsaKey.Public_exponent, m_rsaKey.Modulus);

            m_lstContinuedFraction = FractiontoContinuedFraction(_bfraction);
            List <BigInteger> tmp_lstContFraction = new List <BigInteger>();

            tmp_lstContFraction = m_lstContinuedFraction.Clone().ToList();
            int iCount = m_lstContinuedFraction.Count;

            m_form.UpdateListbox("Continued fraction from e/N is:");
            string _strContFraction = null;

            for (int i = 0; i < iCount; i++)
            {
                if (i == 0)
                {
                    _strContFraction = "< ";
                }
                _strContFraction += m_lstContinuedFraction[i];
                if (i == iCount - 1)
                {
                    _strContFraction += " >";
                }
                else
                {
                    _strContFraction += ", ";
                }
            }
            m_form.UpdateListbox(_strContFraction);

            for (int i = 0; i < iCount; i++)
            {
                BigFraction _bfrK_DG = new BigFraction();
                BigFraction _bfrEulerToitient;

                tmp_lstContFraction = m_lstContinuedFraction.Take(i + 1).ToList();

                if (0 == i % 2)
                {
                    tmp_lstContFraction[i] = tmp_lstContFraction[i] + 1;
                }

                _bfrK_DG          = ContinuedFractiontoFraction(tmp_lstContFraction);
                _bfrEulerToitient = new BigFraction(_bfrK_DG.Denominator * m_rsaKey.Public_exponent - 1, _bfrK_DG.Numerator);

                BigInteger _iEulerToitient = _bfrEulerToitient.Floor();

                var        result = SolveQuadraticEquation(1, -1 * (m_rsaKey.Modulus - _iEulerToitient + 1), m_rsaKey.Modulus);
                BigInteger _iG    = BigInteger.Remainder(_bfrEulerToitient.Numerator, _bfrEulerToitient.Denominator);


                if (result.Item1 * result.Item2 == m_rsaKey.Modulus)
                {
                    m_rsaKey.Private_exponent = _bfrK_DG.Denominator;
                    m_lstD.Add(m_rsaKey.Private_exponent);
                    if (m_rsaKey.TestKey())
                    {
                        return(m_rsaKey.Private_exponent);
                    }
                }
            }

            return(BigInteger.Zero);
        }