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...
Imagen relacionada

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:

 0 = 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey