Cifrado XOR - Criptografía con Python
introducción:
Hola amigos de Internet, mi nombre es Luis y les doy nuevamente la bienvenida a Mi Diario Python.
Criptografía, es algo que me gusta mucho, y he realizado muchos articulos relacionado con este tema. Y tengo mucho proyectos en mente. La criptografía le permite a las personas proteger sus datos. Los los algoritmos y protocolos criptográficos están por todos lados. Son ellos los que evitan que cualquiera realice un ataque man-in-the-middle y robe tus cuentas.
Existen muchos métodos (algoritmos, protocolos, etc) para proteger nuestros datos. Pero en este articulo, nos enfocaremos en uno.
Realizaremos un scripts con Python, que implemente el "Cifrado XOR" para el cifrado y descifrado de cadenas de textos y archivos de texto. Pero antes...
Cifrado XOR
El cifrado XOR es un algoritmo de cifrado basado en el operador binario XOR.
La disyunción exclusiva es un operador lógico el cual es simbolizado como XOR.
Una disyunción exclusiva solamente es verdadera cuando ambas frases tienen valores diferentes y es falsa si las dos frases son ambas verdaderas o ambas falsas.
A continuación les mostrare una tabla para entender mejor el proceso:
a | b | |
---|---|---|
F | F | F |
V | F | V |
F | V | V |
V | V | F |
Para los que tengan conocimiento de código binario, ya sabran de va esto.
Como ejemplo, hagamos una operación sencilla:
100101
+ 110011.
010110
Ese es un ejemplo sencillo. El código binario esta compuesto por dos números 0 y 1: 1 + 1 = 2 Pero como el 2 no existe en el código binario, diríamos que es 0. Y así sucesivamente.
El operador XOR tambien es identificado con el siguiente simbolo:
Muy bien ya sabemos como funcione la operación:
- A 0 = A,
- A A = 0,
- (B A) A = B 0 = B,
El operador XOR es muy vulnerable y es muy fácil obtener la clave através del análisis de varios mensajes con la misma clave. Por lo que es muy común como parte de cifrados más complejos.
Bueno, creo que con estos conocimientos podemos realizar nuestra implementación.
Cifrado XOR - Implementación en Python
class Cifrado_XOR(object): def __init__(self, key = 0): self.__key = key def encrypt(self, content, key): # pre-condición assert (isinstance(key,int) and isinstance(content,str)) key = key or self.__key or 1 while (key > 255): key -= 255 # Esta lista sera retornada ans = [] for ch in content: ans.append(chr(ord(ch) ^ key)) return ans def decrypt(self,content,key): # pre-condición assert (isinstance(key,int) and isinstance(content,list)) key = key or self.__key or 1 while (key > 255): key -= 255 # This will be returned ans = [] for ch in content: ans.append(chr(ord(ch) ^ key)) return ans def encrypt_string(self,content, key = 0): # Encriptar cadenas de texto # pre-condición assert (isinstance(key,int) and isinstance(content,str)) key = key or self.__key or 1 while (key > 255): key -= 255 ans = "" for ch in content: ans += chr(ord(ch) ^ key) return ans def decrypt_string(self,content,key = 0): # Descifrar # pre-condición assert (isinstance(key,int) and isinstance(content,str)) key = key or self.__key or 1 while (key > 255): key -= 255 ans = "" for ch in content: ans += chr(ord(ch) ^ key) return ans def encrypt_file(self, file, key = 0): # Cifrar archivos de texto #pre-condición assert (isinstance(file,str) and isinstance(key,int)) try: with open(file,"r") as fin: with open("encrypt.out","w+") as fout: for line in fin: fout.write(self.encrypt_string(line,key)) except: return False return True def decrypt_file(self,file, key): # Descifrar archivo de texto #pre-condición assert (isinstance(file,str) and isinstance(key,int)) try: with open(file,"r") as fin: with open("decrypt.out","w+") as fout: for line in fin: fout.write(self.decrypt_string(line,key)) except: return False return True crypt = Cifrado_XOR() key = 34 encr = crypt.encrypt_string("Hola Mundo",key) decr = crypt.decrypt_string(encr, key) print("Cifrado: %s" % encr) print("Descifrado: %s" % decr)
Cifrado: jMNC oWLFM Descifrado: Hola Mundo
Como pueden observar, el proceso de cifrado y descifrado es exactamente el mismo.
Te reto a utilizar esta misma clase y descifrar el siguiente cifrado con la llave 56:
~]TQ[QY]K _JY[QYK HWJ NQKQLYJ uQ |QYJQW hALPWV
Prueba tus habilidades y comenta tu resultado. Prueba los métodos para cifrar y descifrar archivos de texto y comenta tu experiencia.
Mi nombre es Luis, y fue un placer compartir mis conocimientos con todos ustedes :D.
Subir
Deja una respuesta