Baixe o app para aproveitar ainda mais
Prévia do material em texto
Trabalho de Segurança e Criptografia RSA Um dos melhores exemplos para exemplificar a utilização de números primos na computação, é falando sobre um dos modelos de criptografia mais seguros do mundo, o RSA, onde se baseia na escolha de número primos, e quanto maior o número, mais seguro a chave é. Podemos usar esse site como exemplo para escolher um número primo grande: http://compoasso.free.fr/primelistweb/page/prime/liste_online_en.php Escolhido os números, o processo é feito da seguinte forma, temos dois primos, tais como: p1 = 3, p2 - 11 (apenas a fim de estudo, o melhor a ser feito é escolher o maior primo possível) Calculamos o produto entre eles, no caso temos, 11 x 3 = 33 Quebra de Página Após esse resultado, precisamos calcular o totiene de euler desse número, que no caso é a quantidade de números ‘coprimos’, em que o MDC entre ele e o outro número é 1, e a quantidade de números coprimos é o totiene desse número. A fórmula para se calcular o titiene de um número é essa: Utilizando nosso exemplo, temos então: Agora precisamos escolher um dos 20 coprimos do nosso 33, os coprimos de 33 são 1,2,4,5,7,8,10,13,14,16,17,19,20,23,25,26,28,29,31,32, para esse exemplo, escolhemos o 17, vamos chamar o de X. Agora precisamos de um Y, ele para ele existir, é preciso que a seguinte fórmula seja verdadeira: X x Y mod totiene (n) = 1 (mod, no mundo da computação, é o resto da divisão de um número por outro, geralmente sendo o operador %) Para essa fórmula ser real, temos que Y = 13 Então nossos dados agora ficam organizados assim: Agora, para encriptar uma mensagem, tal como uma mensagem M qualquer, a seguinte fórmula é usada: Vamos usar de exemplo então o número 14 temos que: logo o nosso 14 cifrado virou 20 e agora, se quisermos decriptografar? O processo é o seguinte: Assim temos o nosso texto decriptografado de volta. Script #!/usr/bin/python class bcolors: HEADER = '\033[95m' OKBLUE = '\033[94m' OKCYAN = '\033[96m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' def encrypt(msg, encryptor, n): print(f"[+] {bcolors.OKGREEN}ENCRYPTING{bcolors.ENDC}") aux = msg ** encryptor crypt = aux % n return crypt def decrypt(encrypted, decryptor, n): print(f"[+] {bcolors.OKGREEN}DECRYPTING{bcolors.ENDC}") aux = encrypted ** decryptor plain = aux % n return plain if _name_ == "_main_": p1 = 11 p2 = 3 encryptor = 17 decryptor = 13 n = p1*p2 print(f"valores{bcolors.WARNING}\nchave pública:{bcolors.ENDC}\tencryptor: {encryptor}, n={n}\n{bcolors.WARNING}chave privada:{bcolors.ENDC}\tdecryptor: {decryptor}, n={n}") print(f"================================================================= ===============") message = int(input("Digite a mensagem: ")) encypted = int(encrypt(message, encryptor, n)) print(f"a sua mensagem criptografada é: {bcolors.OKBLUE}{encypted}{bcolors.ENDC}") print(f"================================================================= ===============") plain = int(decrypt(encypted, decryptor, n)) print(f"a mensagem orginal é: {bcolors.OKBLUE}{plain}{bcolors.ENDC}") Imagem (exemplo) Alunos: Arthur Juan Lima Pinto (20201104544) Juliana Bond Oliveira Lins (20201101127) Pedro Henrique Ottone Chaves (20201106340) Yago de Paula Freire Graça (20212102645)
Compartilhar