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; } }
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); } }
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]; } }
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); } }
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); } }
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); } }
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; } } }
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); } }
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) + " симв.)"); } } }
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("Пожалуйста, введите сообщение", "Ошибка"); } }
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 = "Подпись неверна"; } }
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 = ""; } }