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);}