Underc0de

Programación Scripting => Python => Mensaje iniciado por: ??????? en Julio 15, 2020, 03:11:21 AM

Título: Cifrado Katya
Publicado por: ??????? en Julio 15, 2020, 03:11:21 AM
Prefacio

Muy buenas a todos! Espero que estén muy bien.

Hoy les traigo un tipo de cifrado que he inventado, teniendo algunos procesos ya existentes como el CBC para mejorar el sistema de encriptado. No soy matemático, por lo que las fórmulas que he escrito para el mismo no son nada del otro mundo, son bastantes simples, incluso combinándolo con el cifrado afín. Así que no hay nada de magia por detrás (aunque pueden verlo así si quieren).

Así que sin más preámbulos, comencemos.


¿Que es Katya?

Katya es un algoritmo de cifrado simétrico simple desarrollado en Python.

Cómo funciona el cifrado?

Debido a que el proceso es bastante largo de explicar por acá, les invito a leer la documentación completa que les dejaré en un rato, para así no alargarme demasiado.  ;D ;D

Cómo descargar e instalar dependencias?

Para instalar las dependencias, tipeamos lo siguiente:

Código (bash) [Seleccionar]
pip install sympy

Al instalar las dependencias, como siempre, clonamos el repositorio y lógicamente, accedemos al directorio:


Código (bash) [Seleccionar]

git clone https://github.com/Kirari-Senpai/Katya-Crypt.git
cd Katya-Crypt/


Documentación completa: https://github.com/Kirari-Senpai/Katya-Crypt

Cómo se usa Katya?

Acá viene lo divertido  ;D. Abrimos nuestro intérprete de Python e importamos el módulo Katya:

Código (python) [Seleccionar]

from katya import Katya


Creamos el objeto katya:

Código (python) [Seleccionar]

katya = Katya()


Establecemos el abecedario (o como quieran llamarlo :p):

Código (python) [Seleccionar]

katya.set_ABC()


Se nos creará el siguiente abecedario:

(https://i.imgur.com/D4UwFjh.png)

Nota: por defecto el valor del método está en 0, por lo que si desea crear un ABC personalizado, entonces deberá pasarle una lista con una longitud de 91 elementos y los mismos no deben estar repetidos.

Ahora que tenemos todo preparado, empezaremos con el proceso de cifrado.

Cifrado

Para encriptar un mensaje, usaremos el método encrypt:

Parámetros:

- Cadena a cifrar
- Contraseña (menor o igual longitud que la cadena a cifrar)
- Vector de Inicialización (por defecto se genera de manera aleatoria, pero puede hacerlo usted mismo, aunque no es recomendable).


Código (python) [Seleccionar]

msg = katya.encrypt("Hola Mundo!","katya")


Salida:

(https://i.imgur.com/550mRQF.png)

Al momento de cifrar el mensaje, se generará el IV. Para poder verlo, solo escriba:

Código (python) [Seleccionar]

katya.iv


Se verá parecido a este, en longitud me refiero:

(https://i.imgur.com/vum9jek.png)

El mismo es importante, ya que servirá para descifrar el primer bloque del mensaje. Si no sabe a que me refiero, le dejo un link para que vea de que trata, ya que como dije en el prefacio, utiliza el modo de operación CBC:

https://es.wikipedia.org/wiki/Modos_de_operaci%C3%B3n_de_una_unidad_de_cifrado_por_bloques


Volviendo al tema de Katya... Vieron que es bastante simple? Pero eso no es todo, más adelante les mostraré otras funciones que tiene el mismo. Ahora vamos a desencriptar.

Descifrado

Para desencriptar el mensaje, usaremos el método decrypt():

Parámetros:

- Cadena *
- Contraseña *
- Vector de Inicialización (IV) usado para cifrar el primer bloque del mensaje *
- seed (lo veremos en la siguiente sección)
- subkey1 (lo veremos en la siguiente sección)
- subkey2 (lo veremos en la siguiente sección)


Código (python) [Seleccionar]
katya.decrypt("¿bbd¡#¿bch¡e¿bfa¡)¿bcg¡c¿bbh¡Y¿bbg¡*¿bcg¡X¿beh¡U¿bcg¡i¿bbd¡`¿bbd¡%¿bcg¡G¿bfb¡B¿bcg¡O¿bbg¡´¿bbd¡.¿bcg¡X¿bfa¡4¿bcf¡S¿bbh¡O","katya",katya.iv)

Salida:

(https://i.imgur.com/5urUFQa.png)


Necesito más seguridad, es posible?

Por supuesto! Hay varios métodos:

Método random_ABC() y set_seed()

Con el método random_ABC() alterarás el orden original del alfabeto, por lo que darás más dificultad al atacante para saber cuál es el orden correcto. De modo que al individuo que intenta desencriptar el mensaje, no le servirá de nada obtener la contraseña si no sabe el orden de los elementos.

La salida del mismo es la semilla, es decir, el número en el cual estará ordenado tu ABC:


(https://i.imgur.com/uFS5CjO.png)

Lo mismo podemos hacer con el método set_seed(). A diferencia del anterior, este es personalizado:

(https://i.imgur.com/Y3vgLyz.png)

Ejemplo sencillo

(https://i.imgur.com/tcT8ZJJ.png)

Y en efecto, se puede apreciar que la cadena de cifrado no es la misma que mostramos en el ejemplo anterior. Ahora, a descifrar, le pasamos como argumento seed, el valor entero obtenido:

(https://i.imgur.com/FRT4b3n.png)

El mismo ejemplo se puede aplicar también para el método set_seed().

Advertencia: hay que considerar que si pierde el numero de orden o semilla, entonces, no podrá recuperar la información al momento de querer descifrarla.


Método subkeys()

Con este método se puede establecer las dos subclaves de las que estábamos hablando antes. Bueno, con la primer subclave estableceremos un número coprimo con 91 y con la segunda un número de desplazamiento para la cadena misma. Veamos un ejemplo sencillo:

(https://i.imgur.com/kjoFxHZ.png)

Los parámetros del método son:

Parámetros

- subkey1
- subkey2

Si no tiene idea que número coprimo utilizar, no se preocupe, no tiene que calcular nada, puede utilizar el método show_possible_subkeys():

Código (python) [Seleccionar]
katya.show_possible_subkeys()

[1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 29, 30, 31, 32, 33, 34, 36, 37, 38, 40, 41, 43, 44, 45, 46, 47, 48, 50, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 64, 66, 67, 68, 69, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 83, 85, 86, 87, 88, 89, 90]


Los valores de la subclave 2 debe ser de 1 a 91.

Para desencriptar, solo pasamos los argumentos de la siguiente manera:


Código (python) [Seleccionar]
katya.decrypt(msg,"katya",katya.iv,subkey1=80,subkey2=10)

Muestra

(https://i.imgur.com/6krbX8F.png)

Si bien este último método no es muy seguro, se puede combinar con los métodos anteriores y así mejorar la seguridad. Eso suena bien eh? :o

Encriptar y desencriptar archivos

Advertencia: se recomienda utilizar el método reset_all() para reestablecer todos los valores (iv,subkeys,ABC) a su estado original para evitar conflictos al momento de cifrar los archivos. Esto es para que parezca que empieza de 0.

Katya nos permite cifrar archivos de una manera muy sencilla:

Código (python) [Seleccionar]
katya.file_encrypt("ruta_archivo","tu_password")

Al terminar el proceso, al archivo se le añadirá la extensión .katya y además se creará otro archivo con extensión .key donde se almacenará tu contraseña, a este último debes guardarlo en un lugar secreto.

Crearé un archivo de prueba llamado testing.txt con el contenido de "Hola Mundo!":

(https://i.imgur.com/9svIC9N.jpg)

Y empiezo a cifrar:

Código (python) [Seleccionar]
katya.file_encrypt("testing.txt","katya")

(https://i.imgur.com/Phx5AFH.jpg)

Para descifrar:

Código (python) [Seleccionar]
katya.file_decrypt("testing.txt.katya","katya.key")

La salida final será, obviamente, el contenido descifrado, y el archivo .key, se eliminará.

Nota: para file_decrypt() se pueden utilizar los mismos parámetros que el descifrado común.


Mostrar mensajes cifrados de manera elegante

Realmente este método no es importante, es solo para mostrar en pantalla el mensaje cifrado de una forma más clara, nada del otro mundo :p El fin, se usa de la siguiente manera:


Código (python) [Seleccionar]
print(katya.elegant(msg))

(https://i.imgur.com/xkPpemj.png)

En este ejemplo, cifré el siguiente mensaje:

Hola Mundo! Katya es un cifrado simétrico muy simple. Saludos a todos!

Final

Bueno compañeros, espero que les haya gustado  ;D. Simplemente después de un parcial, quise relajarme un poco, y se me vino a la cabeza esto, así que decidí programarlo y plasmarlo en el foro jaja.

Falta mucho por mejorar, pero se irá viendo poco a poco, cualquier aporte al mismo, es bienvenido!

Saludos!
-Kirari
Título: Re:Cifrado Katya
Publicado por: DtxdF en Julio 24, 2020, 04:53:50 PM
Uf compañero @Kirari (https://underc0de.org/foro/index.php?action=profile;u=92682), te luciste. Me encantó mucho, sin duda lo voy a compartir ^-^, espero más de tus aportes.

~ DtxdF
Título: Re:Cifrado Katya
Publicado por: ??????? en Julio 24, 2020, 05:09:51 PM
Muchaass gracias amigo @DtxdF (https://underc0de.org/foro/index.php?action=profile;u=71723)  ;D, es un place mostrar estos pequeños aportes :D.

Saludos!!
-Kirari
Título: Re:Cifrado Katya
Publicado por: Gabriela en Julio 24, 2020, 05:48:58 PM


@Kirari (https://underc0de.org/foro/index.php?action=profile;u=92682)
Como te han comentado, estupendo trabajo compañero!!!
Habrá que probarlo.

Por demás todo el marco teórico explicativo: 10.

Gracias por compartirlo.

Saludos
Gabriela
Título: Re:Cifrado Katya
Publicado por: ??????? en Julio 24, 2020, 05:57:32 PM
@Gabriela (https://underc0de.org/foro/index.php?action=profile;u=37488) Muchas gracias compañera  ;D ;D Trataré de traer posts más seguido.  :D

Saludos!
-Kirari