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

шифр RSA - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить значение м при помоши вспомогательных функций http://www.cyberforum.ru/cpp-beginners/thread872978.html
Очень надо, помогите, пожалуйста) Заданы три массива случайных действительных чисел определенной размерности A, B, C. Необходимо вычислить значение М. Задание массивов, вывод их на печать и вычисление вспомогательных выражений оформить в виде отдельных функций. Выводить на экран промежуточные значения. Размерность n*n M=sqrt(SA^2+SB^2+SC^2), где SA - Ʃa(ii), SB - Ʃb(ii), SC - Ʃc(ii)
C++ не компилируется код в VS 2010 есть такой код #include <windows.h> #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main(int argc, char *argv) { setlocale(LC_ALL,"Russian"); http://www.cyberforum.ru/cpp-beginners/thread872974.html
Ошибка при попытке добавить объект в Box2d C++
Добрый день. Столкнулся с не понятной ошибкой. Есть код #include <iostream> #include <GL/GLAux.h> #include <GL/glut.h> #pragma comment (lib, "opengl32.lib") #pragma comment (lib, "glut32.lib") #include <Box2D.h> #include <SDL.h>
C++ Найти все автоморфные числа на отрезке [m,n] (в С++)
Извините что вторгаюсь) помогите пожалуйста. Условие: Найти все автоморфные числа в отрезке . Автоморфными назавается целое число, которое равно последним числам своего квадрата. Например: 5^2=25, 6^2=36.
C++ Найти максимальное из чисел прямоугольной матрицы, которое встречается более 1 раза http://www.cyberforum.ru/cpp-beginners/thread872964.html
На вход функции подаётся прямоугольная матрица и её размерность.Найти максимальное из чисел матрицы, которое встречается более 1 раза.
C++ С++ класс (создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами)) Кто сможет помогите пожалуйста! (Класс Complex). Создайте класс с именем Complex для выполнения в арифмитических операий с комплексными числами. Напишите программу для тестирования вашего класса. Комплексные числа имеют вид: realPart + imaginaryPart * I, где I равно sqrt(-1) (под корнем -1) Используйте для представления закрытых данных класса переменные числа типа double. Определите... подробнее

Показать сообщение отдельно
Abbok
0 / 0 / 0
Регистрация: 21.05.2013
Сообщений: 2

шифр RSA - C++

21.05.2013, 14:57. Просмотров 1201. Ответов 7
Метки (Все метки)

Добрый день, люди добрые помогите )) не могу понять в чем ошибка...
сам алгоритм
Два больших простых числа P и Q
N=PQ
затем вычисляется функция эйлера fi=(P-1)(Q-1) и выбирается некоторое D (d<fi) взаимно простое с fi.
и по обобщенному алгоритму эвклида находится С, такое что c*d mod fi=1
Дальше шифрование. e=m^d mod n, где m- символ который шифруем
Расшифровка. m`=e^c mod n.
(алгоритм на вики)

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

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
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
long long gcd(long long a,long long b){
    return b?gcd(b,a%b):a;
}
 
long fastPwr(unsigned long a, unsigned  long n, unsigned p){
    int cnt;
    int i=0;
    double dbl=n;
    unsigned long res=1;
    unsigned long val=a;
 
    (n&01)? res=(res*val)%p : res=1;
    cnt=ceil(log(dbl)/log(2.0));
    
    while(i<cnt){
        val=(val*val)%p;
        if(n&(2<<i)){
            res=(res*val)%p;
        }
        i++;
    }
    return res;
}
 
void evkl(long long  a,long long b,long long u[3]){
    long long v[3], t[3];
    u[0] = a, u[1] = 1, u[2] = 0;
    v[0] = b ,v[1] = 0, v[2] = 1;
    while(v[0]){
        long long q = u[0] / v[0];
        t[0] = u[0] % v[0];
        t[1] = u[1] - q * v[1];
        t[2] = u[2] - q * v[2];
        for(int i = 0; i < 3; ++i)
            u[i] = v[i], v[i] = t[i];
    }
}
 
int prime(int a){
   if (a <= 1)
        return false;
    for(int i = 2; i*i <= a; i++) {
        if (a % i == 0) {
            return false;
        }
    }
    return true;
}
 
int rand_prime(int size){
    int val=0;
    while(true){
        val=rand()%size+2;  
        if (prime(val)) break;
    }
    return val;
}
 
void findExp(long f, long long *d, long long *c){
    long long u[3];
    do{
        do{
            *d=rand_prime(f);
        }while(gcd(f,*d)!=1);
        evkl(*d,f,u);
        if(u[1]<0) u[1]+=f;
        *c=u[1];
    }while(((*c * *d)%f)!=1);
}
 
void main(){
    srand(time(NULL));
    long long m,p,q,n,eiler,d,c,e,dm;
    long long x,y,b;
    m=9;
    p=rand_prime(40);
    q=rand_prime(40);
    cout << "p=" << p << endl;
    cout << "q=" << q << endl;
    n=p*q;
    eiler=(p-1)*(q-1);
 
    findExp(eiler,&d,&c);
    // Кодируем m
    e=fastPwr(m,d,n);
    // декодируем сообщение
    dm=fastPwr(e,c,n);
    cout << "eiler= " << eiler << endl;
    cout << "d=" << d << endl;
    cout << "c=" << c << endl;
    cout << "e=" << e << endl;
    
    cout << "dm=" << dm << endl;
    system("pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru