Дешифрування системи RSA

 

УДК 51

 

 

МІНІСТЕРСТВО  ОСВІТИ І НАУКИ УКРАЇНИ

 

 

 

 

 

Дешифрування системи RSA

 

 

Пояснювальна  записка до курсової роботи (проекту)

 

з дисципліни «Дискретна математика»

назва дисципліни

 

 

 

 

Виконав студент гр._________________

______________ (№ групи)             (П.І.Б.)

       (підпис, дата)

 

Керівник  ___________________________

                               (науковий ступінь, вчене звання)

___________________________________

       (підпис, дата)                                        (П.І.Б.)

Нормоконтролер ____________________

                               (науковий ступінь, вчене звання)

___________________________________

       (підпис, дата)                                        (П.І.Б.)

 

 

 

 

 

 

 

 

 

 

2007

Содержание

Содержание 2

Введение 3

1 Техническое задание 5

2 Алгоритм шифрования RSA 6

2.1 Описание RSA 6

2.2 Нахождение простых чисел 6

2.3 Нахождение взаимно простых чисел 7

2.4 Решение уравнения Диофанта 8

2.5 Большие числа и работа с ними 8

2.5.1 Хранение больших чисел, алгебраическое сложение, умножение 9

2.5.2 Алгоритм быстрого возведения в степень 9

2.5.3 BigInteger 10

3 Средства взлома 11

3.1 Алгоритм взлома основанный на факторинге 12

4 Руководство пользователя 13

Выводы 16

Список использованной литературы 17

Приложение А (листинг основных модулей) 18

Приложение Б (диск с программой и документацией) 31

 

 

Введение

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

В настоящее время проблемами шифрования и дешифрования занимается наука криптология, состоящая из двух ветвей: криптографии и криптоанализа. Соответственно, криптография – это наука о способах преобразования (шифрования) информации с целью ее защиты от незаконных пользователей, а криптоанализ – наука о методах и способах вскрытия шифров (и ее практическое применение).

Фактически, криптоанализ представляет собой набор математических методов  вскрытия алгоритмов шифрования. Здесь  явно прослеживается то же эволюционное противодействие, что и в случае брони и снаряда: появляются все более стойкие (без потери в других важных характеристиках – например, в быстродействии) алгоритмы шифрования, в ответ на которые изобретаются все более совершенные методы их взлома.

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

В данной работе рассмотрим алгоритмы шифрования и дешифрования системы RSA и проведём её криптоанализ.

  1. Техническое задание

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

  1. Алгоритм шифрования RSA

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

    1. Описание RSA

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

    1. Выбрать простые числа и .
    2. Вычислить .
    3. Вычислить .
    4. Выбрать число взаимно простое с .
    5. Выбрать число так, чтобы .

Числа и являются ключами. Шифруемые данные необходимо разбить на блоки – числа от до . Шифрование и дешифровка данных производятся следующим образом:

    • шифрование: ;
    • дешифровка: .

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

    1. Нахождение  простых чисел

В первом пункте алгоритма RSA сказано, что необходимо выбрать  два простых числа  и . Как это сделать, если числа имеют большую разрядность? Простой способ – деление предполагаемого простого числа на все числа меньшие его не работоспособен уже с 32-битными числами (требуется очень много времени на выполнение).

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

    1. Выписать подряд все целые числа от двух до .
    2. Пусть переменная изначально равна двум – первому простому числу.
    3. Вычеркнуть из списка все числа от до , делящиеся на (то есть, числа , , , …)
    4. Найти первое, не вычеркнутое число, большее чем , и присвоить значению переменной это число.
    5. Повторять шаги 3 и 4 до тех пор, пока не станет больше, чем
    6. Все не вычеркнутые числа в списке – простые числа.

На практике, алгоритм можно  немного улучшить следующим образом. На шаге 3, числа можно вычеркивать, начиная сразу с числа , потому что все составные числа меньше его уже будут вычеркнуты к этому времени. И, соответственно, останавливать алгоритм можно, когда станет больше, чем .

Так же для выработки простых чисел используют вероятностные методы, один из которых будет здесь представлен. Вероятностные методы не дают полной гарантии, что найденное число простое, но при достаточно небольшом количестве операций позволяют получить очень высокую вероятность этого.

Алгоритм поиска простых  чисел:

    1. – нечетное число. Найти и , удовлетворяющие уравнению: .
    2. Случайным образом выбрать число , .
    3. Если делится на , перейти к пункту 6.
    4. Если условие выполняется, перейти к пункту 2.
    5. Если найдется такое , , что , перейти к пункту 2.
    6. Число – составное: выбрать другое нечетное число , перейти к пункту 1.

Если для какого-либо числа  проверено чисел , то математически доказанная вероятность того, что число является составным, будет приблизительно равна . Следовательно, для числа , состоящего из бит, целесообразно проверить различных значений . Если во время этого не обнаружится, что – число составное, то вероятно число является простым.

Число не может превышать количества бит в числе. Числа и находятся при помощи двоичного сдвига числа , пока младший разряд не станет . В результате – количество сдвигов, – число после сдвига.

    1. Нахождение  взаимно простых чисел

На шаге 4 алгоритма RSA необходимо найти число взаимно простое с . Число должно быть меньше , т. о. разрядность числа равна сумме бит в числах и . Для нахождения взаимно простых чисел используется алгоритм Евклида, который находит наибольший общий делитель двух чисел. Если найденный делитель больше единицы, то необходимо выбрать другое число и повторить проверку.

Алгоритм Евклида:

    1. Исходные числа и .
    2. Вычислить – остаток от деления на : .
    3. Если , то – искомое число (наибольший общий делитель), конец.
    4. Заменить пару чисел парой , перейти к пункту 2.

При вычислении наибольшего  общего делителя с помощью алгоритма  Евклида будет выполнено не более  операций деления с остатком, где есть количество цифр в десятичной записи меньшего из чисел и . На практике алгоритм работает очень быстро.

    1. Решение уравнения Диофанта

В 5-м пункте алгоритма RSA предполагается нахождение такого числа , чтобы . Для этого нужно использовать модифицированный алгоритм Евклида, который работает только в том случае, если числа и взаимно просты. Вычисление числа сводится к решению уравнения в натуральных числах. Число не существенно.

Алгоритм решения уравнения :

    1. Необходимо определить матрицу .
    2. Вычислить – остаток от деления на : .
    3. Если , то второй столбец матрицы дает решение , конец.
    4. .
    5. Заменить пару чисел , парой , перейти к пункту 2.

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

    1. Большие числа  и работа с ними

На данный момент времени  рекомендуется в качестве чисел  и брать числа, длиной не менее бит. Чтобы подобрать ключ такой длины потребуется $1000000 и примерно год времени. Ключ в бит является достаточно надежным для обычных целей шифрования. Для повышенной безопасности рекомендуется брать ключи размером бит. Т. о. числа и должны иметь разрядность вдвое ниже чисел , , и ( и рекомендуется брать примерно одного порядка, но не слишком близко друг к другу).

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

      1. Хранение  больших чисел, алгебраическое сложение, умножение

Числа лучше всего хранить в массиве 2-х байтовых переменных. Об отрицательных числах можно забыть: использоваться не будут, т. к. их всегда можно заменить на обратные. Переменные в 2 байта удобны при умножении при работе с языками высокого уровня: результат будет 4-х байтовым и потом его можно разделить на две части для дальнейшей обработки.

Умножение производится с  помощью обычного алгоритма умножения "в столбик". Есть также и  более эффективные алгоритмы  умножения, но у них существует понятие "обменной точки" – необходимой длины числа для того, чтобы алгоритм начал выигрывать по скорости в сравнении с простым алгоритмом. Обычный алгоритм работает вполне нормально. Для ускорения работы лучше использовать более быстрый алгоритм, но и более сложный в реализации.

Сложение и вычитание  также производятся "в столбик".

      1. Алгоритм  быстрого возведения в степень

В алгоритме RSA много возведений в степень по модулю натурального числа. Остаток от деления берется после каждого умножения. Таким образом, при перемножении двух чисел, состоящих из бит, потребуется -битное число, которое затем делится на модуль и получается остаток, опять же состоящий из бит (если модульное число состоит из бит).

Сложность этого алгоритма  может быть оценена как , где – модуль, по которому производится умножение. Запись означает, что для реализации алгоритма потребуется порядка операций. Например, если число имеет разрядность бит (при этом длина не менее бит), то умножение по модулю необходимо будет провести порядка раз, что относительно немного.

Алгоритм вычисления :

    1. Число представить в двоичной системе счисления: , где – цифры в двоичном представлении, равные или ,
    2. Положить , затем для вычислить
    3. есть искомое число
      1. BigInteger

Для работы с большими числами можно также воспользоваться специальными библиотеками или типами данных. Например, тип BigInteger библиотеки .Net Framwork 4.

Тип BigInteger является постоянным типом, который представляет сколь  угодно большое целое число, значение которого теоретически не имеет верхнего или нижнего предела. Элементы типа BigInteger близки к элементам других целочисленных типов. Этот тип отличается от других целочисленных типов в .NET Framework, диапазон которых указывается их свойствами MinValue и MaxValue.

Экземпляр BigInteger можно использовать точно так же, как и любой  другой целочисленный тип. BigInteger перегружает  стандартные числовые операторы  для выполнения основных математических операций, таких как сложение, вычитание, деление, умножение, вычитания, отрицание  и унарное отрицание. Можно также  использовать стандартные числовые операторы для сравнения двух значений BigInteger друг с другом. Как  и другие типы целого числа, BigInteger поддерживает битовые операторы And, Or, XOr, сдвиг  влево и сдвиг вправо. Для языков, не поддерживающих пользовательские операторы, структура BigInteger также предоставляет  эквивалентные методы для выполнения математических операций. Это относится  к методам Add, Divide, Multiply, Negate, Subtract и  некоторым другим.

Многие члены структуры BigInteger напрямую соответствуют членам других целых типов. Кроме того, BigInteger добавляет такие элементы как:

    • Sign, который возвращает значение, указывающее знак значения BigInteger.
    • Abs, который возвращает абсолютное значение значения BigInteger.
    • DivRem, который возвращает частное и остаток от операции деления.
    • GreatestCommonDivisor, который возвращает наибольший общий делитель для двух значений BigInteger.
    • ModPow, который выполняет модульное деление числа, возведенного в степень другого числа.
  1. Средства  взлома

Если не принимать во внимание абсолютно стойкий шифр, массового  применения которого пользователями компьютерных сетей не произойдет никогда, то ко всем остальным шифрам можно применить следующее высказывание "отца кибернетики" Норберта Винера: "Любой шифр может быть вскрыт, если только в этом есть настоятельная необходимость, и если информация, которую предполагается получить, стоит затраченных средств, усилий и времени…".

В доказательство истинности этого высказывания можно привести задачу, предложенную создателями RSA для  всех желающих попробовать свои силы во взломе их шифра. В конце августа 1999 года компания RSA Data Security оповестила о вскрытии 512-битового открытого ключа. Во взломе принимали участие 292 компьютера на протяжении чуть больше пяти месяцев; кроме того, 9 недель ушло на предварительные расчеты. В связи со вскрытием 512-битового ключа RSA Data Security рекомендует пользователям использовать более надежные 768-битовые или даже 1028-битовые ключи.

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

Другой способ взломать RSA состоит в том, чтобы найти  метод вычисления корня степени  из . Поскольку , то корнем степени из является сообщение . Вычислив корень, можно вскрыть зашифрованные сообщения и подделывать подписи, даже не зная частный ключ. Такая атака не эквивалентна факторингу, но в настоящее время неизвестны методы, которые позволяют взломать RSA таким образом. Однако в особых случаях, когда на основе одного и того же показателя относительно небольшой величины шифруется достаточно много связанных сообщений, есть возможность вскрыть сообщения. Упомянутые атаки – единственные способы расшифровать все сообщения, зашифрованные данным ключом RSA.

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

Самое простое нападение  на отдельное сообщение – атака по предполагаемому открытому тексту. Нападающий, имея зашифрованный текст, предполагает, что сообщение содержит какой-то определенный текст (например, “Ирина – Анне”), затем шифрует предполагаемый текст открытым ключом получателя и сравнивает полученный текст с имеющимся зашифрованным текстом. Такую атаку можно предотвратить, добавив в конец сообщения несколько случайных битов. Другая атака на единственное сообщение применяется в том случае, если отправитель посылает одно и то же сообщение трем корреспондентам, каждый из которых использует общий показатель . Зная это, нападающий может перехватить эти сообщения и расшифровать сообщение .

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

    1. Алгоритм взлома основанный на факторинге

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

    1. Даны общая часть ключа – и открытая часть ключа – .
    2. С помощью решета Эратосфена найти список простых чисел в диапазоне от нуля до .
    3. Для каждого простого числа из списка выполнить шаг 3.
    4. Если остаток от деления общей части ключа на равен нулю, то и следует перейти к шагу 4.
    5. Вычислить .
    6. C помощью открытой части ключа и числа находим секретную часть (решаем уравнение Диофанта).
    7. – секретная часть ключа.
  1. Руководство пользователя

При запуске программы  на экране появится следующая форма:

Рисунок 4.1 – Начальный вид программы

Имеется главное меню. В текстовое окно выводится содержимое исходного файла или расшифрованный текст.

Пункт меню «Файл» содержит подпункты:

    • Новый. Очищает текстовое окно.
    • Открыть. Позволяет открыть текстовый файл.
    • Сохранить. Сохраняет содержимое текстового окна в файл.
    • Выход. Осуществляет выход из программы.

Пункт меню «Преобразовать»  содержит подпункты:

    • Кодировать. Позволяет ввести открытый ключ и зашифровать текст.
    • Декодировать. Позволяет ввести секретную часть ключа и дешифровать текст.

Пункт меню «Сервис» содержит подпункты:

    • Взломать ключ. Позволяет ввести открытый ключ и получить его секретную часть.

Для того чтобы взломать ключ, необходимо выбрать пункт меню «Сервис à Взломать ключ». На экране, справа, появляется форма:

Рисунок 4.2 – Взлом ключа

В текстовые окна вводятся значения открытого ключа – числа  и соответственно. После нажатия кнопки «Взломать» в текстовом окне появится информация о секретной части ключа.

Для того чтобы дешифровать  закодированный по методу RSA исходный текст, необходимо в пункте меню «Преобразовать»  выбрать подпункт «Декодировать». В поля, которые появятся на форме ввести общую часть и полученную секретную часть, после чего нажать кнопку «Декодировать».

Рисунок 4.3 – Декодирование сообщения

Программа расшифрует файл, и выведет результат на экран.

Рисунок 4.4 – Результат взлома системы RSA

Выводы

В данной работе была досконально  изучена ассиметричная система шифрования/дешифрования RSA. Выявлены её основные достоинства и недостатки. На основании полученных данных были рассмотрены способы взлома данной системы.

Существует несколько  способов взлома RSA. Наиболее эффективная  атака – найти секретный ключ, соответствующий необходимому открытому  ключу. Это позволит нападающему  читать все сообщения, зашифрованные  открытым ключом, и подделывать подписи. Такую атаку можно провести, найдя  главные сомножители (факторы) общего модуля . Другой способ взломать RSA состоит в том, чтобы найти метод вычисления корня степени из . Вычислив корень, можно вскрыть зашифрованные сообщения и подделывать подписи, даже не зная частный ключ. Самое простое нападение на отдельное сообщение – атака по предполагаемому открытому тексту. Нападающий, имея зашифрованный текст, предполагает, что сообщение содержит какой-то определенный текст, затем шифрует предполагаемый текст открытым ключом получателя и сравнивает полученный текст с имеющимся зашифрованным текстом.

Самым распространённым способом взлома криптосистемы RSA с открытым ключом является метод факторинга открытого ключа. Т. е. разложение большого целого числа на простые сомножители.

