private void CryptButton_Click(object sender, EventArgs e) { try { InputText.Text = InputText.Text.ToLower(); string alphabet = "abcdefghijklmnopqrstuvwxyz"; string binary_block = "", binary_block_last = "", binary_letter = "", binary_text = ""; int n = 0, F = 0, k = 0; int p = Convert.ToInt32(PTextBox.Text); int q = Convert.ToInt32(QTextBox.Text); int E = Convert.ToInt32(ETextBox.Text); OutputText.Clear(); n = p * q; F = (p - 1) * (q - 1); //Проверка p и q на простоту int a = 0, b = 0; for (int i = 1; i <= p; i++) { if (p % i == 0) { a++; } } for (int i = 1; i <= q; i++) { if (q % i == 0) { b++; } } if (q == p) { MessageBox.Show("p=q!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); QTextBox.Clear(); PTextBox.Clear(); } else { //проверка e int nod = 0; for (int i = 1; i <= F; i++) { if ((E % i == 0) && (F % i == 0)) { nod++; } } if (nod != 1) { MessageBox.Show("Введена некорректная экспонента зашифрования", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); ETextBox.Clear(); E = 0; } else { int n1 = n; // переведем n в двоичную, дабы определить необходимые размеры блоков while (n1 != 0) { binary_letter = binary_letter + Convert.ToString(n1 % 2); n1 = n1 / 2; } int length_of_block = binary_letter.Length - 1; /* Теперь заменяем каждую букву соответствующим элементом * кольца классов вычетов по модулю 26 и переводим получившееся число * в двоичную `систему счисления*/ for (int i = 0; i <= InputText.Text.Length - 1; i++) { if (alphabet.IndexOf(InputText.Text[i]) != -1) { //если символ - буква - работаем int j = alphabet.IndexOf(InputText.Text[k]) % 26; binary_letter = ""; // Погнали переводить в двоичную систему while (j != 0) { binary_letter = binary_letter + Convert.ToString(j % 2); j = j / 2; } /*предусматриваем случай, если длина битового слова < 5 * добавляем незначащие нули, пока длина не станет равна 5 */ while (binary_letter.Length < 5) { binary_letter = binary_letter + "0"; } //инициализировали бинарный текст binary_text = binary_text.Insert(0, binary_letter); k++; } // Иначе просто пропускаем символ else { k++; } } //самое время побить бинарный текст на блоки длиной length_of block for (int i = 0; i <= binary_text.Length - 1; i = i + length_of_block) { if (i + length_of_block <= binary_text.Length - 1) { double dec_block = 0, crypt_dec_block = 1; binary_block = binary_text.Substring(i, length_of_block); //сразу переводим блок в дек систему for (int l = 0; l <= binary_block.Length - 1; l++) { int arg = 2 * (Convert.ToInt32(binary_block[l]) - 48); if (arg != 0) { dec_block = dec_block + Math.Pow(arg, l); } } for (int h = 1; h <= E; h++) { crypt_dec_block = (crypt_dec_block * dec_block) % n; } OutputText.Text = " " + OutputText.Text.Insert(0, Convert.ToString(crypt_dec_block)); } else { // Последний блок binary_block_last = binary_text.Substring(i, binary_text.Length - i); double dec_block_last = 0, crypt_dec_block_last = 1; //сразу переводим блок в дек систему for (int l = 0; l <= binary_block_last.Length - 1; l++) { int arg = 2 * (Convert.ToInt32(binary_block_last[l]) - 48); if (arg != 0) { dec_block_last = dec_block_last + Math.Pow(arg, l); } } for (int h = 1; h <= E; h++) { crypt_dec_block_last = (crypt_dec_block_last * dec_block_last) % n; } OutputText.Text = OutputText.Text.Insert(0, Convert.ToString(crypt_dec_block_last)); } } } } } catch { MessageBox.Show("Ошибка!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void DButton_Click(object sender, EventArgs e) { try { int F = 0, d = 0, a = 0, b = 0; int p = Convert.ToInt32(PTextBox.Text); int q = Convert.ToInt32(QTextBox.Text); int E = Convert.ToInt32(ETextBox.Text); F = (p - 1) * (q - 1); //Проверка p и q на простоту for (int i = 1; i <= p; i++) { if (p % i == 0) { a++; } } for (int i = 1; i <= q; i++) { if (q % i == 0) { b++; } } if (p == q) { MessageBox.Show("Рассчитать экспоненту расшифрования невозможно. p=q!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); QTextBox.Clear(); PTextBox.Clear(); } else { if ((a != 2) || (b != 2)) { MessageBox.Show("Рассчитать экспоненту расшифрования невозможно. Может быть, введенные числа не простые", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); QTextBox.Clear(); PTextBox.Clear(); } else { //проверка e int nod = 0; for (int i = 1; i <= F; i++) { if ((E % i == 0) && (F % i == 0)) { nod++; } } if (nod != 1) { MessageBox.Show("Рассчитать экспоненту расшифрования невозможно. Введена некорректная экспонента зашифрования", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); ETextBox.Clear(); E = 0; } else { // задаем экспоненту расшифрования while (((E * d) % F) != 1) { d++; } DTextBox.Text = Convert.ToString(d); } } } } catch { MessageBox.Show("Ошибка!", "", MessageBoxButtons.OK, MessageBoxIcon.Error); } }