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.0.1.tar.gz (14.3 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.0.1-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for magical_cipher_disk-2.0.1.tar.gz
Algorithm Hash digest
SHA256 862cad20bc8afcd7d3c26ed446311e5753da5d29ebbf28a4c19eb11a7f7ff314
MD5 281316a6afaaaa933191f7182af941df
BLAKE2b-256 6859c8b0c36c60cdd123ceb5da068f96e90e5a1819d5e21fe0699c2a28ab225b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for magical_cipher_disk-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 72d2ad67153935576edd22d0b67899ae2794cb40d093a49c65aa3498a3d793e2
MD5 589528706b20bc266e3e20b7bda8c3e9
BLAKE2b-256 828f2910dd9ad2da342d5617c164be85a235b407b737c88e25b0accc4e4a901e

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