Você está na página 1de 20

CURSO SUP.TEC. EM ANALISE E DESENVOLVIMENTO DE SISTEMAS.

DP 2 SEMESTRE

BRUNO CESAR GUERREIRO BRUGNARO RA: B0567G-0 PROJETO INTEGRADO MULTIDISCIPLINAR - PIM CRIPTOGRAFIA

SOROCABA SP 2012

CRIPTOGRAFIA Trabalho de concluso do Projeto Integrado Multidisciplinar - PIM II, Apresentado como requisito parcial do Curso Superior Tcnico em ANALISE E DESENVOLVIMENTO DE SISTEMAS, dirigido pela Universidade Paulista UNIP.

SOROCABA 2012 BRUNO CESAR GUERREIRO BRUGNARO RA: B0567G0 CRIPTOGRAFIA

Aprovado em:

BANCA EXAMINADORA _____________________/___/___ Prof: Universidade Paulista UNIP _____________________/___/___ Prof: Universidade Paulista UNIP _____________________/___/___ Prof: Universidade Paulista UNIP _____________________/___/___ Prof: Universidade Paulista UNIP

RESUMO

Este trabalho a implantao de um sistema de criptografia usando o sistema de chave pblica ou assimtrica aplicando os conhecimentos adquiridos em sala de aula. O mtodo escolhido foi a criptografia em RSA, um dos tipos de criptografia mais usados hoje em dia que utiliza conceitos matemticos para garantir a sua segurana. O trabalho visa mostrar os conhecimentos e procedimentos necessrios para a criao de um programa que seja capaz de gerar as chaves, codificar e decodificar as informaes, que usa linguagem e tcnicas de programao para deixar o cdigo o mais gil possvel. Atravs deste sistema as pessoas podem trocar informaes de uma maneira segura. A criptografia algo que est presente no nosso dia-a-dia mesmo que nos no percebamos. Vai desde a simples troca de mensagem atravs de e-mails, como tambm em transaes bancrias at informaes confidenciais de pases.

Palavras-Chave: Criptografia. RSA. Segurana. Conceitos Matemticos. Programao.

ABSTRACT

This work is the implementation of an encryption system using public key system or asymmetrical applying the knowledge acquired in the classroom. The method chosen was the RSA encryption, one of the encryption types most commonly used today that uses mathematical concepts to ensure their safety. The work aims to show the knowledge and procedures needed to create a program that is able to generate keys, encrypt and decrypt the information, using language and programming techniques to make the code as fast as possible. Through this system, people can exchange information in a secure manner. Encryption is something that is present in our day to day even if we do not perceive. It ranges from the simple exchange of messages through e-mails, as well as banking information confidential until countries.

Keywords: Encryption. RSA. Security. Mathematical Concepts. Programming.

SUMRIO RESUMO,ABSTRACT________________________________________________ 3 1 - CRIPTOGRAFIA__________________________________________________ 5 1.1 - O que criptografia_______________________________________________ 5 1.2 - Histria________________________________________________________ 5 2 - CRIPTOGRAFANDO ATRAVS DE CHAVES_____________________________5 - Chaves simtricas___________________________________________________ 5 * 2.1.1 - DES (Data Encryption Standard):_______________________________ 5 * 2.1.2 - IDEA (International Data Encryption Algorithm):___________________ 6 * 2.1.3 - AES (Advanced Encryption Standard):___________________________ 6 - Chaves assimtricas________________________________________________ 6 * 2.2.1 - DH (Diffie-Hellman):_________________________________________ 6 * 2.2.2 - RSA (Rivest, Chamir e Adleman):______________________________ 6 * 3 - CRIPTOGRAFIA EM RSA________________________________________ 6 * 3.1 - Gerando a chave pblica_______________________________________ 7 * 3.2 - Gerando a chave privada_______________________________________ 7 * 3.3 - Cifrar_______________________________________________________ 7 * 3.4 - Decifrar_____________________________________________________ 8 4 - EXEMPLO DE CRIAO DE CHAVES________________________________ 8 5 - MATEMTICA APLICADA__________________________________________ 8 5.1 - Nmeros primos________________________________________________ 8 5.2 - Nmeros primos entre si_________________________________________ 8 5.3 - Aritmtica modular______________________________________________ 8 5.4 - Funo phi____________________________________________________ 9 6 - CDIGO______________________________ 9,10.11,12,13,14,15,16,17,18,19 7- CONCLUSO___________________________________________________ 20 8- REFERNCIAS__________________________________________________ 20

1 - CRIPTOGRAFIA 1.1 O que criptografia. um conjunto de tcnicas usadas para manter informaes seguras. A criptografia usa um algoritmo para transformar diversos tipos de documentos em mensagens que ficaro ilegveis para os receptores no autorizados. A inteno que apenas o destinatrio final consiga decifrar a mensagem para algo legvel novamente.

1.2 - Histria Criada por Arthur Scherbius em 1918, a primeira mquina de criptografia recebeu o nome de Enigma. Em 1928 foi adaptada para ser usada pelo exrcito alemo durante a guerra, onde a chave era trocada a cada ms. Na poca era impossvel decodificar as mensagens, mas hoje em dia com a capacidade dos computadores esta no seria uma misso to difcil assim. Na poca os inimigos conseguiram decifrar o cdigo com o roubo de uma destas mquinas, para isso eles aplicaram a engenharia reversa. A criptografia passou a ser usada principalmente em pocas de guerra, pois assim o exrcito podia esconder suas aes e movimentaes das tropas, criptografando as informaes para que somente quem tivesse a chave pudesse ler. Hoje existem diversos tipos de criptografia usadas em nosso dia-a-dia como, por exemplo, no envio de e-mails, compras em loja online, na movimentao de contas bancrias, e como no passado ainda continua sendo usada pelos exrcitos de todo o mundo. Com o passar dos anos surgiram vrios tipos de criptografia, sendo que as mais usadas so por sistema de chaves.

2 CRIPTOGRAFANDO ATRAVS DE CHAVES O tipo de criptografia mais usado hoje em dia o sistema com chaves, quanto maior o nmero de bits da chave mais seguro ser o sistema. Por exemplo: uma chave com 8bits ir gerar 256 possveis chaves, pois 2 elevado a 8 igual a 256. recomendado que se use no mnimo 128 bits para se obter um sistema seguro, mas tem sistemas que usam chaves de ate 1024 bits. Os mais usados so os sistemas de chave simtrica e assimtrica. Para se criptografar uma mensagem necessrio um algoritmo que usar funes da matemtica para gerar as chaves e codificar as informaes.

2.1 - Chaves simtricas A chave simtrica o mais simples para se usar, pois o emissor e o receptor usam a mesma chave, ou seja, com uma chave voc vai codificar e decodificar a informao. Entre os tipos de algoritmos que usam o sistema de chave simtrica temos alguns algoritmos descritos abaixo.

2.1.1 - DES (Data Encryption Standard): em 1974 a IBM cria um sistema de criptografia chamado de Lucifer, que foi modificado em 1976 dando origem ao DES. O princpio do DES

usar blocos de 64 bits sendo que, 8 bits so usados para testar a paridade da chave e apenas os outros 56 bits restantes so realmente usados no algoritmo.

2.1.2 - IDEA (International Data Encryption Algorithm): foi criado em 1991 por James Massey e Xuejia Lai, usa chaves de 128 bits e tem uma estrutura muito semelhante ao DES. Por ser um sistema relativamente novo no muito difundido e tambm necessrio ter uma licena para poder ser utilizado, pois patenteado.

2.1.3 - AES (Advanced Encryption Standard): em 1997 um orgo do governo Americano convidou qualquer pessoa que quisesse participar do desenvolvimento de um novo sistema de codificao que seria denominado AES, mas as pessoas no teriam direitos sobre o algoritmo criado. O AES utiliza como padro blocos de 124, 196 e 256 bits. Acabou substituindo o DES por ser mais rpido e eficiente.

2.2 - Chaves assimtricas A chave assimtrica tambm conhecida como criptografia de chave pblica a mais usada hoje em dia por ser mais segura, pois sero produzidos 2 pares de chaves onde o emissor usa um par para codificar a informao (chave pblica), e o receptor usar o outro par (chave privada) para decodificar a informao. A divulgao da chave pblica no coloca em risco a segurana do sistema, pois no possvel chegar chave usando a engenharia reversa. Abaixo veremos alguns tipos de algoritmos de chave pblica.

2.2.1 - DH (Diffie-Hellman): foi o primeiro algoritmo de chave assimtrica a ser criado, mas com um nico porm, o algoritmo serve apenas para a distribuio das chaves no para criptografar as informaes.

2.2.2 - RSA (Rivest, Chamir e Adleman): um dos algoritmos de criptografia assimtrica mais usados no mundo. Foi criado em 1977, tendo como nome as iniciais do sobrenome dos pesquisadores da MIT Ron Rivest, Adi Shamir e Len Adleman. Para o nosso trabalho foi utilizado o sistema de chave assimtrica utilizando o algoritmo RSA. A seguir teremos uma descrio mais detalhada deste sistema de criptografia.

3 CRIPTOGRAFIA EM RSA Em 1976 Whitfield Diffie e Martin Hellman inventaram a criptografia de chave pblica dando incio a criao de um dos mtodos mais usados dos nossos tempos o RSA. Embora a criptografia de chave pblica Diffie-Hellman tenha sido um marco na histria, os pesquisadores Ron Rivest, Adi Shamir e Leonard Adleman criaram o mais popular algoritmo de criptografia usado hoje em dia, o RSA. A criptografia RSA esta fundada em conceitos matemticos. A segurana contida nela consiste no fato que muito difcil fatorar nmeros gigantes. O algoritmo foi desenvolvido de forma

unidirecional, ou seja, aps aplicar as regras do algoritmo no se pode fazer a conta inversamente para chegar aos nmeros originais. A seguir veremos os passos necessrios para criar as chaves pblica e privada e como cifrar e decifrar a informao. 3.1- Gerando a chave pblica * primeiro escolhe-se dois nmeros primos P e Q (quanto maior o nmero menor a chance de as chaves serem descobertas); * calculamos N que igual a P x Q; * calculamos PHI=(P 1) x (Q 1) e fatoramos o resultado para encontrar E; * escolhemos E, ou seja, pegamos o prximo nmero primo do ltimo divisor de PHI; * A chave pblica ser {N,E} .

3.2- Gerando a chave privada * Achar D, de forma que satisfaa a condio (E*D) % PHI == 1, para isso utiliza-se o algoritmo de Euclides extendido; * a chave privada ser {N.D}.

* 3.3 - Cifrar Para cifrar a informao, primeiro temos que transformar os caracteres em nmeros para que o algoritmo RSA possa ser aplicado. Podemos usar como padro a tabela ASCII que bem conhecida. Aps isso dividimos os nmeros gerados em blocos de acordo com o tamanho da chave criada, ou seja, deve ser menor que N para podermos criptografar a informao. A formula usada neste passo C = M^E mod N. Como o clculo pode ser muito grande usa-se a propriedade da aritmtica modular para facilitar o procedimento. Exemplo do uso da tabela ASCII com a transformao dos caracteres para a forma octal: a palavra teste ficaria assim t = 164 e = 145 s = 163 t = 164 e = 145 A palavra teste em octal ficaria assim: 164145163164145

3.4 - Decifrar Para decifrar a informao agora pegamos bloco cifrado e o submetemos frmula: M = C^D mod N. Transforma-se D em um nmero binrio para facilitar os clculos.

4.0 EXEMPLO DE CRIAO DE CHAVES P=17 e Q=23 N = P x Q = 391 PHI= (P 1) x (Q 1) = 352 E = 3 (no divide 352) D = 235 5.0 MATEMTICA APLICADA

5.1 - Nmeros primos Nmeros primos so aqueles que tm apenas dois divisores, ou seja, ele divisvel apenas por um e por ele mesmo. Para descobrir se um nmero primo ou no dividimos o nmero pelos primos 2,3,5,7,11,13,17, etc. Se como resultado obtermos o resto zero o nmero no primo, por exemplo, 4 divisvel por 1, por 2 e por 3, portanto no um nmero primo. Se o quociente for menor que o divisor e o resto diferente de zero primo, exemplo, 17 somente divisvel por 1 e por ele mesmo, ento um nmero primo.

5.2 - Nmeros primos entre si Para descobrir se os nmeros so primos entre si, basta calcular o mximo divisor comum, se o mdc der 1 os nmeros so primos entre si. Exemplo, 20 tm como divisores 1, 2, 4, 5, 10 e 20, j o nmero 21 tem como divisores 1, 3, 7 e 21, neste caso o nico divisor em comum entre os dois o nmero 1, portanto embora o nmero 20 no seja primo ele coprimo do nmero 21.

5.3 - Aritmtica modular A aritmtica modular trabalha com a congruncia de nmeros, onde voc tem dois nmeros que se divididos por outro deixam o resto zero. A forma mais conhecida de aritmtica modular o clculo das horas num relgio de ponteiro. Se na matemtica 7 + 10 igual a 17, na aritmtica modular 7 + 10 igual a 5, porque se pegarmos o relgio como exemplo veremos que cada ciclo tem 12 horas ento 17 = 5 (mod12), ou seja, o 17 completa um ciclo de 12 e resta 5, no caso 5 horas.

5.4 Funo tociente ou phi Um nmero x que tenha a mesma quantidade de nmeros menores que x co-primos. Exemplo (phi)8 = 4, pois 8 tem como nmeros co-primos 1, 3, 5 e 7. Na criptografia RSA o clculo de PHI tem como frmula ((P-1) x (Q-1)). 6 CDIGO gerar primos #include <cstdlib> #include <iostream> #include <math.h>

using namespace std;

unsigned int nextprimo(unsigned int p) { if (p == 2) return 3; //trata input unico primo par

int tentmax = 0; bool achou_divisor = true;

while (achou_divisor == true) { achou_divisor = false; p = p + 2; //Incrementa por 2 para ignorar numero par subsequente tentmax = sqrt(p); //acha o limite de tentativas de divisao, a raiz quadrada do numero testado arredondada for(unsigned int i=2;i<=tentmax;i++) { if (p%i == 0) achou_divisor = true; } } return p;

int main(int argc, char *argv[]) { unsigned int primo=0, qtdade=0, j=0;

cout << "Quantos numeros primos deseja gerar?\n"; cin >> qtdade;

cout << "Qual o numero inicial?\n"; cin >> primo;

if (primo%2 == 0) { primo++; }

for(j=1;j<=qtdade;j++) { primo = nextprimo(primo); cout << "\n" << primo; }

cout << "\n\n\n";

system("PAUSE"); return EXIT_SUCCESS; }

gerarchave

10

#include <cstdlib> #include <iostream> #include <math.h>

using namespace std;

unsigned int nextprimo(unsigned int p) { if (p == 2) return 3; //trata input unico primo par

unsigned int tentmax = 0; bool achou_divisor = true;

while (achou_divisor == true) { achou_divisor = false; p = p + 2; //Incrementa por 2 para ignorar numero par subsequente tentmax = sqrt(p); //acha o limite de tentativas de divisao, a raiz quadrada do numero testado arredondada for(unsigned int i=2;i<=tentmax;i++) { if (p%i == 0) achou_divisor = true; } } return p; }

unsigned int maxfator(unsigned int numero) { unsigned int divisor_atual = 2; //variavel do divisor primo atual bool achoumax = false;

11

while(achoumax == false) { if (numero%divisor_atual == 0) //testa se e divisivel { numero = numero / divisor_atual; //divide if (numero == 1) achoumax = true; //terminou a fatoracao } else { divisor_atual = nextprimo(divisor_atual); //incrementa o primo } } return divisor_atual; }

long RSA_extend(long E, long PHI) { long q = 0, u2 = 0, u3 = 0, v2 = 0, v3 = 0, t2 = 0, t3 = 0;

u2 = 0; u3 = PHI; v2 = 1; v3 = E;

while (v3 != 0) { q = u3/v3; //PHI dividido por E t2 = u2 - q * v2; //subtrai resultando arredondado t3 = u3 - q * v3; //resto

12

u2 = v2; u3 = v3;

v2 = t2; v3 = t3; }

if (u2 < 0) { return u2 + PHI; } else { return u2; }

} /*Calculo do GREATEST COMMON DIVISOR */

int main(int argc, char *argv[]) { unsigned int P = 19, Q = 23, N = 0, PHI = 0, E = 0, D = 0;

cout << "Digite dois numeros primos aleatorios:\n"; cin >> P; cin >> Q;

N = P * Q; PHI = (P-1)*(Q-1); E = nextprimo(maxfator(PHI));

13

D = RSA_extend(E, PHI);

cout << "\nChave Publica: " << E << " " << N << "\n"; cout << "Chave Privada: " << D << " " << N << "\n";

system("PAUSE"); return EXIT_SUCCESS; }

rsa #include <cstdlib> #include <iostream> #include <string> #include <sstream>

using namespace std;

int euclides(int numeroN, int chaveD, int C) { int G=0, F=0, i=0;

if ( chaveD % 2 == 0) { G = 1; F = (C*C) % numeroN; for ( i = 1; i <= chaveD/2; i++) { G = (F*G) % numeroN; } }

14

else { G = C; F = (C*C) % numeroN; for ( i = 1; i <= chaveD/2; i++) { G = (F*G) % numeroN; } }

return G; }

int pubencrypt(int numcarac, int numeroN, int numeroE) { long int C=0, F=0, i=0;

if (numeroE % 2 == 0) { C = 1; F = (numcarac*numcarac) % numeroN; for (i = 1; i <= numeroE/2; i++) { C = (F*C) % numeroN; } } else { C = numcarac; F = (numcarac*numcarac) % numeroN;

15

for (i = 1; i <= numeroE/2; i++) { C = (F*C) % numeroN; } }

return C; }

string convertInt(int number) { std::stringstream ss;//create a stringstream ss << number;//add number to the stream return ss.str();//return a string with the contents of the stream }

struct chavepublica { unsigned long num_mod; unsigned long num_pub; };

struct chaveprivada { unsigned long num_mod; unsigned long num_euc; };

void criptografar() {

16

unsigned long num_mod = 0, num_pub=0; int caracter=0; chavepublica chave;

cout << "Digite a chave publica...\n"; cin >> chave.num_mod; cin >> chave.num_pub;

FILE*fp; FILE*fp2; fp=fopen("mensagem.txt","r"); fp2=fopen("codigo.txt","w"); while(!feof(fp)) { caracter = int(fgetc(fp)); if (!(caracter < 0)) { fputs(convertInt(pubencrypt(caracter,chave.num_mod,chave.num_pub)).c_str(),fp2); fputs("|",fp2); } } fclose(fp2); fclose(fp);

cout << "\nDone...\n"; }

void descriptografar() { int leitor=0, i=0;

17

unsigned long num_mod = 0, num_euc=0, numcod=0; char codigo[32]={' '}, ch= ' ', msgput[1]={' '}; chaveprivada chave;

cout << "Digite a chave privada...\n"; cin >> chave.num_mod; cin >> chave.num_euc;

FILE*fp; FILE*fp2; fp=fopen("codigo.txt","r"); fp2=fopen("mensagem.txt","w"); while(!feof(fp)) { ch=fgetc(fp); if(ch=='|') { numcod = atoi(codigo); for(i=0;i<32;i++) { codigo[i] = ' '; } fputc(char(euclides(chave.num_mod,chave.num_euc,numcod)),fp2); leitor=0; } else { codigo[leitor] = ch; leitor++; }

18

} fclose(fp2); fclose(fp);

cout << "\nDone...\n"; }

int main(int argc, char *argv[]) { int operacao = 3;

while(operacao!=0 && operacao!=1 && operacao!=2) { system("cls"); cout << "Digite a operacao desejada:\n\n1-Criptografar\n2-Descriptografar\n0-Sair\n\n"; cin >> operacao; }

if(operacao==1) //***criptografar*** { criptografar(); } if(operacao==2) //***descriptografar*** { descriptografar(); } cout << "\nBye...\n\n\n"; system("PAUSE"); return EXIT_SUCCESS; }

19

6 CONCLUSO Conclui-se com este estudo e projeto que no h sistemas com fidcia perfeita, entretanto, existem mtodos eficazes para se dificultar o acesso a informaes por estranhos. A fim de embaular o ltico teor de uma mensagem, o recurso mais utilizado a criptografia. H vrios tipos de algoritmos e chaves. Porm o sucesso da operao depende do modelo adotado. O algoritmo mais seguro e robusto o assimtrico, pois ele independe de transportar a chave anexada mensagem. O criptograma gerado a partir da chave pblica do destinatrio, e s pode ser decifrado com a sua chave privada. Do contrrio, jamais ser desvelado. Ficou explcito que o certificado da identidade eletrnica precisa ser confivel e seguro. Dado a isso, considerou-se o tipo SHA-1 o qual utiliza chave RSA de 1024 bits. Entretanto, notou-se que isoladamente a tecnologia insuficiente para asseverar a solidez dos sistemas e assegurar a rigidez das instituies diante de ameaas. Sobretudo, imprescindvel a definio de uma poltica de segurana, envolvendo a cultura dos colaboradores. Aps todos em estudos e pesquisa realizadas percebemos que no basta conhecer apenas sobre linguagem de programao para se desenvolver um programa, precisamos ter conhecimento em diversas reas e escolher o mtodo de desenvolvimento que mais se encaixa nossa equipe. Neste trabalho foi necessrio um conhecimento muito grande em algumas reas da matemtica. Outro ponto importante saber transformar o conhecimento adquirido em cdigo computacional. Aps este trabalho estamos cientes de que o processo de engenharia de software muito importante para a organizao e implantao de sistemas, pois sem isto o trabalho seria feito de uma forma desorganizada e no atenderia as expectativas.

7 REFERNCIAS

COUTINHO, S. C. Nmeros Inteiros e Criptografia RSA. Rio de Janeiro: IMPA/SBM, 1997. SILVA, W. L. e CHAVES, L. M. A Criptografia RSA e o Algoritmo Chins do Resto, Journal of Computer Science, 2000. SANTOS, J.P.O. Introduo Teoria dos Nmeros, IMPA-RJ. MATERIAL DISPONVEL NA INTERNET: Site do Numa Boa Criptografia: Pgina Inicial do Site: Disponvel em: < http://www.numaboa.com.br// >. Acesso em 11/09/2011.

20

Você também pode gostar