# Magic-Cipher-Disk
Es un pequeño proyecto hecho para facilitarme la vida al jugar D&D con mis amigos, siendo el DM he preparado cosas para la diversión de ambas partes y como a algunos de ellos les gusta descifrar mensajes fue que programe esto y así encriptar mensajes incluso a media partida.
## Inspiración
Este cifrado esta basado en el Cifrado de César, es casi exactamente igual en la base.
Sin embargo para añadirle el toque de fantasía, añadí una mecánica con unas "Piedras" de colores, estas las explicare mas adelante pero su función es cambiar partes del cifrado, como añadir que la posición sea unas cuantas mas o unas cuantas menos, o que la posición sea la opuesta en el Disco.
Pienso añadir mas mecánicas a este "minijuego", como podría ser mas piedras con efectos diferentes o incluso mas partes.
# Partes
## Discos
El cifrado consta de dos Discos, cada uno con un alfabeto que puede ser proporcionado y personalizado, no solo con letras o números sino otros tipos de caracteres especiales.
El alfabeto de ambos discos puede ser proporcionado a su función correspondiente, y puede ser el mismo o diferente. Ambos discos pueden configurarse, sin embargo solo el interior, el cual servirá como el alfabeto encriptado, es el que se configurara con la siguiente función.
```python
disco_interior = Magical_Cipher_Disk.Disk('ABCDEFGHIJKLMNOPQRSTUVWXYZ').Create_Disk()
```
Por otro lado el alfabeto que servirá como el "normal" o aquel que no esta encriptado se proporcionara mas adelante en una función cuando creemos y configuremos el "Cipher".
## Piedras
Hay varios tipos de piedras, cada una con su función y color respectivo. Además de que cada una sirve en una jerarquía y orden, siendo la amarilla la mas importante.
Por ahora se tienen:
- **Amarilla** :: Sirve como la piedra de energía, si no hay una presente ninguna otra piedra tendrá alguna función. Además el valor que se le de a esta piedra servirá como el "tempo" de cada cuanto se activaran las otras piedras. Si su valor es 3, entonces cada 3 letras se activaran y harán su función las demás.
- **Roja-Verde** :: Esta es como una moneda de dos caras, una roja y otra verde, su función es simple pues dependiendo del valor que se le de, esta añadirá o restara posiciones al cifrado de la letra.
- **Azul** :: Cuando esta actúe la letra pasara a ser la del lado opuesto del disco, significando que se añadirá 13 posiciones adelante de donde debería estar. Como si añadieras una piedra verde con valor 13. Sin embargo esta tiene un "tempo" propio que dependerá de su valor, pues actuara cada ciertas letras como su valor tenga, igual que la **Piedra Amarilla**, pero solo sumara el "tempo" con cada letra que se le pase. Significa que no seguirá contando si la piedra amarilla no dejo pasar alguna letra.
Las piedras se configuran de esta manera en el programa.
```python
piedras = Magical_Cipher_Disk.Stones([("YELLOW",1),('RED-GREEN',2),("BLUE",1)])
```
Dando una lista que contiene las tuplas de una piedra con su nombre y valor,
## Estructura Central
**IMPORTANTE** :: Esta pieza es Teórica en el programa, solo "existe" en la versión dibujada a mis jugadores, pero sigue existiendo su mecánica en el programa, pues es donde las piedras se colocan y "configuran" como se muestra en la parte de arriba.
Esta pieza es un circulo completo y relleno, en el centro de todo el mecanismo, y consta de un hueco en el centro y aparte una separación de 4 partes en su parte solida.
### Uso
- **Valor de las piedras** :: En esta estructura en las 4 partes hay pequeños huecos para colocar las **Piedras**, y cada una de las 4 partes tiene un valor, siendo 1 :: 2 :: 3 :: 4 exactamente, en orden de reloj. Cuando una **Piedra** se coloca en alguna de estos huecos, dependiendo en que parte este esta tendrá ese valor, siendo por lo cual 4 el máximo para una sola piedra. Sin embargo si tienes mas de una misma piedra puedes colocarlas y darle mas valor.
- **Hueco Central** :: Este es donde la piedra amarilla iría, y el valor se le da dependiendo de hacia donde este viendo la piedra con su parte "norte" funcionando como una brújula. Esta su valor máximo en todas las ocasiones es 4 y el mínimo es 1. Si se intenta dar un valor mas alla de 4 funcionara como un reloj y pasara al siguiente, si se da un 5 será 1.
# Funcionamiento Completo
## Importación
```python
import Magical_Cipher_Disk as mcd
```
## Creación del disco Interior
```python
regular_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
disk = mcd.Disk(alphabet=regular_alphabet).Create_Disk()
```
- Esto puede modificarse de igual manera para añadir separaciones de letras especificas, como por ejemplo:
```python
splits = [6,7]
disk = mcd.Disk(alphabet=regular_alphabet,split_list=splits).Create_Disk()
```
- También puede configurarse la serie del disco, la cual sirve para que la creación del disco sea exactamente igual en todo momento, como una semilla.
```python
disk_serie = "71298SCDFKQJAC"
disk = mcd.Disk(alphabet=regular_alphabet,split_list=splits,disk_serie=disk_serie).Create_Disk()
```
## Creación de piedras
```python
stones = mcd.Stones([("YELLOW",1),('RED-GREEN',2),("BLUE",1)])
```
## Creación del Cifrador
- Se crea el cifrador con el disco interior y las piedras proporcionadas
```python
cipher = mcd.Cipher(disk=disk,stones=stones)
```
- En el cifrador creado configuramos ahora el disco exterior y el índice con el que se compararan ambos discos
```python
cipher.config_comparative_alphabet(disk_index=['J','A'],comparative_alphabet=regular_alphabet)
```
- También podemos configurar el orden con el que las partes del disco interior se ordenaran, esto provoca mayor complejidad al cifrar o descifrar mensajes
- Este **disk_order** viene de los indices de cada parte en el disco, los cuales puedes obtener con **get_id() en tu objeto disk**
- Una ves conociendo eso, puedes ordenarlos como gustes
```python
disk_order = ['UJ','QW','TH','BF']
cipher.config_comparative_alphabet(disk_index=['J','A'],comparative_alphabet=regular_alphabet,disk_order=disk_order)
```
- Por ultimo, encriptar o desencriptar el mensaje
- El valor True, es para determinar si el texto deberá ser desencriptado, pero solo podrá ser desencriptado si se conoce la configuración inicial
```python
cipher.Encrypt('normal_text')
cipher.Encrypt('encrypted_text',True)
```
## Guardar Configuracion
- Al final, cuando hayas encriptado un mensaje, podrás guardarlo junto con toda su configuración para futuro uso.
- Puedes proporcionar una dirección especifica, así como el contexto del archivo, este contexto sirve como parte del nombre del archivo.
- El cual será guardado de esta manera :: 'Serie-del-disco_Contexto-Del-Archivo_Numero-de-archivo.txt' aunque esto podrá cambiar a futuro
```python
cipher.save_encrypted(path='./Messages',context='Contexto_Del_Archivo')
```
# To-do
- [ ] Versión Ingles del README.md
- [ ] Imágenes para mayor comprensión
- [ ] Programa/app del disco interactivo
Raw data
{
"_id": null,
"home_page": "https://github.com/FrederickKnight/Magical_Cipher_Disk",
"name": "Magical-Cipher-Disk",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.12",
"maintainer_email": null,
"keywords": "python, cipher, encrypted, disk, magic, D&D",
"author": "John Frederick Knight Berra / FrederickKnight",
"author_email": "<infisefir@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/f1/b4/e9a054b2a0f0632217a0d9aa61318aa6e1772e6756983c20068982c910ef/magical_cipher_disk-0.1.0.tar.gz",
"platform": null,
"description": "\r\n# Magic-Cipher-Disk\r\r\n\r\r\nEs un peque\u00f1o proyecto hecho para facilitarme la vida al jugar D&D con mis amigos, siendo el DM he preparado cosas para la diversi\u00f3n de ambas partes y como a algunos de ellos les gusta descifrar mensajes fue que programe esto y as\u00ed encriptar mensajes incluso a media partida.\r\r\n\r\r\n## Inspiraci\u00f3n\r\r\n\r\r\nEste cifrado esta basado en el Cifrado de C\u00e9sar, es casi exactamente igual en la base.\r\r\n\r\r\nSin embargo para a\u00f1adirle el toque de fantas\u00eda, a\u00f1ad\u00ed una mec\u00e1nica con unas \"Piedras\" de colores, estas las explicare mas adelante pero su funci\u00f3n es cambiar partes del cifrado, como a\u00f1adir que la posici\u00f3n sea unas cuantas mas o unas cuantas menos, o que la posici\u00f3n sea la opuesta en el Disco.\r\r\n\r\r\nPienso a\u00f1adir mas mec\u00e1nicas a este \"minijuego\", como podr\u00eda ser mas piedras con efectos diferentes o incluso mas partes.\r\r\n\r\r\n# Partes\r\r\n\r\r\n## Discos\r\r\n\r\r\nEl cifrado consta de dos Discos, cada uno con un alfabeto que puede ser proporcionado y personalizado, no solo con letras o n\u00fameros sino otros tipos de caracteres especiales.\r\r\n\r\r\nEl alfabeto de ambos discos puede ser proporcionado a su funci\u00f3n correspondiente, y puede ser el mismo o diferente. Ambos discos pueden configurarse, sin embargo solo el interior, el cual servir\u00e1 como el alfabeto encriptado, es el que se configurara con la siguiente funci\u00f3n.\r\r\n\r\r\n```python\r\r\ndisco_interior = Magical_Cipher_Disk.Disk('ABCDEFGHIJKLMNOPQRSTUVWXYZ').Create_Disk()\r\r\n```\r\r\n\r\r\nPor otro lado el alfabeto que servir\u00e1 como el \"normal\" o aquel que no esta encriptado se proporcionara mas adelante en una funci\u00f3n cuando creemos y configuremos el \"Cipher\".\r\r\n\r\r\n## Piedras\r\r\n\r\r\nHay varios tipos de piedras, cada una con su funci\u00f3n y color respectivo. Adem\u00e1s de que cada una sirve en una jerarqu\u00eda y orden, siendo la amarilla la mas importante.\r\r\n\r\r\nPor ahora se tienen:\r\r\n- **Amarilla** :: Sirve como la piedra de energ\u00eda, si no hay una presente ninguna otra piedra tendr\u00e1 alguna funci\u00f3n. Adem\u00e1s el valor que se le de a esta piedra servir\u00e1 como el \"tempo\" de cada cuanto se activaran las otras piedras. Si su valor es 3, entonces cada 3 letras se activaran y har\u00e1n su funci\u00f3n las dem\u00e1s. \r\r\n- **Roja-Verde** :: Esta es como una moneda de dos caras, una roja y otra verde, su funci\u00f3n es simple pues dependiendo del valor que se le de, esta a\u00f1adir\u00e1 o restara posiciones al cifrado de la letra.\r\r\n- **Azul** :: Cuando esta act\u00fae la letra pasara a ser la del lado opuesto del disco, significando que se a\u00f1adir\u00e1 13 posiciones adelante de donde deber\u00eda estar. Como si a\u00f1adieras una piedra verde con valor 13. Sin embargo esta tiene un \"tempo\" propio que depender\u00e1 de su valor, pues actuara cada ciertas letras como su valor tenga, igual que la **Piedra Amarilla**, pero solo sumara el \"tempo\" con cada letra que se le pase. Significa que no seguir\u00e1 contando si la piedra amarilla no dejo pasar alguna letra.\r\r\n\r\r\nLas piedras se configuran de esta manera en el programa.\r\r\n\r\r\n```python\r\r\npiedras = Magical_Cipher_Disk.Stones([(\"YELLOW\",1),('RED-GREEN',2),(\"BLUE\",1)])\r\r\n```\r\r\n\r\r\nDando una lista que contiene las tuplas de una piedra con su nombre y valor, \r\r\n\r\r\n## Estructura Central\r\r\n\r\r\n**IMPORTANTE** :: Esta pieza es Te\u00f3rica en el programa, solo \"existe\" en la versi\u00f3n dibujada a mis jugadores, pero sigue existiendo su mec\u00e1nica en el programa, pues es donde las piedras se colocan y \"configuran\" como se muestra en la parte de arriba.\r\r\n\r\r\nEsta pieza es un circulo completo y relleno, en el centro de todo el mecanismo, y consta de un hueco en el centro y aparte una separaci\u00f3n de 4 partes en su parte solida.\r\r\n\r\r\n### Uso\r\r\n\r\r\n- **Valor de las piedras** :: En esta estructura en las 4 partes hay peque\u00f1os huecos para colocar las **Piedras**, y cada una de las 4 partes tiene un valor, siendo 1 :: 2 :: 3 :: 4 exactamente, en orden de reloj. Cuando una **Piedra** se coloca en alguna de estos huecos, dependiendo en que parte este esta tendr\u00e1 ese valor, siendo por lo cual 4 el m\u00e1ximo para una sola piedra. Sin embargo si tienes mas de una misma piedra puedes colocarlas y darle mas valor.\r\r\n- **Hueco Central** :: Este es donde la piedra amarilla ir\u00eda, y el valor se le da dependiendo de hacia donde este viendo la piedra con su parte \"norte\" funcionando como una br\u00fajula. Esta su valor m\u00e1ximo en todas las ocasiones es 4 y el m\u00ednimo es 1. Si se intenta dar un valor mas alla de 4 funcionara como un reloj y pasara al siguiente, si se da un 5 ser\u00e1 1.\r\r\n\r\r\n# Funcionamiento Completo\r\r\n\r\r\n## Importaci\u00f3n\r\r\n\r\r\n```python\r\r\nimport Magical_Cipher_Disk as mcd\r\r\n\r\r\n```\r\r\n\r\r\n## Creaci\u00f3n del disco Interior\r\r\n\r\r\n```python\r\r\nregular_alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\r\r\n\r\r\ndisk = mcd.Disk(alphabet=regular_alphabet).Create_Disk()\r\r\n```\r\r\n\r\r\n- Esto puede modificarse de igual manera para a\u00f1adir separaciones de letras especificas, como por ejemplo:\r\r\n\r\r\n```python\r\r\nsplits = [6,7]\r\r\n\r\r\ndisk = mcd.Disk(alphabet=regular_alphabet,split_list=splits).Create_Disk()\r\r\n```\r\r\n\r\r\n- Tambi\u00e9n puede configurarse la serie del disco, la cual sirve para que la creaci\u00f3n del disco sea exactamente igual en todo momento, como una semilla.\r\r\n\r\r\n```python\r\r\ndisk_serie = \"71298SCDFKQJAC\"\r\r\ndisk = mcd.Disk(alphabet=regular_alphabet,split_list=splits,disk_serie=disk_serie).Create_Disk()\r\r\n```\r\r\n\r\r\n\r\r\n## Creaci\u00f3n de piedras\r\r\n\r\r\n```python\r\r\nstones = mcd.Stones([(\"YELLOW\",1),('RED-GREEN',2),(\"BLUE\",1)])\r\r\n```\r\r\n\r\r\n## Creaci\u00f3n del Cifrador\r\r\n\r\r\n- Se crea el cifrador con el disco interior y las piedras proporcionadas\r\r\n\r\r\n```python\r\r\ncipher = mcd.Cipher(disk=disk,stones=stones)\r\r\n```\r\r\n\r\r\n- En el cifrador creado configuramos ahora el disco exterior y el \u00edndice con el que se compararan ambos discos\r\r\n\r\r\n```python\r\r\ncipher.config_comparative_alphabet(disk_index=['J','A'],comparative_alphabet=regular_alphabet)\r\r\n```\r\r\n\r\r\n- Tambi\u00e9n podemos configurar el orden con el que las partes del disco interior se ordenaran, esto provoca mayor complejidad al cifrar o descifrar mensajes\r\r\n- Este **disk_order** viene de los indices de cada parte en el disco, los cuales puedes obtener con **get_id() en tu objeto disk**\r\r\n- Una ves conociendo eso, puedes ordenarlos como gustes\r\r\n\r\r\n```python\r\r\ndisk_order = ['UJ','QW','TH','BF']\r\r\ncipher.config_comparative_alphabet(disk_index=['J','A'],comparative_alphabet=regular_alphabet,disk_order=disk_order)\r\r\n```\r\r\n\r\r\n- Por ultimo, encriptar o desencriptar el mensaje\r\r\n- El valor True, es para determinar si el texto deber\u00e1 ser desencriptado, pero solo podr\u00e1 ser desencriptado si se conoce la configuraci\u00f3n inicial\r\r\n\r\r\n```python\r\r\ncipher.Encrypt('normal_text')\r\r\ncipher.Encrypt('encrypted_text',True)\r\r\n```\r\r\n\r\r\n## Guardar Configuracion\r\r\n\r\r\n- Al final, cuando hayas encriptado un mensaje, podr\u00e1s guardarlo junto con toda su configuraci\u00f3n para futuro uso.\r\r\n- Puedes proporcionar una direcci\u00f3n especifica, as\u00ed como el contexto del archivo, este contexto sirve como parte del nombre del archivo.\r\r\n- El cual ser\u00e1 guardado de esta manera :: 'Serie-del-disco_Contexto-Del-Archivo_Numero-de-archivo.txt' aunque esto podr\u00e1 cambiar a futuro\r\r\n\r\r\n```python\r\r\ncipher.save_encrypted(path='./Messages',context='Contexto_Del_Archivo')\r\r\n```\r\r\n\r\r\n# To-do\r\r\n\r\r\n- [ ] Versi\u00f3n Ingles del README.md\r\r\n- [ ] Im\u00e1genes para mayor comprensi\u00f3n\r\r\n- [ ] Programa/app del disco interactivo\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Cifrado C\u00e9sar con a\u00f1adidos de fantasia, permite encriptar y desencriptar mensajes",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/FrederickKnight/Magical_Cipher_Disk"
},
"split_keywords": [
"python",
" cipher",
" encrypted",
" disk",
" magic",
" d&d"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "2164854ffcde245622f6622026d86e8e9ff7901e8c83f68b3797ce0f184cf22b",
"md5": "d3059c906f84acc3744c1de730a86da3",
"sha256": "41b2fece85f45546d328b25cdcf5a1e066b049549082e5038c2e387ae9b24e78"
},
"downloads": -1,
"filename": "Magical_Cipher_Disk-0.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d3059c906f84acc3744c1de730a86da3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.12",
"size": 10162,
"upload_time": "2024-11-29T23:02:17",
"upload_time_iso_8601": "2024-11-29T23:02:17.214813Z",
"url": "https://files.pythonhosted.org/packages/21/64/854ffcde245622f6622026d86e8e9ff7901e8c83f68b3797ce0f184cf22b/Magical_Cipher_Disk-0.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f1b4e9a054b2a0f0632217a0d9aa61318aa6e1772e6756983c20068982c910ef",
"md5": "5d37a52a9bb41e4abb101ce52b48383b",
"sha256": "0f2dcf05f27917e8e565d55f776ecbb9dcc652c026030357c3ce0b27397d006a"
},
"downloads": -1,
"filename": "magical_cipher_disk-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "5d37a52a9bb41e4abb101ce52b48383b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.12",
"size": 9486,
"upload_time": "2024-11-29T23:02:44",
"upload_time_iso_8601": "2024-11-29T23:02:44.593584Z",
"url": "https://files.pythonhosted.org/packages/f1/b4/e9a054b2a0f0632217a0d9aa61318aa6e1772e6756983c20068982c910ef/magical_cipher_disk-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-29 23:02:44",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "FrederickKnight",
"github_project": "Magical_Cipher_Disk",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "magical-cipher-disk"
}