All pastes #770975 Raw Edit

Miscellany

public cpp v1 · immutable
·published 2007-11-12 18:53 UTC
rendered paste body
Main.c;#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <rsa.h>/* Referência da biblioteca responsável por geração e encriptação numérica.*/#include <string.h>int main() {	//Variáveis de Controle.	int primoP=0, primoQ=0, primoD=0;	/**	 * Chamada da função responsável pela geração dos números	 * primos. São passados os ponteiros, que são alterados	 * pela função.	 */  	geraKeys(&primoP, &primoQ, &primoD);	/**	 * Chamada da função de encriptação da senha númerica.	 * Recebe os números primos gerados pela função anterior.	 */	encript(primoP, primoQ, primoD);	//Pausa.	getch();	return 0;}Texto.h #include <stdio.h>#include <stdlib.h>void ler(char string[]) {	char caracter;//Variavel que recebe o conteudo do arquivo.	FILE *arquivo;//Ponteiro do Arquivo.	//Se arquivo é vazio, houve erro na abertura.	if ((arquivo = fopen(string, "r")) == NULL) {		printf("Erro ao abrir arquivo!!!\n\n");		exit(1);//Sai do programa.	};	do {		caracter = getc(arquivo);//Carrega o conteudo do Arquivo.		putchar(caracter);//Carrega os caracteres até chegar ao EOF (End Of File).	} while (caracter != EOF);	printf("\n\n");		fclose(arquivo);	/*Quando acabamos de usar um arquivo que abrimos, devemos fechá-lo.	 Para tanto usa-se a função fclose():*/}void escrita(char string[], char string_[]) {	/*Fp será então um ponteiro para um arquivo. É usando este tipo de ponteiro que	 vamos poder manipular arquivos no C.*/	FILE *fp;	int i;	fp = fopen(string_, "w");	/*O "w" serve para abrir um arquivo texto para gravação.	 Se o arquivo não existir, ele será criado.	 Se já existir, o conteúdo anterior será destruído. Arquivo ASCII, para	 escrita */	/*A condição !fp testa se o arquivo foi aberto com sucesso porque no caso	 de um erro a função fopen() retorna um ponteiro nullo (NULL).*/	if (!fp) {		printf("Erro na abertura do arquivo");		exit(0);/*A função exit() fecha todos os arquivos que um programa tiver aberto.*/	}	for (i=0; string[i]; i++)		putc(string[i], fp); /*Grava a string, caractere a caractere*/	fclose(fp);	/*Quando acabamos de usar um arquivo que abrimos, devemos fechá-lo.	 Para tanto usa-se a função fclose():*/}-------------Rsa.h;#include <stdio.h>#include <stdlib.h>#include <time.h>/*Biblioteca usada na geração do números primos.*/#include <string.h>#include <texto.h>/*Biblioteca usada para escrita e leitura de arquivos TXT.*/#include <gmp.h> /*Biblioteca para cálculos de números grandes*/bool primo(int p) {	//Função de verificação de números primos.	bool pri = false;	int i, div=0;	//Conta de 1 a 'p';	for (i=1; i<=p; i++) {		//Se p MOD i == 0 por 2 vezes é um primo. 		if (p%i == 0)			div++;//Incrementa a variavel de controle.	}	//Confirmação do número primo.	if (div == 2)		pri = true;	return (pri);}void geraKeys(int *primoP, int *primoQ, int *primoD) {	//Os atributos recebidos pela função são apenas Ponteiros.	printf("Gerando chaves. Aguarde...\n");//Mensagem informativa.	//Atribui um número primo a 'primoP'	do {		*primoP = 0;//É zerada a cada interação para evitar erros.		srand(time(NULL));//Coloca um número de acordo com a Hora, para geração de Randomico.		*primoP = (rand()%100);//Gera randomico de 2 digitos.	} while (!primo(*primoP));//Termina quando for primo.	//Atribui um número primo ao Q	do {		*primoQ = 0;//É zerada a cada interação para evitar erros.		srand(time(NULL));//Coloca um número de acordo com a Hora, para geração de Randomico.		*primoQ = (rand()%100);//Gera randomico de 2 digitos.	} while ((!primo(*primoQ)) || (*primoQ == *primoP));//Termina quando for primo e diferente de P.	//Atribui um número primo ao D	do {		*primoD = 0;//É zerada a cada interação para evitar erros.		srand(time(NULL));//Coloca um número de acordo com a Hora, para geração de Randomico.		*primoD = (rand()%100);//Gera randomico de 2 digitos.	} while ((!primo(*primoD)) || (*primoD == *primoP) || (*primoD == *primoQ));//Termina quando for primo e diferente de P e Q.	printf("\nChaves Geradas com Sucesso.");//Mensagem de confirmação.}void encript(int primoP, int primoQ, int primoD) {	//Variaveis LONG INT.	unsigned long int p, q, d, e, aux_d, i, j, k, w;	/*Declaração de variáveis inteiras da biblioteca GMP.*/	mpz_t n, z, msg, msgcrip, res, aux;//Variaveis do tipo MPZ_T funciona como INT.	//Variável que recebe a senha digitada pelo Usuário.	char senha [7];	//Variável auxiliar de senha.	char senha_aux[3];	/*Inicialização das variáveis da biblioteca GMP*/	mpz_init(n);	mpz_init(aux);	mpz_init(z);	mpz_init(msg);	mpz_init(msgcrip);	mpz_init(res);	//p, q, d recebem os números primos gerados.	p = primoP;	q = primoQ;	d = primoD;//D junto com o N é utilizado como chave privada	mpz_set_ui(n, p*q);// N junto com E, é utilizado como chave pública	mpz_set_ui(z, (p-1)*(q-1));	e = 0;	// Para obter o E que será utilizado na chave pública	aux_d = 1;	/*Variável long int para auxiliar na comparação com números GMP.	 A GMP não faz comparações ou operações diretas com números inteiros*/	do {		e++;		mpz_set_ui(aux, e*d);		mpz_mod(aux, aux, z);	} while ((mpz_cmp_ui(aux, aux_d))!=0);	/**	 * TEXTO CRIPTOGRAFADO = (TEXTO ORIGINAL ^ E) mod N	 * TEXTO ORIGINAL = (TEXTO CRIPTOGRAFADO ^ D) mod N	 */	gmp_printf("\nChaves publicas: %d %Zd", e, n);	gmp_printf("\nChaves privadas: %d %Zd", d, n);	printf("\n\nDigite uma senha numerica de 6 digitos.\n");	//gmp_scanf("%Zd", msg);	gets(senha);	char ch;	k=0;	w=0;	/*Início Laço para extrair e encriptar a senha de dois em dois dígitos    */	for (j = 0; j<=2; j++) {		for (i = k; i <= k+1; i++) {			senha_aux[w] = senha[i];			w++;		}		aux_d = atoi(senha_aux);		k = k+2;		w = 0;		mpz_set_ui(msg, aux_d);		gmp_printf("\n\nMensagem original: %Zd", msg);		mpz_pow_ui(res, msg, e);		mpz_mod(msgcrip, res, n);		gmp_printf("\nMensagem encriptada: %Zd\n", msgcrip);		//char *senha_crip[100];		//mpz_get_str(*senha_crip,0,msgcrip);		//puts(*senha_crip);		mpz_pow_ui(res, msgcrip, d);		mpz_mod(msg, res, n);		gmp_printf("\n\nMensagem desencriptada: %Zd\n", msg);	}	char arquivo[15];	strcpy(arquivo, "arquivo02.txt");	char texto[15];	strcpy(texto, senha);	escrita(texto, arquivo);	ler(arquivo);}