Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2013, 16:10   #1
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
Сообщение Код RSA не могу понять...

Доброго времени суток.
Для реализации RSA нужны 3 функции " возведение в степень по модулю (а^x mod p)
Вычисление наибольшего общего делителя (НОД(а,b)), вычисление инверсии (x^-1 mod p)
Нашел код в интернете реализации RSA но не могу его до конца понять и найти в нем эти функции... может их в нем даже нету... Подскажите кто хорошо в с++ понимает...
Код:
#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 p,q,n,eiler,d,c,e,dm;
	long long x,y,b;
	unsigned long m;
	m='rol';
for (p = rand_prime(40); (q=rand_prime(40)) == p;);
	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 << m << endl;
	cout << "d=" << d << endl;
    cout << "c=" << c << endl;
    cout << "e=" << e << endl;

    cout << "dm=" << dm << endl;
    system("pause");
}
lexflax вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите понять код (прокомментировать код шифрации на C++). bicks Помощь студентам 3 10.12.2013 21:31
не могу понять Виктор27 Общие вопросы C/C++ 1 25.11.2013 19:55
Не могу понять как сделан код в Access NatashKaa Помощь студентам 0 18.03.2013 13:22
Не могу понять код программы MattShepard Общие вопросы C/C++ 6 17.01.2011 12:23
Не могу понять в чем проблема (код) diznt Помощь студентам 2 03.08.2008 10:20