В работе описаны алгоритмы, необходимые для реализации взлома системы с помощью факторинга. На основании алгоритмов разработан программный продукт, показывающий возможность взлома системы шифрования/дешифрования RSA. Проанализировав полученные результаты можно сказать, что данная система является недостаточно криптостойкой на малых числах. Но используя достаточно большие значения открытого и закрытого ключей, сложность взлома данной системы резко возрастает и время получения секретной части ключа по открытой части на данный момент является невероятно большим. Это подтверждает то, что система RSA на данный момент является криптостойкой, а её использование оправданное.

Список  использованной литературы

    1. Дискретная математика. Применение ЭВМ при выполнении лабораторных работ/ Ю. К. Чернышёв, М. Л. Угрюмов, В. А. Халтурин, О. В. Яровая. – Учеб. Пособие. – Харьков: Нац. аэрокосм. ун-т «Харьк. авиац. ин-т», 2004. – 61 с.
    2. http://algolist.manual.ru/defence/well_known/rsa.php
    3. http://ru.wikipedia.org/wiki/RSA
    4. http://www.cio-world.ru/it-market/community/291719/page2.html
    5. http://www.cyberguru.ru/algorithms/cryptography/rsa-page4.html
    6. http://www.intuit.ru/department/security/mathcryptet/14/5.html
    7. http://www.smartlogon.ru/Technologies/cripto/art2

Приложение  А (листинг основных модулей)

Код интерфейса программы:

<Window x:Class="CodingWPF.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Кодирование/декодирование RSA" Height="Auto" Width="Auto">

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="Auto" />

            <RowDefinition/>

            <RowDefinition Height="Auto" />

        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>

            <ColumnDefinition/>

            <ColumnDefinition Width="Auto"/>

            <ColumnDefinition Width="Auto"/>

        </Grid.ColumnDefinitions>

        <Menu Grid.Row="0" Grid.ColumnSpan="3">

            <MenuItem Header="Файл">

                <MenuItem Header="Новый" Click="New_Click"/>

                <Separator/>

                <MenuItem Header="Открыть..." Click="Open_Click"/>

                <MenuItem Header="Сохранить..." Click="Save_Click"/>

                <Separator/>

                <MenuItem Header="Выход" Click="Exit_Click"/>

            </MenuItem>

            <MenuItem Header="Преобразовать">

                <MenuItem Header="Кодировать..." Click="CodingShow_Click"/>

                <MenuItem Header="Декодировать..." Click="DecodingShow_Click"/>

            </MenuItem>

            <MenuItem Header="Сервис">

                <MenuItem Header="Получить ключ..." IsCheckable="True" Click="FindKeys_Click"/>

                <MenuItem Header="Взломать ключ..." IsCheckable="True" Click="CrackKeys_Click"/>

            </MenuItem>

        </Menu>

        <TextBox Name="text_box_code" TextWrapping="Wrap" Grid.Row="1" />

        <StackPanel Grid.Row="2">

            <TextBlock Name="text_block_n" Text="Введите общую часть ключа:" Visibility="Collapsed"/>

            <TextBox Name="text_box_n" Visibility="Collapsed"/>

            <TextBlock Name="text_block_e" Text="Введите открытую часть ключа:" Visibility="Collapsed"/>

            <TextBox Name="text_box_e" Visibility="Collapsed"/>

            <TextBlock Name="text_block_d" Text="Введите секретную часть ключа:" Visibility="Collapsed"/>

            <PasswordBox Name="text_box_d" Visibility="Collapsed"/>

            <Button Name="button_coding" Content="Кодировать"  Visibility="Collapsed" Click="Coding_Click"/>

            <Button Name="button_decoding" Content="Декодировать"  Visibility="Collapsed" Click="Decoding_Click"/>

        </StackPanel>

        <StackPanel Name="stack_panel_find_keys" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Visibility="Collapsed">

            <TextBlock Text="Простое число p:" Visibility="Collapsed"/>

            <Grid Visibility="Collapsed">

                <Grid.ColumnDefinitions>

                    <ColumnDefinition/>

                    <ColumnDefinition/>

Дешифрування системи RSA