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
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:
Plain = cifra ^ y mod n
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)
image1.png
image3.png
image7.jpg
image4.png
image6.png
image5.png
image2.png