Esempio n. 1
0
        public void SignInitialize(int max, int powMin, int powMax)
        {
            Console.WriteLine("------------------------------------------------");
            max    = (int)Math.Pow(2, max);
            powMin = (int)Math.Pow(2, powMin);
            powMax = (int)Math.Pow(2, powMax);
            do
            {
                pSign = BigInt.PrimeGenerate(powMin, powMax);
                Console.WriteLine("P Sign: " + pSign.toString());
                qSign   = BigInt.PrimeGenerate(powMin, powMax);
                modSign = BigInt.multiply(pSign, qSign);
            }while ((BigInt.less(modSign, new BigInt(max.ToString()))) || (BigInt.equal(pSign, qSign)));

            Console.WriteLine("P Sign: " + pSign.toString());
            Console.WriteLine("Q Sign: " + qSign.toString());
            Console.WriteLine("mod Sign: " + modSign.toString());

            ASign = Karmichael(pSign, qSign);
            Console.WriteLine("A Sign: " + ASign.toString());
            do
            {
                do
                {
                    eSign = BigInt.PrimeGenerate(0, Int32.Parse(ASign.toString()));
                }while ((BigInt.mod(ASign, eSign)).isZero());
                BigInt temp;
                BigInt.ExtendedGCD(ASign, eSign, out temp, out dSign);
            }while (BigInt.less(dSign, new BigInt("0")));
            Console.WriteLine("E Sign: " + eSign.toString());
            Console.WriteLine("D Sign: " + dSign.toString());
            Console.WriteLine("------------------------------------------------");
        }
Esempio n. 2
0
        public RSA(int max, int powMin, int powMax)
        {
            SignInitialize(max, powMin, powMax);
            max    = (int)Math.Pow(2, max);
            powMin = (int)Math.Pow(2, powMin);
            powMax = (int)Math.Pow(2, powMax);
            do
            {
                p   = BigInt.PrimeGenerate(powMin, powMax);
                q   = BigInt.PrimeGenerate(powMin, powMax);
                mod = BigInt.multiply(p, q);
            }while ((BigInt.less(mod, new BigInt(max.ToString()))) || (BigInt.equal(p, q)));

            Console.WriteLine("P: " + p.toString());
            Console.WriteLine("Q: " + q.toString());
            Console.WriteLine("mod: " + mod.toString());

            A = Karmichael(p, q);
            Console.WriteLine("A: " + A.toString());
            do
            {
                do
                {
                    e = BigInt.PrimeGenerate(0, Int32.Parse(A.toString()));
                }while ((BigInt.mod(A, e)).isZero());
                BigInt temp;
                BigInt.ExtendedGCD(A, e, out temp, out d);
            }while (BigInt.less(d, new BigInt("0")));
            Console.WriteLine("E: " + e.toString());
            Console.WriteLine("D: " + d.toString());
        }
Esempio n. 3
0
        public BigInt ChineseTheorem(BigInt r1, BigInt r2, BigInt mod1, BigInt mod2)
        {
            // Console.WriteLine("r1:" + r1.toString());
            BigInt M   = BigInt.multiply(mod1, mod2);
            BigInt m1  = BigInt.divide(M, mod1);
            BigInt m2  = BigInt.divide(M, mod2);
            BigInt y1  = new BigInt("1");
            BigInt y2  = new BigInt("1");
            BigInt one = new BigInt("1");

            for (BigInt i = one; BigInt.less(i, mod1); i = BigInt.add(i, one))
            {
                if (BigInt.equal(BigInt.multiplyByMod(m1, i, mod1), one))
                {
                    y1 = i; break;
                }
            }

            for (BigInt i = one; BigInt.less(i, mod2); i = BigInt.add(i, one))
            {
                if (BigInt.equal(BigInt.multiplyByMod(m2, i, mod2), one))
                {
                    y2 = i; break;
                }
            }

            return(BigInt.mod(BigInt.add(BigInt.multiply(m1, BigInt.multiply(r1, y1)), BigInt.multiply(m2, BigInt.multiply(r2, y2))), mod));
        }
Esempio n. 4
0
        public string Decryption()
        {
            Console.WriteLine("Alice recieves the numbers and starting to work with it.");
            Console.WriteLine("Decrypted Word's Codes:");
            List <BigInt> wordNumbers = new List <BigInt>();
            BigInt        one         = new BigInt("1");

            for (int i = 0; i < word.Length; i++)
            {
                //wordNumbers.Add(BigInt.powByMod(wordNumbersEncrypted[i], d, mod));
                wordNumbers.Add(ChineseTheorem(BigInt.mod(BigInt.pow(wordNumbersEncrypted[i], BigInt.mod(d, BigInt.subtract(p, one))), p), BigInt.mod(BigInt.pow(wordNumbersEncrypted[i], BigInt.mod(d, BigInt.subtract(q, one))), q), p, q));

                //Console.Write("Chinese: " + ChineseTheorem(BigInt.mod(BigInt.pow(wordNumbersEncrypted[i], BigInt.mod(d, BigInt.subtract(p, one))), p), BigInt.mod(BigInt.pow(wordNumbersEncrypted[i], BigInt.mod(d, BigInt.subtract(q, one))), q), p, q).toString());
                Console.Write(wordNumbers[i].toString() + " ");
            }
            Console.WriteLine();
            string decryptedWord = "";

            for (int i = 0; i < word.Length; i++)
            {
                decryptedWord += (char)Int32.Parse(wordNumbers[i].toString());
            }
            Console.WriteLine("Decrypted Word: " + decryptedWord);
            Console.WriteLine("Sign: " + BigInt.powByMod(SignEncrypted, eSign, modSign).toString());
            Console.WriteLine("Hash: " + BigInt.mod(Hash(word, modSign), modSign).toString());
            Console.WriteLine("------------------------------------------------");
            return(decryptedWord);
        }
Esempio n. 5
0
        public static string ToEight(this BigInt x)
        {
            BigInt num  = new BigInt(x.toString());
            BigInt zero = new BigInt("0");
            BigInt two  = new BigInt("8");
            string res  = "";
            BigInt temp;

            while (num.toString() != "0")
            {
                temp = BigInt.mod(num, two);
                num  = BigInt.subtract(num, temp);
                num  = BigInt.divide(num, two);
                res += temp.toString();
            }
            return(new string(res.ToCharArray().Reverse().ToArray()));
        }
Esempio n. 6
0
        public static string ToBiase64(this BigInt x)
        {
            BigInt num  = new BigInt(x.toString());
            BigInt zero = new BigInt("0");
            BigInt two  = new BigInt("64");
            string res  = "";
            BigInt temp;

            while (num.toString() != "0")
            {
                temp = BigInt.mod(num, two);
                num  = BigInt.subtract(num, temp);
                num  = BigInt.divide(num, two);
                res += base64Table[Int32.Parse(temp.toString())];
            }
            return(new string(res.ToCharArray().Reverse().ToArray()));
        }