Главная страница
Навигация по странице:

  • «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» Институт КибернетикиКафедра Оптимизации систем управленияШифр RSA

  • Рис.1. Внешний вид клиент-приложения

  • Листинг класса RSA

  • Составьте программное обеспечение, реализующее алгоритм rsa. Исходные данные должны передаваться через файлы файл с открытым ключом, закрытым ключом и шифруемая информация


    Скачать 87.95 Kb.
    НазваниеСоставьте программное обеспечение, реализующее алгоритм rsa. Исходные данные должны передаваться через файлы файл с открытым ключом, закрытым ключом и шифруемая информация
    Дата26.03.2021
    Размер87.95 Kb.
    Формат файлаdoc
    Имя файла701170.doc
    ТипОтчет
    #188419

    МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ



    Федеральное государственное бюджетное образовательное учреждение
    высшего профессионального образования

    «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ

    ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
    Институт Кибернетики

    Кафедра Оптимизации систем управления

    Шифр RSA

    Отчёт по лабораторной работе №5
    по дисциплине " Информационная безопасность и защита информации в сетях ЭВМ"

    Вариант 3


    Выполнил:

    студент гр. 8ВМ23 ____________ М.А. Грицина

    (подпись)

    ____________

    (дата)
    Проверил:

    ассистент ____________ Ф.А. Тузовский
    (подпись)

    ____________

    (дата)

    Томск – 2012

    Задание

    Составьте программное обеспечение, реализующее алгоритм RSA. Исходные данные должны передаваться через файлы: файл с открытым ключом, закрытым ключом и шифруемая информация. Для созданного программного обеспечения проведите тестирование не менее чем на 10 различных наборах данных.

    Теория

    RSA относится к так называемым асимметричным алгоритмам, у которых ключ шифрования не совпадает с ключом дешифровки. Один из ключей доступен всем и называется открытым ключом, другой хранится только у его хозяина и неизвестен никому другому. С помощью одного ключа можно производить операции только в одну сторону. Если сообщение зашифровано с помощью одного ключа, то расшифровать его можно только с помощью другого. Имея один из ключей невозможно (очень сложно) найти другой ключ, если разрядность ключа высока.

    Алгоритм RSA состоит из следующих пунктов:

    • Выбрать простые числа p и q

    • Вычислить n = p * q

    • Вычислить m = (p - 1) * (q - 1)

    • Выбрать число d взаимно простое с m

    • Выбрать число e так, чтобы e * d = 1 (mod m)

    Числа e и d являются ключами RSA. Шифруемые данные необходимо разбить на блоки - числа от 0 до n - 1. Шифрование и дешифровка данных производятся следующим образом:

    Шифрование: b = (mod n)

    Дешифровка: a = (mod n)

    Следует также отметить, что ключи e и d равноправны, т.е. сообщение можно шифровать как ключом e, так и ключом d, при этом расшифровка должна быть произведена с помощью другого ключа.

    Ход работы

    Алгоритм реализован в виде клиент-серверного приложения (рис. 1 и 2). Сервер-приложение генерирует открытый и закрытый ключ. Клиент получает открытый ключ, с помощью которого зашифровывает исходное сообщение и передает шифрограмму на сервер. Сервер, используя свой секретный ключ, расшифровывает сообщение от клиента.

    Передача информации осуществляется при помощи сокетов.



    Рис.1. Внешний вид клиент-приложения



    Рис.2. Внешний вид сервер-приложения

    Листинг класса RSA

    using System;

    namespace Lab5Client

    {

        public class RSA

        {

            private readonly Random _rnd;

            public long P { get; private set; }

            public long Q { get; private set; }

            public long N { get; set; }

            public long FN { get; private set; }

            public long D { get; private set; }

            public long E { get; set; }

            public RSA()

            {

                _rnd = new Random();

            }

            public void generatePQ()

            {

                P = Prime32();

                Q = Prime32();

                N = P * Q;

                FN = (P - 1) * (Q - 1);

            }

            public void generateED()

            {

                Int64 x, y;

                D = _rnd.Next(100000);

                while (gcd(D, FN, out x, out y) != 1)

                {

                    D = _rnd.Next(100000);

                }

                E = (x % FN + FN) % FN;

            }

            public string Encryption(string text)

            {

                int i;

                var buffer = new Int64[text.Length];

                string text2 = "";

                for (i = 0; i < text.Length; i++)

                {

                    buffer[i] = powmod(Convert.ToInt32(text[i]), E, N);

                    text2 += buffer[i];

                    text2 += ' ';

                }

                return text2;

            }

            public string Decryption(string text)

            {

                int i;

                string[] words = text.Split(' ');

                string text2 = "";

                for (i = 0; i < words.Length - 1; i++)

                {

                    char s = Convert.ToChar(powmod(Convert.ToInt32(words[i]), D, N));

                    text2 += s;

                }

                return text2;

            }

            public Int64 gcd(Int64 a, Int64 b, out Int64 x, out Int64 y)

            {

                if (a == 0)

                {

                    x = 0;

                    y = 1;

                    return b;

                }

                Int64 x1, y1;

                Int64 d = gcd(b % a, a, out x1, out y1);

                x = y1 - (b / a) * x1;

                y = x1;

                return d;

            }

            public Int64 Prime32()

            {

                var pr = (Int64)_rnd.Next(100, 1000) * 2 + 1;

                var isprime = false;

                while (!isprime)

                {

                    isprime = true;

                    var ub = (Int64)Math.Sqrt(pr);

                    int i;

                    for (i = 3; i <= ub; i += 2)

                    {

                        if ((pr % i) == 0)

                        {

                            isprime = false;

                            break;

                        }

                    }

                    if (!isprime)

                    {

                        pr += 2;

                    }

                }

                return pr;

            }

            public Int64 powmod(int a1, Int64 b, Int64 p)

            {

                Int64 res = 1;

                Int64 a = a1;

                while (b > 0)

                    if (b % 2 == 1)

                    {

                        res = (res * a) % p;

                        --b;

                    }

                    else

                    {

                        a = (a * a) % p;

                        b >>= 1;

                    }

                return res % p;

            }

        }

    }
    Выводы: в ходе проделанной работы был изучен алгоритм RSA и реализован в виде клиент-серверного приложения. В учебных целях производилась работа с небольшими числами (32 разряда), однако в качестве надежной системы шифрования можно рассматривать только RSA-ключи длиной 1024 бита и более.



    написать администратору сайта