Skip to main content

Cifrado César con añadidos de fantasia, permite encriptar y desencriptar mensajes

Project description

Magical Cipher Disk

Tabla de Contenido

Errores Conocidos

Caracteres Especiales

Si el mensaje de entrada contiene caracteres especiales que no existen en el source alphabet pero si en el target alphabet, este no podra encriptar o desencriptar del todo corrrectamente los mensajes, aunque no es un efecto que rompe el cifrado, si genera ruido o pequeños errores. Un ejemplo de esto es tener los alfabetos asi al configurar el 'Cipher':

source_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
target_alphabet = "123456789?[]&,BCDEFGHIJKLM"

... (Resto de la configuracion)

Mensaje = "Hola, Buenás tardes, o es de dia?"

save_result = True

cipher_text = cipher.Encrypt(Mensaje,save_result)
# resultado = J18&, 4]5[?4 E&BG54, M 23 G5 GL&?

decipher_text = cipher.Decrypt(cipher_text,save_result)
# resultado = HOLAK SDVWRB KJIMVBB O ES DE DIAA

# La , paso a ser K y las demas igual cambiaron

El resultado seria un cifrado normal, pero si se quiere desencriptar es cuando el problema sucederia. Pues caracteres como , o ? existirian en el mensaje cifrado, pero tambien en el alfabeto creando un bug porque el programa no sabe si estos pertenecian al mensaje original o son parte del cifrado.

Se esta buscando una manera de resolver / manejar esto.

Inspiración

Este proyecto surgio por la necesidad de tener que encriptar mensajes para mis jugadores de D&D, queria hacer cifrados pero con añadidos de fantasia, si bien podria haberlos hecho a mano, teniendo este proyecto todo eso me resutlaria mas facil.

Esta basado en el Cifrado de César, simples discos que rotan y usan un Index para determinar el cifrado.

Las mecanicas añadidas son en base a fantasia, con piedras magicas que actuan como transformadores extra o aplican reglas especiales.

Mécanicas

Este cifrado tiene 4 mecanicas.

Stones

Las mas importantes, definen mayormente las reglas y comportamiento del cifrado, desde si debe hacerse o debe saltarse, debe cambiarse la letra ciertas posiciones, o incluso cambiarse por la letra al lado contrario del disco.

Por ahora hay 3 tipos de colores, y este color es el que dicta esas reglas.

  • YELLOW: Bateria del cifrado, si esta no esta presente entonces ninguna otra piedra se activara.

  • RED-GREEN: Es como una moneda de 2 caras, cambiara la letra por una posicion en sentido del reloj o a la inversa.

  • BLUE: Cambiara la letra por la opuesta en el disco.

Cada piedra puede tener un valor, que servira para una u otra cosa en esa piedra.

  • YELLOW: Cada cuanto se activaran las demas piedras, si su valor es 3 entonces cada 3 letras aplicaran las demas piedras. Su valor maximo sera 4 y si sobrepasa este numero sera como comenzar el conteo denuevo. Por ejemplo 7 sera 3 y 9 sera 1. Este servira como un Tempo.

  • RED-GREEN: Cuantas posiciones se añadiran a la letra para cambiar su valor. Puede ser negavito o positivo.

  • Blue: Sera un Tempo propio, cada vez que se cumpla ese tempo la letra se cambiara por su opuesto en el disco.

De esta manera, cada 2 letras se aplicaran las piedras.

stone_yellow = YellowStone(2)
stone_redgreen = RedGreenStone(3)
stone_blue = BlueStone(4)

Stone Holder

Encargado de aplicar las piedras y de llevar un control sobre cada paso realizado.

Aqui se guardaran todas las piedras que quieras aplicar a cierto cifrado.

stone_holder_1 = StoneHolder([
    stone_yellow,
    stone_redgreen,
    stone_blue
])

Disk

Representa uno de los discos del cifrado, especificamente el disco con los caracteres que seran el resultado de la encriptacion.

Un añadido propio a esta mecanica basada en la de César, es que cada disco es como un rompecabezas, que puede estar separado en partes y ordenarse de la manera que se guste despues. como si pasaras de la A-Z en un solo disco a tener A-G, P-Z, H-O. y asi tener un disco de 3 partes y ordenado de manera diferente.

Cada disco que quieras crear tendra que constar con 3 ajustes, el alfabeto, los splits y la seed.

  • Alfabeto: El alfabeto que sera el que sustituira las letras del texto original, ya sea de A-Z o con caracteres especiales como "#?![}.," y demas.

  • Splits: Es una lista de int, cada int dentro de esta lista sera la cantidad de caracteres que determinaran el tamaño de esa parte del disco, si el alfabeto es mas grande y sobras letras entonces se creara un loop usando esa misma lista repetidamente, hasta que no queden mas.

seed: Una semilla para que la parte randomizada pueda replicarse si se necesita.

disk_1 = Disk(
    alphabet = "¿#CDEFGHIJK[}*OPQRSTU?!XYZ",
    splits = [6,7],
    seed = 2025
)

Cipher

La base de todo, no hay mucho que decir de esta parte mas alla de que es donde configuraras el cifrado para su encriptacion o desencriptacion.

Aqui le daras todo lo creado anteriormente para que el cipher este completo.

cipher = Cipher(
    disk = disk_1,
    stone_holder = stone_holder_1,
    seed = 2025,
)

Ademas para configurar el alfabeto que se usara en el mensaje original, y el orden del Disk asi como su Index. Esto es necesario para el cifrado aunque por default tiene valores aleatorios, exceptuando el alfabeto que por default sera el normal de A-Z.

cipher.config_cipher(
    source_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    disk_order = ['XS', '¿R', 'O[', 'J#'],
    disk_index = ('Q', 'X')
)

De esta manera el cipher ya habria quedado configurado para su uso, solo quedaria darle un mensaje para encriptarlo o desencriptarlo.

Ademas de decidir si ese mensaje se guarda o no, usando un True o False.

Lo cual podria quedar asi.

mensaje = "Good Morning/Evening GitHub user"

mensaje_encriptado = cipher.Encrypt(mensaje,True)

mensaje_desencriptado = cipher.Decrypt(mensaje_encriptado,False)

Esto procederia a guardarse en un log, para poder ver toda la configuracion del cifrado, tanto las piedras como el disco.

Ejemplo Completo

stone_yellow = YellowStone(2)
stone_redgreen = RedGreenStone(3)
stone_blue = BlueStone(4)

stone_holder_1 = StoneHolder([
    stone_yellow,
    stone_redgreen,
    stone_blue
])

disk_1 = Disk(
    alphabet = "¿#CDEFGHIJK[}*OPQRSTU?!XYZ",
    splits = [6,7],
    seed = 2025
)

cipher = Cipher(
    disk = disk_1,
    stone_holder = stone_holder_1,
    seed = 2025,
)

cipher.config_cipher(
    source_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
    disk_order = ['XS', '¿R', 'O[', 'J#'],
    disk_index = ('Q', 'X')
)

mensaje = "Good Morning/Evening GitHub user"

mensaje_encriptado = cipher.Encrypt(mensaje)

mensaje_desencriptado = cipher.Decrypt(mensaje_encriptado)

CipherIO

Al final el mensaje sera guardado en un Log, por default en una carpeta que creara llamada "Messages/Encrypted" o "Messages/Decrypted"

Aqui se guardaran las configuraciones usadas tanto de las Piedras como del Cifrado y sus alfabetos y demas.

usando el CipherIO puedes configurar esta ruta, aunque solo hace esto por ahora, a futuro añadire mas funciones a esta parte.

Ademas tendra que ser añadido a la configuracion del cipher para que este comience a usarlo.

logger_1 = CipherIO(
    base_path = "./Messages"
)

cipher = Cipher(
    disk = disk_1,
    stone_holder = stone_holder_1,
    seed = 2025,
    logger = logger_1
)

Changelog

Puedes consultar los cambios y versiones en el archivo CHANGELOG.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

magical_cipher_disk-2.1.0.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

magical_cipher_disk-2.1.0-py3-none-any.whl (19.2 kB view details)

Uploaded Python 3

File details

Details for the file magical_cipher_disk-2.1.0.tar.gz.

File metadata

  • Download URL: magical_cipher_disk-2.1.0.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.19

File hashes

Hashes for magical_cipher_disk-2.1.0.tar.gz
Algorithm Hash digest
SHA256 48121776cf50745ceb4d1f00ea791c7bc40c20d516c9965be5c845b2c2cd6483
MD5 0adf63054b4e1670e2508f2b052799c9
BLAKE2b-256 be2f19c25c06c877ef9e37ad80126981dcf37e4cd0c0ef467398d4313ddeeaa9

See more details on using hashes here.

File details

Details for the file magical_cipher_disk-2.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for magical_cipher_disk-2.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea509125eccd8dc667645902638032cb9423d3067fe93e6dd66c2a77508d24aa
MD5 71a476b9cabff267edb38b3f828c5b87
BLAKE2b-256 22145c4cb459bcaaabec1382e79216d8d92ae46caeeab1328b9136b42c8f9b97

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page