示例#1
0
        public byte[] Decrypt(String str)
        {
            ArrayList resultSet = new ArrayList();

            BigInteger2[] message = splitMessage(Convert.FromBase64String(str), n, "decrypt");

            GC.Collect();
            for (int i = 0; i < message.Length; i++)
            {
                //message[i] = BigInteger2.NegateZeros(message[i]);
                BigInteger2 unitResult = BigIntegerExtensions.modPower(message[i], d, Mod);
                unitResult = BigInteger2.NegateZeros(unitResult);
                BigInteger2 result = new BigInteger2(unitResult.bitlength.Length - 3, 0);
                for (int x = 3, xj = 2; x < unitResult.bitlength.Length; x++, xj++)
                {
                    result.bitlength[xj] = unitResult.bitlength[x];
                }
                unitResult = result;
                resultSet.Add(unitResult);
                GC.Collect();
            }

            //Create Full BigInteger2 containing bits from resultSet BigIntegers

            int bitSize = 0;

            foreach (BigInteger2 b in resultSet)
            {
                bitSize += (b.bitlength.Length - 2);
            }
            //MessageBox.Show("Whole decrypted Text length: " + bitSize);
            BigInteger2 wholeMessage = new BigInteger2(bitSize, 0);

            //Fill wholeMessage
            int curIndex = 2;

            foreach (BigInteger2 b in resultSet)
            {
                for (int i = 2; i < b.bitlength.Length; i++, curIndex++)
                {
                    wholeMessage.bitlength[curIndex] = b.bitlength[i];
                }
            }
            byte[] res = DeInject(wholeMessage);
            GC.Collect();
            // MessageBox.Show("Decryption Completed!!!");
            return(res);
        }
示例#2
0
        public byte[] Encrypt(String str)
        {
            BigInteger2[] message = this.splitMessage(Encoding.UTF8.GetBytes(str), this.n - 1, "encrypt");
            mess = new BigInteger2[message.Length];
            mess = message;
            //MessageBox.Show("Message Length: " + message.Length);
            //return data;
            ArrayList resultSet = new ArrayList();

            GC.Collect();
            //Encrypt each Message and populate resultSet
            for (int i = 0; i < message.Length; i++)
            {
                BigInteger2 unitResult = BigIntegerExtensions.modPower(message[i], e, Mod);
                unitResult = BigInteger2.NegateZeros(unitResult);

                if (i == 0 && unitResult.bitlength.Length - 2 < n)
                {
                    //MessageBox.Show("Padding with 'a'");
                    int         ind = n + 4 - unitResult.bitlength.Length;
                    BigInteger2 tmp = new BigInteger2(n, 0);

                    for (int xi = ind, xj = 2; xj < unitResult.bitlength.Length; xi++, xj++)
                    {
                        tmp.bitlength[xi] = unitResult.bitlength[xj];
                    }
                    unitResult = tmp;
                    //PAD Left with byte 'a'
                    byte[]   pad    = ASCIIEncoding.ASCII.GetBytes("a");
                    BitArray padAry = new BitArray(pad);

                    //PAD left of unitResult with padAry
                    BigInteger2 padded = new BigInteger2(unitResult.bitlength.Length - 2 + padAry.Length, 0);
                    int         pi, pj;
                    for (pi = 2, pj = 0; pj < padAry.Length; pi++, pj++)
                    {
                        padded.bitlength[pi] = padAry[pj];
                    }

                    //Continue filling from unitResult
                    for (int indi = pi, indj = 2; indi < padded.bitlength.Length; indi++, indj++)
                    {
                        padded.bitlength[indi] = unitResult.bitlength[indj];
                    }
                    unitResult = padded;
                }
                if (i > 0 && unitResult.bitlength.Length - 2 < n)
                {
                    //MessageBox.Show("Padding with zeros");
                    //pad result's leftside with zeros
                    int         ind = n + 4 - unitResult.bitlength.Length;
                    BigInteger2 tmp = new BigInteger2(n, 0);
                    for (int xi = ind, xj = 2; xj < unitResult.bitlength.Length; xi++, xj++)
                    {
                        tmp.bitlength[xi] = unitResult.bitlength[xj];
                    }

                    unitResult = null;
                    unitResult = tmp;
                }

                GC.Collect();
                resultSet.Add(unitResult);
            }

            //Create Full BigInteger2 containing bits from resultSet BigIntegers

            int bitSize = 0;

            foreach (BigInteger2 b in resultSet)
            {
                bitSize += (b.bitlength.Length - 2);
            }

            BigInteger2 wholeMessage = new BigInteger2(bitSize, 0);

            //Fill wholeMessage
            int curIndex = 2;

            foreach (BigInteger2 b in resultSet)
            {
                for (int i = 2; i < b.bitlength.Length; i++, curIndex++)
                {
                    wholeMessage.bitlength[curIndex] = b.bitlength[i];
                }
            }

            byte[] result = BigInteger2.getKeyBytes(wholeMessage);
            GC.Collect();
            // MessageBox.Show("Encryption Completed!!!");
            return(result);
        }
示例#3
0
        //MillerRabinTest
        public static bool MillerRabinIsPrime(BigInteger2 numb)
        {
            //Use Rabin's Test suite a.modPower(d,numb)== 1 : then numb is prime else numb composite

            BigInteger2 n         = (BigInteger2)numb.Clone();
            BigInteger2 numbLess1 = n - BigInteger2.ONE();

            BigInteger2[] testSuite = new BigInteger2[3];

            //Fill testSuite with BigInteger2 values:
            //Including 5, 11, and 61

            testSuite[0]           = new BigInteger2(1, 0);
            testSuite[0].bitlength = BigInteger2.ConvertToBinary(61, 6);
            testSuite[1]           = new BigInteger2(1, 0);
            testSuite[1].bitlength = BigInteger2.ConvertToBinary(31, 6);
            testSuite[2]           = new BigInteger2(1, 0);
            testSuite[2].bitlength = BigInteger2.ConvertToBinary(11, 4);

            // Determine two.power(r) factor of q:
            // By: using q is least set bit referenced from zero
            int i = 0, j = 0;

            for (i = numbLess1.bitlength.Length - 1, j = 0; i >= 2; i--, j++)
            {
                if (numbLess1.bitlength[i])
                {
                    break;
                }
            }
            //Console.Out.WriteLine("j: {0}", j.ToString());
            //Form component two.power(r) = twoPowerR
            BigInteger2 twoPowerS = BigInteger2.TWO().power(j);

            //Calculate d:
            BigInteger2 d         = BigIntegerExtensions.DivideBy(numbLess1, twoPowerS)[0];

            //Use testSuite to eliminate Composites:
            bool isPrime = true;

            foreach (BigInteger2 integer in testSuite)
            {
                bool        prime  = false;
                BigInteger2 result = BigIntegerExtensions.modPower(integer, d, numb);
                if (result == BigInteger2.ONE())
                {
                    prime = true;
                    continue;
                }
                else
                {
                    for (i = 0; i < j; i++)
                    {
                        if ((numb - result) == BigInteger2.ONE())
                        {
                            prime = true;
                            break;
                        }
                        result = BigIntegerExtensions.modPower(result, BigInteger2.TWO(), numb);
                    }
                    if (prime)
                    {
                        continue;
                    }
                    else
                    {
                        isPrime = false;
                        break;
                    }
                }
            }
            return(isPrime);
        }