Страница 1 из 1

Шифрование RSA

Добавлено: 02 апр 2011, 23:21
assis2007
Добрый день. Задача: даётся файл со словом. Нужно создать программу которая имитирует передачу и в конце проверяет свёртку. Мой пример на котором проверял p=7 q=13 h0=3 слово: incidence.
Проблема в том что в итоге не совпадают свёртка и хеш-код после "шифрации"

Код: Выделить всё

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;


namespace Пивк2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult dr = openFileDialog1.ShowDialog();
            if (dr == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }

            System.IO.StreamReader inStream =  new System.IO.StreamReader(@textBox1.Text);
            string s = inStream.ReadLine();
            textBox2.Text = s;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;
            string s1, s2, s3;
            int p;
            int q;
            int h0;
            s1 = textBox3.Text;
            p = Convert.ToInt32(s1);
            s2 = textBox4.Text;
            q = Convert.ToInt32(s2);
            s3 = textBox5.Text;
            h0 = Convert.ToInt32(s3);
            //textBox6.Text = h0.ToString();
            int n;
            n = p * q;
            int nzv;
            int d = 1;
            nzv = (p - 1) * (q - 1);
            
            while ((nzv%d)==0)
            {
                d = d + 1;
            }
            int ee=1;
            while (((ee * d) % nzv) != 1)
            {
                ee = ee + 1;
            }
            //открытый ключ ее и n
            //закрытый ключ d и n
            int[] m = new int[15];
            int f=0;
            string s = textBox2.Text;
            string alfavit = "1abcdefghijklmnopqrstuvwxyz";
            for (int i = 0; i < s.Length; i++)
            {
                for (int j = 1; j < alfavit.Length; j++)
                {
                    if (s[i] == alfavit[j])
                    {
                        //f = f + 1;
                        m[f] = j;
                        f = f + 1;
                    }
                }
            }
            //f = f - 1;
            //шифруем используя открытый ключ. открытый ключ ее и n
            int[] c1 = new int[15];
            int h1=h0;
            int wq=0;
            for (int i=0;i<f;i++)
            {
                wq = (m[i] + h1) * (m[i] + h1);
                c1[i] = wq % n;
                h1 = c1[i];
            }
            //всё правильно до этого момента
            int ecp=0;
            //textBox15.Text = Convert.ToString(h1);
            int h11=h1;
            for (int i = 1; i < d; i++)
            {
                h11 = h11 * h1;
            }
            //textBox16.Text = Convert.ToString(h11);
            ecp = h11 % n;
            //textBox17.Text = Convert.ToString(ecp);
            s1 = s;
            textBox6.Text = s1;
            s1 = Convert.ToString(ecp);
            textBox7.Text = s1;
            s1 = Convert.ToString(ee);
            textBox8.Text = s1;
            s1 = Convert.ToString(n);
            textBox9.Text = s1;
            s1 = Convert.ToString(h0);
            textBox10.Text = s1;
            //проверка аутентичности
            long m2=0;
            long er=ecp;
            for (int i = 1; i <ee; i++)
            {
                er = er * ecp;
            }
            textBox18.Text = Convert.ToString(er);
            m2 = er % n;
            textBox19.Text = Convert.ToString(m2);//проверено
            int h3=h0;
            int[] c3 = new int[15];
            int az=0;
            for (int i = 0; i < f; i++)
            {
                az = (m[i] + h3) * (m[i] + h3);
                c3[i] = az % n;
                h3 = c3[i];
            }
            textBox16.Text = Convert.ToString(m2);
            int m3 = h3;
            int m21 = Convert.ToInt32(m2);
            textBox17.Text = Convert.ToString(m21);
            textBox12.Text = Convert.ToString(m21);
            textBox13.Text = Convert.ToString(m3);
            if (m21 == m3)
            {
                textBox11.Text = "Сообщение полученное пользователем является аутентичным";
            }
            else
            {
                textBox11.Text = "Сообщение полученное пользователем не является аутентичным";
            }
             
        }
      
    }
}

Re: Шифрование RSA

Добавлено: 03 апр 2011, 13:08
assis2007
Я нашёл проблему. При возведении в степень

Код: Выделить всё

for (int i = 1; i <ee; i++)
            {
                er = er * ecp;
            }
В моих проверочных данных получается 23 в степени 29. Отображает по этому не правильно. Как мне получить результат возведения в степень если потом это число мне нужно нужно поделить и найти остаток?
программа выдаёт 1604965763471131959
а стандартный калькулятор 3091058643093537522799545838540043339063
как видно число получается намного больше. Какие могут быть варианты подсчёта?

Re: Шифрование RSA

Добавлено: 04 апр 2011, 23:42
assis2007
нашёл тип BigInteger. Думаю его должно хватить. Добавляю ссылку в .Net System.Numerics. далее пишу

Код: Выделить всё

BigInteger a = new BigInteger(123.99);
но выдаёт ошибку "Не удалось найти имя типа или пространства имен "BigInteger" (пропущена директива using или ссылка на сборку?"
Что не так?

Re: Шифрование RSA

Добавлено: 04 апр 2011, 23:50
assis2007
Всё сделал)) через using