Cifrado Katya

Iniciado por ???????, Julio 15, 2020, 03:11:21 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 15, 2020, 03:11:21 AM Ultima modificación: Julio 15, 2020, 03:15:01 AM por Kirari
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
pip install sympy


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


Código: bash

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


Documentación completa: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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

from katya import Katya


Creamos el objeto katya:

Código: python

katya = Katya()


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

Código: python

katya.set_ABC()


Se nos creará el siguiente abecedario:



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

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


Salida:



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

Código: python

katya.iv


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



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:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


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
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:




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:




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



Ejemplo sencillo



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:



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:



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
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
katya.decrypt(msg,"katya",katya.iv,subkey1=80,subkey2=10)


Muestra



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
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!":



Y empiezo a cifrar:

Código: python
katya.file_encrypt("testing.txt","katya")




Para descifrar:

Código: python
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
print(katya.elegant(msg))




En este ejemplo, cifré el siguiente mensaje:

Código: php
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

Uf compañero @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, te luciste. Me encantó mucho, sin duda lo voy a compartir ^-^, espero más de tus aportes.

~ DtxdF
PGP :: <D82F366940155CB043147178C4E075FC4403BDDC>

~ DtxdF

Muchaass gracias amigo @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta  ;D, es un place mostrar estos pequeños aportes :D.

Saludos!!
-Kirari



@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
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ú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Muchas gracias compañera  ;D ;D Trataré de traer posts más seguido.  :D

Saludos!
-Kirari