2014 dxdy logo

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

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




 
 C++ (точнее c-sharp)
Сообщение14.12.2013, 06:01 
Здравствуйте, подскажите, что нужно исправить в коде программы, чтобы программа считывала значения не с памяти,а с экрана (т.е. когда я задаю зашифрованное сообщение (без исходного документа), то выскакивает ошибка.
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Аватара пользователя
Это не C++

 
 
 
 Re: C++
Сообщение14.12.2013, 08:55 
точнее c-sharp

 
 
 
 Re: C++
Сообщение14.12.2013, 14:39 
___ALBA___, даже несмотря на всё остальное, пустые обработчики событий из конца кода вы могли бы и не копировать сюда. А ещё вы заставляете догадываться о том, какие замечательно названные компоненты чему соответствуют. Интересно узнать, насколько это снижает количество желающих разбираться?

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

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

 
 
 
 Posted automatically
Сообщение14.12.2013, 18:05 
Аватара пользователя
 i  Тема перемещена из форума «Computer Science» в форум «Программирование»

 
 
 
 Re: C++ (точнее c-sharp)
Сообщение14.12.2013, 20:52 
Вот это вот: public long[] cipherText; из полей вашей MainForm выкиньте нафиг и передавайте в какие надо методы параметром.

(Оффтоп)

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

 
 
 
 Re: C++ (точнее c-sharp)
Сообщение15.12.2013, 01:03 
Чё тут непонятного? Товарищ скачал что-то похожее по названию с интернета. Оно не работает или работает не совсем так, как надо ему. Если бы он написал это сам - он бы это и отладил, он бы понимал, что им написано и для чего - ему самому было бы проще отладить, чем кому-либо другому вникать в его код. А в случае каких-либо непоняток, он бы задал конкретный вопрос: вот здесь я написал так-то и так-то, я ожидаю такой-то результат, а получается не то, почему? На такие вопросы на любом програмистском форуме даются конкретные ответы.

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

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group