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
|
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
int myRandom();
int isPremier(int);
/**
main()
*/
int main(void) {
int _p, _q, _n, _indEuler;
int _e = 0;
int _d = 0;
int _flag = 0;
do {
_p = myRandom();
_q = myRandom();
} while((isPremier(_p) == 0) || (isPremier(_q) == 0) );
_n = _p * _q;
_indEuler = (_p - 1) * (_q - 1);
while( !_flag ) {
if( isPremier(_e) ) {
if( (_n % _e == 0) && (_e < _n) ) {
_e++;
} else {
// on a trouve l'exposant publique
// on sort du while
_flag = 1;
}
} else {
_e++;
}
}
_flag = 0;
// on cherche l'exposant prive
while( !_flag ) {
if( ( _e * _d - 1) % _n == 0 ) {
// on a trouve
_flag = 1;
} else
_d++;
}
printf("p = %d\n", _p);
printf("q = %d\n", _q);
printf("n = %d\n", _n);
//printf("Indice Euler = %d\n", _indEuler);
printf("e = %d\n", _e);
printf("d = %d\n", _d);
return (0);
}
/**
myRandom()
*/
int myRandom(void)
{
static int first = 0;
if (first == 0) {
srand (time (NULL));
first = 1;
}
return ( rand () % 10 );
}
/**
isPremier(int)
*/
int isPremier(int _entier) {
static int _premiers[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,
43,47,53,59,61,67,71,73,79,83,89,97};
int i, n;
double d;
/* 1 n'est pas premier */
if (_entier == 1)
{
return 0;
}
n = sizeof (_premiers) / sizeof (*_premiers);
/* D'abord on regarde si n est divisible par les nombres premiers dans le tableau */
for (i = 0; i < n; i++) {
if (_entier == _premiers[i]) {
return 1;
}
if (_entier % _premiers[i] == 0) {
return 0;
}
}
/* Ensuite, on doit regarder a partir du dernier element du tableau+2 jusqu'a sqrt(_entier)... */
d = sqrt (_entier) + 0.5; /* Le 0.5 permet de tester si c'est un carre parfait... */
i = _premiers[i-1] + 2;
while (i < d) {
if (_entier % i == 0) {
return 0;
}
i += 2;
}
return 1;
}
/**
*/
int pgcd(long _a, long _b)
{
long _dividende = labs(_a); /* le _dividende contient la valeur absolue de a */
long _diviseur = labs(_b); /* le _diviseur contient la valeur absolue de b */
long _quotient;
long _reste;
int _fin = 0;
/*
* on ne calcule le pgcd de deux nombres que s'ils sont diffrents de zro
*/
if(_a != 0 && _b != 0) {
while(!_fin) {
/* On applique la division euclidienne */
_reste = _dividende % _diviseur;
_quotient = (_dividende - _reste) / _diviseur;
/* Si le _reste est diffrent de 0, on continue l'algorithme */
if(_reste != 0) {
_dividende = _diviseur;
_diviseur = _reste;
}
else {
_fin = 1;
}
}
}
else {
/* Erreur ... */
_diviseur = 0;
}
return _diviseur;
} |
Partager