Beispiel #1
0
        private void f3_buttonSetKeys_Click(object sender, EventArgs e)
        {
            f3_textP.Text = new string(f3_textP.Text.Where(t => char.IsDigit(t)).ToArray());
            f3_textQ.Text = new string(f3_textQ.Text.Where(t => char.IsDigit(t)).ToArray());
            f3_textG.Text = new string(f3_textG.Text.Where(t => char.IsDigit(t)).ToArray());

            BigInteger p = 0, q = 0, g = 0;

            if (f3_textP.TextLength > 0 && f3_textQ.TextLength > 0 && f3_textG.TextLength > 0 &&
                RabinMiller.IsPrime(p = BigInteger.Parse(f3_textP.Text), 10) &&
                RabinMiller.IsPrime(q = BigInteger.Parse(f3_textQ.Text), 10) &&
                ((g = BigInteger.Parse(f3_textG.Text)) >= 2) && g < p - 1 && NumberTheory.BinaryModPow(g, q, p) != 1)
            {
                DiffieHellman.Params.P = p;
                DiffieHellman.Params.Q = q;
                DiffieHellman.Params.G = g;

                f3_buttonSetKeys.Enabled       = false;
                f3_buttonClearKeys.Enabled     = true;
                f3_buttonNextPrime.Enabled     = false;
                f3_buttonNextGenerator.Enabled = false;

                f3_textQ.ReadOnly = true;
                f3_textG.ReadOnly = true;

                f3_button_SetSecretA.Enabled       = true;
                f3_button_GetRandomSecretA.Enabled = true;
                f3_textSecretA.ReadOnly            = false;
                f3_button_SetSecretB.Enabled       = true;
                f3_button_GetRandomSecretB.Enabled = true;
                f3_textSecretB.ReadOnly            = false;
            }
        }
Beispiel #2
0
 private void f4_textStepB3_TextChanged(object sender, EventArgs e)
 {
     f4_textStepB4.Text = "";
     if (f4_textStepB3.TextLength > 0)
     {
         BigInteger x3 = BigInteger.Parse(f4_textStepB3.Text);
         BigInteger p  = BigInteger.Parse(f4_textP.Text);
         BigInteger Db = BigInteger.Parse(f4_textDb.Text);
         //Шаг 4 шифрования
         BigInteger x4 = NumberTheory.BinaryModPow(x3, Db, p);
         f4_textStepB4.Text = Convert.ToString(x4);
     }
 }
Beispiel #3
0
 private void f5_RecievedCiphertext_TextChanged(object sender, EventArgs e)
 {
     if (f5_RecievedCiphertext.TextLength > 0)
     {
         //Расшифрование
         BigInteger r         = BigInteger.Parse(f5_textOpenA_inWindowB.Text); // Открытый ключ Алисы
         BigInteger CB        = BigInteger.Parse(f5_textSecretB.Text);         //Секретный ключ Боба
         BigInteger p         = BigInteger.Parse(f5_textP.Text);               //параметр системы
         BigInteger cipher    = BigInteger.Parse(f5_RecievedCiphertext.Text);  //шифртекст (e)
         BigInteger m         = (cipher * NumberTheory.BinaryModPow(r, ((p - 1) - CB), p)) % p;
         int        letterNum = (int)m;
         f5_textBox_MessageBob.Text += MyAlphabets.AllTypesTogether[letterNum];
     }
 }
Beispiel #4
0
 private void f4_textStepA2_TextChanged(object sender, EventArgs e)
 {
     f4_textStepA3.Text = "";
     f4_textStepB3.Text = "";
     if (f4_textStepA2.TextLength > 0)
     {
         BigInteger x2 = BigInteger.Parse(f4_textStepA2.Text);
         BigInteger p  = BigInteger.Parse(f4_textP.Text);
         BigInteger Da = BigInteger.Parse(f4_textDa.Text);
         //Шаг 3 шифрования
         BigInteger x3 = NumberTheory.BinaryModPow(x2, Da, p);
         f4_textStepA3.Text = Convert.ToString(x3);
         f4_textStepB3.Text = Convert.ToString(x3);
     }
 }
Beispiel #5
0
 private void f4_textStepB1_TextChanged(object sender, EventArgs e)
 {
     f4_textStepA2.Text = "";
     f4_textStepB2.Text = "";
     if (f4_textStepB1.TextLength > 0)
     {
         BigInteger x1 = BigInteger.Parse(f4_textStepB1.Text);
         BigInteger p  = BigInteger.Parse(f4_textP.Text);
         BigInteger Cb = BigInteger.Parse(f4_textCb.Text);
         //Шаг 2 шифрования
         BigInteger x2 = NumberTheory.BinaryModPow(x1, Cb, p);
         f4_textStepA2.Text = Convert.ToString(x2);
         f4_textStepB2.Text = Convert.ToString(x2);
     }
 }
Beispiel #6
0
 private void f4_textStepA0_TextChanged(object sender, EventArgs e)
 {
     f4_textStepA1.Text = "";
     f4_textStepB1.Text = "";
     if (f4_textStepA0.TextLength > 0)
     {
         BigInteger m  = BigInteger.Parse(f4_textStepA0.Text);
         BigInteger p  = BigInteger.Parse(f4_textP.Text);
         BigInteger Ca = BigInteger.Parse(f4_textCa.Text);
         //Шаг 1 шифрования
         BigInteger x1 = NumberTheory.BinaryModPow(m, Ca, p);
         f4_textStepA1.Text = Convert.ToString(x1);
         f4_textStepB1.Text = Convert.ToString(x1);
     }
 }
Beispiel #7
0
        private void f3_button_SetSecretB_Click(object sender, EventArgs e)
        {
            f3_textSecretB.Text = new string(f3_textSecretB.Text.Where(t => char.IsDigit(t)).ToArray());
            if (f3_textSecretB.TextLength > 0)
            {
                BigInteger Xb = BigInteger.Parse(f3_textSecretB.Text);

                f3_textOpenB.Text           = Convert.ToString(NumberTheory.BinaryModPow(DiffieHellman.Params.G, Xb, DiffieHellman.Params.P));
                f3_textOpenB_inWindowA.Text = f3_textOpenB.Text;

                if (f3_textOpenA_inWindowB.TextLength > 0)
                {
                    f3_textCommonSecret_inWindowB.Text =
                        Convert.ToString(NumberTheory.BinaryModPow(BigInteger.Parse(f3_textOpenA_inWindowB.Text), Xb, DiffieHellman.Params.P));
                    f3_textCommonSecret_inWindowA.Text = f3_textCommonSecret_inWindowB.Text;
                }
            }
        }
Beispiel #8
0
        private void f3_buttonNextGenerator_Click(object sender, EventArgs e)
        {
            f3_textP.Text = new string(f3_textP.Text.Where(t => char.IsDigit(t)).ToArray());
            f3_textQ.Text = new string(f3_textQ.Text.Where(t => char.IsDigit(t)).ToArray());
            f3_textG.Text = new string(f3_textG.Text.Where(t => char.IsDigit(t)).ToArray());

            BigInteger ParamP, ParamQ, ParamG = 0;

            if (f3_textP.TextLength > 0 && f3_textQ.TextLength > 0 && RabinMiller.IsPrime(ParamP = BigInteger.Parse(f3_textP.Text), 3) &&
                RabinMiller.IsPrime(ParamQ = BigInteger.Parse(f3_textQ.Text), 3))
            {
                RandomNumberGenerator rng = RandomNumberGenerator.Create();
                while (ParamG < 2 || ParamG >= ParamP - 1 || NumberTheory.BinaryModPow(ParamG, ParamQ, ParamP) == 1)
                {
                    ParamG = BigIntegerRandomUtils.RandomInRange(rng, 2, ParamP - 1);
                }
                f3_textG.Text = Convert.ToString(ParamG);
            }
        }
Beispiel #9
0
        private void f5_buttonSetKeys_Click(object sender, EventArgs e)
        {
            f5_textP.Text = new string(f5_textP.Text.Where(t => char.IsDigit(t)).ToArray());
            f5_textQ.Text = new string(f5_textQ.Text.Where(t => char.IsDigit(t)).ToArray());
            f5_textG.Text = new string(f5_textG.Text.Where(t => char.IsDigit(t)).ToArray());

            BigInteger p = 0, q = 0, g = 0;

            if (f5_textP.TextLength > 0 && f5_textQ.TextLength > 0 && f5_textG.TextLength > 0 &&
                RabinMiller.IsPrime(p = BigInteger.Parse(f5_textP.Text), 10) &&
                RabinMiller.IsPrime(q = BigInteger.Parse(f5_textQ.Text), 10) &&
                ((g = BigInteger.Parse(f5_textG.Text)) >= 2) && g < p - 1 && NumberTheory.BinaryModPow(g, q, p) != 1)
            {
                if (p > MyAlphabets.AllTypesTogether.Length)
                {
                    DiffieHellman.Params.P = p;
                    DiffieHellman.Params.Q = q;
                    DiffieHellman.Params.G = g;

                    f5_buttonSetKeys.Enabled       = false;
                    f5_buttonClearKeys.Enabled     = true;
                    f5_buttonNextPrime.Enabled     = false;
                    f5_buttonNextGenerator.Enabled = false;

                    f5_textQ.ReadOnly = true;
                    f5_textG.ReadOnly = true;

                    f5_button_SetSecretA.Enabled       = true;
                    f5_button_GetRandomSecretA.Enabled = true;
                    f5_textSecretA.ReadOnly            = false;
                    f5_button_SetSecretB.Enabled       = true;
                    f5_button_GetRandomSecretB.Enabled = true;
                    f5_textSecretB.ReadOnly            = false;
                }
                else
                {
                    MessageBox.Show("Пожалуйста, выберите значение P больше длины используемого алфавита (" + Convert.ToString(MyAlphabets.AllTypesTogether.Length) + " симв.)");
                }
            }
        }
Beispiel #10
0
        private void f5_buttonSendMes_Click(object sender, EventArgs e)
        {
            //Очистка строки от мусора
            string tmp = "";

            for (int i = 0; i < f5_textBox_MessageAlice.TextLength; i++)
            {
                if (MyAlphabets.AllTypesTogether.IndexOf(f5_textBox_MessageAlice.Text[i]) != -1)
                {
                    tmp += f5_textBox_MessageAlice.Text[i];
                }
            }
            f5_textBox_MessageAlice.Text = tmp;

            if (f5_textBox_MessageAlice.TextLength > 0)
            {
                //Шифрование
                BigInteger m      = MyAlphabets.AllTypesTogether.IndexOf(f5_textBox_MessageAlice.Text[0]); //Сообщение
                BigInteger k      = BigInteger.Parse(f5_textSecretA.Text);                                 // Секретный ключ Алисы
                BigInteger dB     = BigInteger.Parse(f5_textOpenB.Text);                                   //Открытый ключ Боба
                BigInteger p      = BigInteger.Parse(f5_textP.Text);                                       //параметр системы
                BigInteger cipher = (m * NumberTheory.BinaryModPow(dB, k, p)) % p;                         //шифртекст
                f5_RecievedCiphertext.Text = "";                                                           //очистка
                f5_RecievedCiphertext.Text = Convert.ToString(cipher);

                //Удаление зашифрованного символа из строки
                f5_textBox_MessageAlice.Text = f5_textBox_MessageAlice.Text.Substring(1);

                //Сброс ключей, обеспечивающий стойкость шифрования
                f5_textSecretA.Text = "";
                //f5_textSecretB.Text = "";
            }
            else
            {
                MessageBox.Show("Пожалуйста, введите сообщение", "Ошибка");
            }
        }
Beispiel #11
0
        private void f9_buttonCheckSign_Click(object sender, EventArgs e)
        {
            //Удаление недопустимых символов
            f9_textNRecieved.Text       = new string(f9_textNRecieved.Text.Where(t => char.IsDigit(t)).ToArray());
            f9_textOpenKeyRecieved.Text = new string(f9_textOpenKeyRecieved.Text.Where(t => char.IsDigit(t)).ToArray());
            f9_textBoxSignRecieved.Text = new string(f9_textBoxSignRecieved.Text.Where(t => char.IsDigit(t)).ToArray());

            //Считывание полученных параметров подписи
            BigInteger N = 0;

            if (f9_textNRecieved.TextLength > 0)
            {
                N = BigInteger.Parse(f9_textNRecieved.Text);
            }

            BigInteger OpenKey = 0;

            if (f9_textOpenKeyRecieved.TextLength > 0)
            {
                OpenKey = BigInteger.Parse(f9_textOpenKeyRecieved.Text);
            }

            BigInteger SignToCheck = 0;

            if (f9_textBoxSignRecieved.TextLength > 0)
            {
                SignToCheck = BigInteger.Parse(f9_textBoxSignRecieved.Text);
            }

            //Открываем документ и вычисляем его хэш-функцию в переменную fileHash
            string         fileHash = "";
            OpenFileDialog Load     = new OpenFileDialog();

            Load.InitialDirectory = "D:\\Учеба\\Крипта 2\\Labs\\Labs\\bin\\Debug\\TextFiles";
            Load.DefaultExt       = "txt";
            Load.FileName         = "in.txt";
            Load.Filter           = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            Load.FilterIndex      = 2;
            Load.RestoreDirectory = true;
            Load.Multiselect      = false;
            string sFileName;

            if (Load.ShowDialog() == DialogResult.OK)
            {
                sFileName = Load.FileName;
                byte[] file = File.ReadAllBytes(Load.FileName);

                //Вычисление хэш-строки
                if (f9_chooseHashFunRecieved.Text == "MD5")
                {
                    fileHash = HashFunctions.MD5.GetHashMD5(file);
                }
                if (f9_chooseHashFunRecieved.Text == "SHA-1")
                {
                    fileHash = HashFunctions.SHA1.GetHashSHA1(file);
                }
                if (f9_chooseHashFunRecieved.Text == "ГОСТ Р 34.11-2012 256 бит")
                {
                    fileHash = HashFunctions.GOST.GetHashGOST(file, 256);
                }
                if (f9_chooseHashFunRecieved.Text == "ГОСТ Р 34.11-2012 512 бит")
                {
                    fileHash = HashFunctions.GOST.GetHashGOST(file, 512);
                }
            }

            BigInteger y = new BigInteger(Encoding.Default.GetBytes(fileHash)); //Вычисляем хэш файла

            if (SignToCheck > 0 && OpenKey > 0 && N > 0)
            {
                BigInteger w = NumberTheory.BinaryModPow(SignToCheck, OpenKey, N);
                if (w == y % N)
                {
                    f9_textVerificationResult.Text = "Подпись верна";
                }
                else
                {
                    f9_textVerificationResult.Text = "Подпись неверна";
                }
            }
            else
            {
                f9_textVerificationResult.Text = "Подпись неверна";
            }
        }
Beispiel #12
0
        private void f9_buttonSign_Click(object sender, EventArgs e)
        {
            BigInteger P         = BigInteger.Parse(f9_textP.Text);
            BigInteger Q         = BigInteger.Parse(f9_textQ.Text);
            BigInteger N         = BigInteger.Parse(f9_textN.Text);
            BigInteger fi        = P * Q; // Функция Эйлера от N
            BigInteger SecretKey = BigInteger.Parse(f9_textSecretKey.Text);

            //Открываем документ и вычисляем его хэш-функцию в переменную fileHash
            string         fileHash = "";
            OpenFileDialog Load     = new OpenFileDialog();

            Load.InitialDirectory = "D:\\Учеба\\Крипта 2\\Labs\\Labs\\bin\\Debug\\TextFiles";
            Load.DefaultExt       = "txt";
            Load.FileName         = "in.txt";
            Load.Filter           = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            Load.FilterIndex      = 2;
            Load.RestoreDirectory = true;
            Load.Multiselect      = false;
            string sFileName;

            if (Load.ShowDialog() == DialogResult.OK)
            {
                sFileName = Load.FileName;
                byte[] file = File.ReadAllBytes(Load.FileName);

                //Вычисление хэш-строки
                if (f9_chooseHashFun.Text == "MD5")
                {
                    fileHash = HashFunctions.MD5.GetHashMD5(file);
                }
                if (f9_chooseHashFun.Text == "SHA-1")
                {
                    fileHash = HashFunctions.SHA1.GetHashSHA1(file);
                }
                if (f9_chooseHashFun.Text == "ГОСТ Р 34.11-2012 256 бит")
                {
                    fileHash = HashFunctions.GOST.GetHashGOST(file, 256);
                }
                if (f9_chooseHashFun.Text == "ГОСТ Р 34.11-2012 512 бит")
                {
                    fileHash = HashFunctions.GOST.GetHashGOST(file, 512);
                }
            }

            BigInteger y    = new BigInteger(Encoding.Default.GetBytes(fileHash));
            BigInteger Sign = NumberTheory.BinaryModPow(y, SecretKey, N);

            if (Sign > 0)
            {
                if (y > N)
                {
                    MessageBox.Show(("Подпись небезопасна: используйте значение N, большее h(m) = " + Convert.ToString(y)), "Предупреждение");
                }
                f9_textBoxSign.Text = Convert.ToString(Sign);
            }
            else
            {
                f9_textBoxSign.Text = "";
            }
        }