Es un chisme que no he podido verificar. Se supone que en alguna ocasión Elon Musk utilizó un sistema muy ingenioso para detectar a la persona que filtró correos electrónicos de la empresa.
El sistema funciona así: cada miembro de una lista de correos recibe un correo diferente de una manera imperceptible a simple vista. Según los espacios en el correo, se usa código binario para asignar un número de identificación a cada uno de los correos.
No tengo idea de si es verdad, si sea buena idea o si de verdad sea imperceptible, pero me parece interesante cómo ejercicio para intentar hacerlo por mi cuenta a como yo entendí que podría hacerse.
Usando el binario para cifrar un correo
El código binario es la base con la que funcionan todas nuestras computadoras. La idea básica de la transmisión de información es que es posible codificar y decodificar lo que sea a partir de sólo unos y ceros.
Esto es muy útil si lo único que tienes a la mano para comunicarte son pulsaciones eléctricas. En tal caso, un paso de electricidad puede significar un 1 y la falta de la misma se codifica como un 0. Lo mismo si estás transmitiendo a través de ondas en el aire, donde una onda larga puede que traducirse como un 1 y una onda corta es un 0.
Usando el código binario
Yo uso el sistema decimal. Eso quiere decir que cada diez dígitos tengo que volver a usar los símbolos anteriores para seguir contando. Pero esta no es la única forma de crear números. Existe por ejemplo el sistema hexadecimal, con 16 dígitos en total (se usan las letras para completar los números faltantes).
Saber cómo funcionan los sistemas de números hace relativamente sencillo comprender que el sistema decimal
¿Cómo poner binario en un texto?
Hagamos un ejercicio para entender cómo ocultar un código corto en un texto. Supongamos que deseas escribir el número 42 en el siguiente texto.
El número 42 es 101010 en binario. Para ocultarlo en el texto usaremos un sólo espacio como un cero y doble espacio como un uno (bien podría ser al revés, lo importante es que sepas cuál es cuál al decodificar). El texto codificado quedaría así
Como puedes ver, los dobles espacios son poco visibles y podrían pasar por un pequeño error tipográfico para alguien desapercibido. Veamos si podemos hacer un script en python que lo haga.
Primeros pasos
Lo primero que haremos será definir un texto para que sea nuestro correo a encriptar. Yo elegí un extracto del Quijote para comenzar, pero puedes usar cualquier texto que te parezca interesante. Usa el código siguiente en Python para almacenar ese texto en una variable de nombre text
.
Lo primero que quiero hacer es asegurarme de que no hayamos puesto doble espacio en ninguna parte. Como dijimos podría bien ser un error genuino. El siguiente código hace esta tarea por nosotros.
t = ' '.join(text.split())
Ahora toca encontrar las posiciones en las que podemos encontrar espacios y guardarlos en una lista. Usamos una técnica que se llama list comprehention para crear la lista en una sola línea de código. Como sólo usaremos 6 dígitos para nuestro número binario, podemos cortar la lista a los elementos que necesitamos únicamente.
# 42 en binario: 00101010
indices = [pos for pos, char in enumerate(t) if char == ' '][0:6]
print(indices)
# [2, 5, 11, 14, 17, 25]
La siguiente línea simplemente asigna un número y lo transforma a binario. Si hiciéramos esto para múltiples números esta línea sería parte de nuestra función, pero simplemente podríamos proporcionar el número 101010 en el bloque de abajo para asignar el código que introduciremos al texto.
number = 42
binary = f'{number:b}'
Inserta los espacios en los lugares apropiados
Listo, estamos listos para introducir los espacios en los lugares correspondientes. El siguiente bloque de código recorre los seis dígitos de nuestro código binario e introduce un espacio únicamente en aquellos en los que su valor es uno.
for i in range(0,len(binary)):
j = 5 - i
if binary[j] == "1":
t = t[:indices[j]] + " " + t[indices[j]:]
#print(j)
print(t)
Nota como un pequeño detalle que los espacios se asignan en orden inverso. Esto es porque al insertar un espacio, los lugares en la cadena de texto se recorren. Si lo hacemos en orden, desde el segundo lugar empezarías a notar el error.
El script final
El código final quedaría así. Pruébalo y me dices si te funcionó.
def run():
text = '''En un lugar de la Mancha, cuyo nombre no quiero acordarme, vivía un hombre llamado Alonso Quijano, que estaba fascinando con los caballeros andantes. Le encantaba leer los libros sobre sus aventuras y vendió una parte de su tierra para comprar más libros sobre caballería.
Las hazañas increíbles de los caballeros andantes y gigantes fueron más verdaderas que su propio mundo. Él creía que para su honor y el de su país, debía ser un caballero andante. Decidió que se llamaría don Quijote de la Mancha'''
t = "Quien a buen árbol se arrima, buena sombra le cobija."
# Make sure there are no double spaces in the text
t = ' '.join(t.split())
# 42 en binario: 00101010
indices = [pos for pos, char in enumerate(t) if char == ' '][0:8]
number = 42
binary = f'{number:b}'
count = 0
for i in range(0,len(binary)):
j = 5 - i
if binary[j] == "1":
t = t[:indices[j]] + " " + t[indices[j]:]
#print(j)
print(t)
if __name__ == "__main__":
run()
Y así se vería el texto final. ¿Logras notar los dobles espacios?
¿Que sigue?
Para que esto sea útil necesitamos un decodificador. Haremos uno para un post siguiente. Mientras tanto, usa los botones de abajo para decirme si te gustó este post.