Skip to content

Instantly share code, notes, and snippets.

@romuloccomp
Created December 9, 2011 16:50
Show Gist options
  • Save romuloccomp/1452335 to your computer and use it in GitHub Desktop.
Save romuloccomp/1452335 to your computer and use it in GitHub Desktop.
Implementação do RSA
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <string.h>
#define NUM_MAX 30
int mdc(int a,int b);
int primo(p);
int rand_int(int op);
void cria_num_primos(int *p,int *q){
do{
*p = rand_int(NUM_MAX);
}while(primo(*p) == 0);
do{
*q = rand_int(NUM_MAX);
}while((primo(*q) == 0)&&(*p != *q));
//printf("numero primos %d %d\n",*p,*q);
}
int escolha_e(fi_n){
int e = rand_int(fi_n);
while((1>=e)&&(mdc(e,fi_n) != 1))
e = rand_int(fi_n);
return e;
}
int calculo_d(int fi_n, int e){
int d;
d = 2;
while ((d < fi_n) && (((e*d) % fi_n) != 1))
d++;
return d;
}
int main(){
int p,q,n,fi_n,e,d;
char mensagem[10] = {};
//try long int
unsigned int mensagem_c[10] = {0};
char mensagem_d[10] = {};
srand(time(NULL));
//cria_num_primos(&p,&q);
//teste
p = 7;
q = 9;
//printf("numero primos %d %d\n",p,q);
n = p * q;
//printf("n = p x q = %d\n",n);
fi_n = (p - 1) * (q - 1);
//printf("fi(n) = (p - 1) x (q - 1) = %d\n",fi_n);
e = escolha_e(fi_n);
printf("e: %d\n",e);
d = calculo_d(fi_n,e);
printf("d: %d\n",d);
printf("Chaves\n");
printf("Publica: { %d , %d }\n",e,n);
printf("Privada: { %d , %d }\n",d,n);
printf("------------------------------\n");
printf(" Digite sua mensagem: \n");
scanf("%s",mensagem);
int i=0;
int c_int;
char c;
//printf("pow_int 2^3 %d\n",pow_int(2,3));
//for(i=0;i<strlen(mensagem);i++){
for(i=0;i<10;i++){
printf("%c",mensagem[i]);
c_int = ((int)mensagem[i]);
printf(" : %d n: %d\n",c_int,n);
mensagem_c[i] = pow_int(c_int,e) ;//% n ;
printf("%d\n",mensagem_c[i]);
}
//puts(mensagem);
/*
for(i=0;i<10;i++){
c_int = (int)pow(mensagem[i],d) % n;
printf("c_int %d\n",c_int);
c = (char)c_int;
printf("%c \n",c);
}
*/
return 0;
}
/* Medoto de Euclides estendido
* para calcular o MDC
*/
int mdc(int a,int b){
if(b == 0)
return a;
else
return mdc(b,a%b);
}
/* Verificar se um número é
* primo
*/
int primo(p){
int k = 2;
while ((p%k) != 0)
k++;
if (k == p) //numero primo
return 1;
else //numero nao primo
return 0;
}
/* Gera um numero aleatorio
* maximo passado
*/
int rand_int(int max){
return(1 + (rand() % max));
}
int pow_int(x,y){
printf("pow_int x: %d y: %d",x,y);
int i,result = x * x;
for(i=2;i<y;i++)
result *= x;
printf("result %d",result);
return result;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment