2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C++ (точнее c-sharp)
Сообщение14.12.2013, 06:01 


22/05/13
43
Здравствуйте, подскажите, что нужно исправить в коде программы, чтобы программа считывала значения не с памяти,а с экрана (т.е. когда я задаю зашифрованное сообщение (без исходного документа), то выскакивает ошибка.
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using System.Numerics;
  11. namespace RSA
  12. {
  13.    public partial class MainForm : Form
  14.     {
  15.         public long P, Q, D, E, M, N = 0;
  16.         string Source, fn = "";
  17.         public long[] cipherText;
  18.         public struct Key
  19.         {
  20.             public long index;
  21.             public long N;
  22.             public Key(long lIndex, long lN)
  23.             {
  24.                 index = lIndex;
  25.                 N = lN;
  26.             }
  27.         }
  28.         public static long[] Encode(string sMessage, Key oKey)
  29.         {
  30.             long[] numericMessage = new long[sMessage.Length];
  31.             int length = sMessage.Length;
  32.             for (int i = 0; i < length; i++)
  33.             {
  34.                 numericMessage[i] = (long)sMessage[i];
  35.             }
  36.  
  37.             return Process(numericMessage, oKey);
  38.         }
  39.  
  40.               public static string Decode(long[] numericMessage, Key oKey)
  41.         {
  42.             long[] processedMessage = Process(numericMessage, oKey);
  43.  
  44.             StringBuilder message = new StringBuilder();
  45.  
  46.             int length = processedMessage.Length;
  47.             for (int i = 0; i < length; i++)
  48.             {
  49.                 message.Append((char)processedMessage[i]);
  50.             }
  51.            
  52.             return message.ToString();
  53.                }
  54.         public static long ModularExponantiation(long num, Key oKey)
  55.         {
  56.             long C = 1;
  57.             long E = 0;
  58.  
  59.             while (E++ < oKey.index)
  60.             {
  61.                 C = (C * num) % oKey.N;
  62.             }
  63.  
  64.             return C;
  65.         }
  66. public static long[] Process(long[] src_text, Key oKey)
  67.         {
  68.             long[] ciphertext = new long[src_text.Length];
  69.             int length = src_text.Length;
  70.             for (int i = 0; i < length; i++)
  71.             {
  72.                 ciphertext[i] = ModularExponantiation(src_text[i], oKey);
  73.             }
  74.  
  75.             return ciphertext;
  76.         }        
  77.         public MainForm()
  78.         {
  79.             InitializeComponent();
  80.             label1.Visible = false;
  81.             #region FileDialog Settings
  82.             openFileDialog1.DefaultExt = "txt";
  83.             openFileDialog1.Filter = "Текстовые документы|*.txt";
  84.             openFileDialog1.Title = "Открыть документ";
  85.             openFileDialog1.Multiselect = false;
  86.             #endregion
  87.         }
  88.         private void OpenDocument()                                        // Функция открытия документа
  89.         {
  90.             openFileDialog1.FileName = string.Empty;
  91.                        if (openFileDialog1.ShowDialog() == DialogResult.OK)
  92.             {
  93.                 fn = openFileDialog1.FileName;
  94.  
  95.                 Encoding enc = Encoding.GetEncoding(1251);
  96.                 try
  97.                 {
  98.                     // Чтение файла
  99.                     StreamReader sr = new StreamReader(fn, enc); //Открывает поток для чтения файла
  100.                     SourceTextBox.Text = sr.ReadToEnd(); // Считываем документ до конца
  101.                     SourceTextBox.SelectionStart = SourceTextBox.TextLength;
  102.                     sr.Close(); // Закрываем поток
  103.                 }
  104.                 catch (Exception exc) // Отлавливаем ошибку
  105.                 {
  106.                     MessageBox.Show("Ошибка чтения файла.\n"
  107.                         + exc.ToString(), "Error!",
  108.                         MessageBoxButtons.OK,
  109.                         MessageBoxIcon.Error);
  110.                 }
  111.             }
  112.         }
  113.         private void button3_Click(object sender, EventArgs e)
  114.         {
  115.             OpenDocument();
  116.             TextBox1Length.Text = Convert.ToString(SourceTextBox.TextLength);
  117.         }          // Кнопка "Открыть Документ"
  118.         // Наибольший общий делитель
  119.         private static long gcd(long x, long y)
  120.         {
  121.             long g;
  122.             g = y;
  123.             while (x > 0) // Пока не равен 0
  124.             {
  125.                 g = x;
  126.                 x = y % x;
  127.                 y = g;
  128.             }
  129.             return g;
  130.         }
  131.         // Проверка на взаимопростоту
  132.         private static long MutuallySimple(long m)
  133.         {
  134.             Random rd = new Random(DateTime.Now.Millisecond);
  135.             int tmp_d;
  136.             long d = 0, check;
  137.             bool quit = false;
  138.             while (quit == false)
  139.             {
  140.                 tmp_d = rd.Next(2, 100);
  141.                 d = Convert.ToInt64(tmp_d);
  142.                 check = gcd(m, d);
  143.                 if (check == 1) // Если = 1 то простое число
  144.                 {
  145.                     quit = true;
  146.                 }
  147.             }
  148.             return d;
  149.         }
  150.         // Расширенный алгоритм Евклида
  151.         private static long ExtGCD(long x, long y)
  152.         {
  153.             long a, b, q, r, u1, u2;
  154.             long t;
  155.  
  156.             a = Convert.ToInt64(x);
  157.             b = Convert.ToInt64(y);
  158.             u1 = 1;
  159.             u2 = 0;
  160.             while (b != 0)
  161.             {
  162.                 q = a / b;
  163.                 r = a % b;
  164.                 a = b; b = r;
  165.                 t = u2;
  166.                 u2 = u1 - q * u2;
  167.                 u1 = t;
  168.             }
  169.             return u1;
  170.         }
  171.         private void ApplyPQButton_Click(object sender, EventArgs e)
  172.         {
  173.             if (PTextBox.Text.Length == 0 && QTextBox.Text.Length == 0 )
  174.             {
  175.                 MessageBox.Show("Введите значение P и Q!");          
  176.                 return;
  177.             } else if (PTextBox.Text.Length == 0)
  178.             {
  179.                 MessageBox.Show("Введите значение P!");
  180.                 return;
  181.             }
  182.             else if (QTextBox.Text.Length == 0)
  183.             {
  184.                 MessageBox.Show("Введите значение Q!");
  185.                 return;
  186.             }
  187.             P = Convert.ToUInt32(PTextBox.Text);
  188.             Q = Convert.ToUInt32(QTextBox.Text);
  189.             N = P * Q;
  190.             M = (P-1) * (Q-1);
  191.             D = MutuallySimple(M);
  192.             long tmp_E;
  193.            tmp_E = ExtGCD(D, M);
  194.             if (tmp_E <= 0)
  195.            {
  196.                 while (tmp_E < 0)
  197.               {
  198.                    D = MutuallySimple(M);
  199.                    tmp_E = ExtGCD(D, M);
  200.                }
  201.            }
  202.            E = Convert.ToInt64(tmp_E);
  203.  
  204.             p_label.Text = Convert.ToString(P);
  205.             q_label.Text = Convert.ToString(Q);
  206.             e_label.Text = Convert.ToString(E);
  207.             d_label.Text = Convert.ToString(D);
  208.             n_label.Text = Convert.ToString(N);
  209.             m_label.Text = Convert.ToString(M);
  210.         }
  211.         private void ClearButton_Click(object sender, EventArgs e)
  212.         {
  213.             p_label.Text = "0";
  214.             q_label.Text = "0";
  215.             n_label.Text = "0";
  216.             m_label.Text = "0";
  217.             d_label.Text = "0";
  218.             e_label.Text = "0";
  219.         }
  220.         private void CryptButton_Click(object sender, EventArgs e)
  221.         {
  222.             if (SourceTextBox.Text.Length == 0)
  223.             {
  224.                 MessageBox.Show("Нет текста для шифрации");
  225.                 return;
  226.             }
  227.   ResultTextBox.ResetText();
  228.             textBox1.ResetText();
  229.             Key publicKey = new Key(E, N);
  230.               Source = SourceTextBox.Text;
  231.             cipherText = Encode(Source, publicKey);
  232.             for (int i = 0; i < cipherText.Length - 1; i++)
  233.             {
  234.                 textBox1.Text += Convert.ToString(Convert.ToChar(cipherText[i]));
  235.                 ResultTextBox.Text += cipherText[i];
  236.                 ResultTextBox.Text += " ";
  237.             }
  238. TextBox2Length.Text = Convert.ToString(ResultTextBox.TextLength);
  239.  
  240.         }
  241.  
  242.         private void DecryptButton_Click(object sender, EventArgs e)
  243.         {
  244.             if (ResultTextBox.Text.Length == 0)
  245.             {
  246.                 MessageBox.Show("Нет текста для дешифрации");
  247.                 return;
  248.             }
  249.  
  250.             ResultTextBox.ResetText();
  251.            
  252.             Key privateKey = new Key(D, N);
  253.            
  254.             ResultTextBox.Text = Decode(cipherText, privateKey);
  255.             TextBox2Length.Text = Convert.ToString(ResultTextBox.TextLength);
  256.  
  257.             if (SourceTextBox.Text == ResultTextBox.Text)
  258.             {
  259.                 label1.Visible = true;
  260.                 label1.Text = "Дешифрование успешно!";
  261.                 label1.ForeColor = Color.Green;
  262.             }
  263.             else
  264.             {
  265.                 label1.Visible = true;
  266.                 label1.Text = "Дешифрование неудачно!";
  267.                 label1.ForeColor = Color.Red;
  268.             }
  269.         }
  270.  
  271.         private void SourceTextBox_TextChanged(object sender, EventArgs e)
  272.         {
  273.             TextBox1Length.Text = Convert.ToString(SourceTextBox.TextLength);
  274.         }
  275.  
  276.         private void MainForm_Load(object sender, EventArgs e)
  277.         {
  278.  
  279.         }
  280.  
  281.         private void label12_Click(object sender, EventArgs e)
  282.         {
  283.  
  284.         }
  285.  
  286.         private void n_label_Click(object sender, EventArgs e)
  287.         {
  288.  
  289.         }
  290.  
  291.         private void textBox1_TextChanged(object sender, EventArgs e)
  292.         {
  293.            
  294.         }
  295.  
  296.         private void d_label_Click(object sender, EventArgs e)
  297.         {
  298.  
  299.         }
  300.  
  301.         private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
  302.         {
  303.  
  304.         }
  305.  
  306.         private void textBox2_TextChanged(object sender, EventArgs e)
  307.         {
  308.  
  309.         }
  310.  
  311.         private void label13_Click(object sender, EventArgs e)
  312.         {
  313.  
  314.         }
  315.          
  316.     }
  317. }
  318.  
  319.  

 Профиль  
                  
 
 Re: C++
Сообщение14.12.2013, 07:51 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Это не C++

 Профиль  
                  
 
 Re: C++
Сообщение14.12.2013, 08:55 


22/05/13
43
точнее c-sharp

 Профиль  
                  
 
 Re: C++
Сообщение14.12.2013, 14:39 
Заслуженный участник


27/04/09
28128
___ALBA___, даже несмотря на всё остальное, пустые обработчики событий из конца кода вы могли бы и не копировать сюда. А ещё вы заставляете догадываться о том, какие замечательно названные компоненты чему соответствуют. Интересно узнать, насколько это снижает количество желающих разбираться?

-- Сб дек 14, 2013 17:58:22 --

___ALBA___ в сообщении #800565 писал(а):
то выскакивает ошибка
А какая ошибка-то?

 Профиль  
                  
 
 Posted automatically
Сообщение14.12.2013, 18:05 
Админ форума
Аватара пользователя


19/03/10
8952
 i  Тема перемещена из форума «Computer Science» в форум «Программирование»

 Профиль  
                  
 
 Re: C++ (точнее c-sharp)
Сообщение14.12.2013, 20:52 
Заслуженный участник


09/09/10
3729
Вот это вот: public long[] cipherText; из полей вашей MainForm выкиньте нафиг и передавайте в какие надо методы параметром.

(Оффтоп)

Encode? Decode? Ну ладно.

 Профиль  
                  
 
 Re: C++ (точнее c-sharp)
Сообщение15.12.2013, 01:03 


24/05/09

2054
Чё тут непонятного? Товарищ скачал что-то похожее по названию с интернета. Оно не работает или работает не совсем так, как надо ему. Если бы он написал это сам - он бы это и отладил, он бы понимал, что им написано и для чего - ему самому было бы проще отладить, чем кому-либо другому вникать в его код. А в случае каких-либо непоняток, он бы задал конкретный вопрос: вот здесь я написал так-то и так-то, я ожидаю такой-то результат, а получается не то, почему? На такие вопросы на любом програмистском форуме даются конкретные ответы.

Программы так не пишутся, чтобы написать (рэндомом что-ли?) сразу побольше строчек кода, а потом долго думать, чего это оно вдруг не работает...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group