Форум программистов, компьютерный форум CyberForum.ru

Шифрование RSA - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Лес двоичных деревьев начинающихся с одной буквы http://www.cyberforum.ru/cpp-beginners/thread1196475.html
Всем привет! Помогите решить задачу: Создать частотный словарь текста, расположенного в файле (подсчитать число появлений каждого слова в файле, результаты вывести в алфавитном порядке). Использовать двоичное дерево. Используя построенное в дерево, построить лес, в котором каждое дерево состоит из слов, начинающихся с одной буквы. Буду признателен за любые наметки по данной теме)
C++ Выяснить сколько покупателей воспользовались скидкой. Помогите решить пожалуйста Покупатели продуктового магазина пользуются 10% скидкой, если покупка состоит из более чем 5 наименований товаров или суммарная стоимость покупки превышает K рублей. Составить ведомость, учитывающую скидки: покупатель, количество наименований купленных товаров, стоимость покупки, стоимость покупки с учетом скидки. Выяснить, сколько покупателей сделало покупки,... http://www.cyberforum.ru/cpp-beginners/thread1196466.html
C++ Вывод слов вектора
В книге есть такая задачка, заполнить вектор и вывести слова по 8 слов в строке Я как бы наковырял вот такое, но сам момент вывода по 8 слов в строке не в курю, я конечно понимаю что нужно пройтись циклом, но, но... #include <iostream> #include <string> #include <vector> #include <cctype> using std::cout; using std::cin;
Описать светофор при помощи конечного автомата C++
Светофор переключается автоматически, с определенным количеством тактов на каждый сигнал Опишите выбранный светофор с помощью конечного автомата.
C++ Машина Тьюринга http://www.cyberforum.ru/cpp-beginners/thread1196444.html
Дана последовательность символов двух видов a, b. Построить машину Тьюринга, которая заменяет символ a на символ c и подсчитывает число замен
C++ Оператор, принимающий левый операнд типа std::basic_istream Здравствуйте. Работаю с ооп, хочу избавиться от public-переменных и сделать геттеры и сеттеры. Однако в паре случаев получаю такую ошибку. Как избавиться? if (!input.eof()) { starExists = true; input>>theStar.getName()>>theStar.getPlace().x>>theStar.getPlace().y>>theStar.getRadius(); Planet inputPlanet; подробнее

Показать сообщение отдельно
SODJ
 Аватар для SODJ
0 / 0 / 0
Регистрация: 18.05.2014
Сообщений: 9
02.06.2014, 15:06     Шифрование RSA
Доброго всем времени суток. Делаю курсовую работу по криптографии - реализация алгоритма RSA. Вот написал уже целый код, который работает при небольших значениях (их брал с вики).
Использую такие данные: p=3557 q=2579 d=3 e=6111579 исходный_текст=111111, шифрованный текст получается 4051753, собственно и расшифровка происходит тоже верно.
А вот когда уже беру числа из задания исходный_текст=2006201801310518 p=85785751 q=63284773, то уже получается неверно. Пожалуйста, помогите разобраться, в чём у меня проблема.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h> 
#include <stdio.h>  
#include <time.h>
#include <math.h>
#include <locale.h>
#include <Windows.h>
 
using namespace System;
using namespace std;
 
long long p, q, n, m; 
long long rand_d, d, e, c;//c - для  вычисления целой части после деления
long long a, b, r;
long long E_matrix[2][2]={1,0,0,1}, B_matrix[2][2]={0,1,1,1}, C_matrix[2][2]; 
int i, j;
long long source_text=2006201801310518, shifro_text, deshifro_text;
 
int main(array<System::String ^> ^args)
{
    SetConsoleCP(1251);  //для работы русского языка + надо менять в консоли шрифт
    SetConsoleOutputCP(1251);
    p=85785751;//инициализация моих данных
    q=63284773;
    m=p*q;
    n=(p-1)*(q-1);
    cout<<"\nm="<<m<<", n="<<n;
    srand (time(NULL));
    while(1)
    {
    while (1) //бесконечный цикл. Если числа не взаимнопростые, то делаем новый рандом
    {
        rand_d=rand() %9000 +1000;
        cout<<"\nrand_d="<<rand_d;
        //Алгоритм Евклида
        a=n;
        b=rand_d;
        while (1) //бесконечный цикл
        {
            r=a%b;
            if (r==0)
                break;
            else
            {
                a=b;
                b=r;
            }
        }
        cout<<"\nr="<<r<<"\nb="<<b<<"\na="<<a;
        if (b>1)
            cout<<"\nЧисла не взаимно простые.";
        else
        {
            cout<<"\nЧисла взаимно простые.";
            break;
        }
    }
    d=rand_d;
    d=3553;//временная инициализация чтобы не гонять рандом
    cout<<"\nВыбраный ключ d="<<d;
    //модифицированный алгоритм Евклида для поиска ключа 'e'
    a=n;
    b=d;
    while (1)//бесконечный цикл
    {
        r=a%b;
        if (r==0)
            break;
        else
        {
            c=a/b;//целая часть от деления
            cout<<"\nq="<<c<<", r="<<r;//промежуточные значения для отладки
            B_matrix[1][1]=-c;//-q
            C_matrix[0][0]=E_matrix[0][0]*B_matrix[0][0]+E_matrix[0][1]*B_matrix[1][0];
            C_matrix[0][1]=E_matrix[0][0]*B_matrix[0][1]+E_matrix[0][1]*B_matrix[1][1];
            C_matrix[1][0]=E_matrix[1][0]*B_matrix[0][0]+E_matrix[1][1]*B_matrix[1][0];
            C_matrix[1][1]=E_matrix[1][0]*B_matrix[0][1]+E_matrix[1][1]*B_matrix[1][1];
            for (i=0;i<2;i++)
                for (j=0;j<2;j++)
                    E_matrix[i][j]=C_matrix[i][j];
            a=b;
            b=r;
        }
    }
    cout<<"\nX="<<E_matrix[0][1]<<", Y="<<E_matrix[1][1];
    if (E_matrix[1][1]<0)
        E_matrix[1][1]+=n;
    cout<<"\nX="<<E_matrix[0][1]<<", e="<<E_matrix[1][1];
    e=E_matrix[1][1];
    //проверка результатов
    cout<<"\n(e*d)%n="<<(e*d)%n;
    cout<<"\n(e*d)/n="<<(e*d)/n;
    if (((e*d)%n)==1)
        break;
    }
    _getch();
    //шифрование вариант с быстрым возведением в степень
    long long a,b;
    c=0;
    long long binary[100]; // для записи степени в двоичной форме
    a=d;
    for (i=0;a>0;i++)
    {
        binary[i]=a%2;
        //cout<<binary[i];
        a=(a-binary[i])/2;
        c++;
    }
    cout<<("\nrezultat =");
    for (i=0;i<c;i++)
        cout<<binary[i];
    long long itog=1,vozvodimoe_chislo=source_text, modul=m;
    for (i=c;i>-1;i--)
    {
        if (binary[i]==1)
        {
            itog=(((itog*itog)%modul)*vozvodimoe_chislo)%modul;
        }
        else
            itog=(itog*itog)%modul;
        if (itog<0)
        itog+=modul;
        cout<<"\nitog="<<itog;
    }
    shifro_text=itog;
    cout<<"\notvet="<<itog;
    cout<<"\nШифрованое сообщение (вариант 0): "<<shifro_text;
    
    //Дешифрование
    c=0;
    a=e;
    a=a%(modul-1);//сокращение степени
    cout<<"\na="<<a;
    for (i=0;a>0;i++)
    {
        binary[i]=a%2;
        a=(a-binary[i])/2;
        c++;
    }
    
    cout<<("\nrezultat =");
    for (i=0;i<c;i++)
        cout<<binary[i];
    itog=1;
    vozvodimoe_chislo=shifro_text; 
    for (i=c;i>-1;i--)
    {
        if (binary[i]==1)
        {
            itog=(((itog*itog)%modul)*vozvodimoe_chislo)%modul;
        }
        else
            itog=(itog*itog)%modul;
        if (itog<0)
        itog+=modul;
        cout<<"\nitog="<<itog;
    }
    deshifro_text=itog;
    cout<<"\notvet="<<itog;
    cout<<"\nДешифрованое сообщение (вариант 0): "<<deshifro_text;
        _getch();
    return 0;
}
Заранее благодарен за помощь! =)

Добавлено через 8 минут
Среда разработки VS 2012
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru