Magical_Cipher_Disk


NameMagical_Cipher_Disk JSON
Version 2.1.0 PyPI version JSON
download
home_pageNone
SummaryCifrado César con añadidos de fantasia, permite encriptar y desencriptar mensajes
upload_time2025-07-28 05:23:05
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseMIT License Copyright (c) 2024 John Frederick Knight Berra Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords python cipher encrypted disk magic d&d
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Magical Cipher Disk

## Tabla de Contenido

- [Errores Conocidos](#errores-conocidos)
    - [Caracteres Especiales](#caracteres-especiales) 
- [Inspiración](#inspiración)
- [Mécanicas](#mécanicas)
    - [Stones](#stones)
    - [Stone Holder](#stone-holder)
    - [Disk](#disk)
    - [Cipher](#cipher)
- [Ejemplo Completo](#ejemplo-completo)
- [CipherIO](#cipherio)
- [Changelog](#changelog)

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

```python
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.

```python
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.

```python
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.

```python
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.

```python
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.

```python
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.

```python
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 
```python
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.

```python
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](./CHANGELOG.md).

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "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": null,
    "author_email": "John Frederick Knight Berra / FrederickKnight <infisefir@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/be/2f/19c25c06c877ef9e37ad80126981dcf37e4cd0c0ef467398d4313ddeeaa9/magical_cipher_disk-2.1.0.tar.gz",
    "platform": null,
    "description": "# Magical Cipher Disk\r\n\r\n## Tabla de Contenido\r\n\r\n- [Errores Conocidos](#errores-conocidos)\r\n    - [Caracteres Especiales](#caracteres-especiales) \r\n- [Inspiraci\u00f3n](#inspiraci\u00f3n)\r\n- [M\u00e9canicas](#m\u00e9canicas)\r\n    - [Stones](#stones)\r\n    - [Stone Holder](#stone-holder)\r\n    - [Disk](#disk)\r\n    - [Cipher](#cipher)\r\n- [Ejemplo Completo](#ejemplo-completo)\r\n- [CipherIO](#cipherio)\r\n- [Changelog](#changelog)\r\n\r\n## Errores Conocidos\r\n\r\n### Caracteres Especiales\r\n\r\nSi 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\u00f1os errores.\r\nUn ejemplo de esto es tener los alfabetos asi al configurar el 'Cipher':\r\n\r\n```python\r\nsource_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\r\ntarget_alphabet = \"123456789?[]&,BCDEFGHIJKLM\"\r\n\r\n... (Resto de la configuracion)\r\n\r\nMensaje = \"Hola, Buen\u00e1s tardes, o es de dia?\"\r\n\r\nsave_result = True\r\n\r\ncipher_text = cipher.Encrypt(Mensaje,save_result)\r\n# resultado = J18&, 4]5[?4 E&BG54, M 23 G5 GL&?\r\n\r\ndecipher_text = cipher.Decrypt(cipher_text,save_result)\r\n# resultado = HOLAK SDVWRB KJIMVBB O ES DE DIAA\r\n\r\n# La , paso a ser K y las demas igual cambiaron\r\n```\r\nEl resultado seria un cifrado normal, pero si se quiere desencriptar es cuando el problema sucederia.\r\nPues 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.\r\n\r\nSe esta buscando una manera de resolver / manejar esto.\r\n\r\n## Inspiraci\u00f3n\r\n\r\nEste proyecto surgio por la necesidad de tener que encriptar mensajes para mis jugadores de D&D, queria hacer cifrados pero con a\u00f1adidos de fantasia, si bien podria haberlos hecho a mano, teniendo este proyecto todo eso me resutlaria mas facil.\r\n\r\nEsta basado en el Cifrado de C\u00e9sar, simples discos que rotan y usan un Index para determinar el cifrado.\r\n\r\nLas mecanicas a\u00f1adidas son en base a fantasia, con piedras magicas que actuan como transformadores extra o aplican reglas especiales.\r\n\r\n## M\u00e9canicas\r\n\r\nEste cifrado tiene 4 mecanicas.\r\n\r\n### Stones\r\n\r\nLas 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.\r\n\r\nPor ahora hay 3 tipos de colores, y este color es el que dicta esas reglas.\r\n\r\n- YELLOW: Bateria del cifrado, si esta no esta presente entonces ninguna otra piedra se activara.\r\n\r\n- RED-GREEN: Es como una moneda de 2 caras, cambiara la letra por una posicion en sentido del reloj o a la inversa.\r\n\r\n- BLUE: Cambiara la letra por la opuesta en el disco.\r\n\r\nCada piedra puede tener un valor, que servira para una u otra cosa en esa piedra.\r\n\r\n- 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.\r\n\r\n- RED-GREEN: Cuantas posiciones se a\u00f1adiran a la letra para cambiar su valor. Puede ser negavito o positivo.\r\n\r\n- Blue: Sera un Tempo propio, cada vez que se cumpla ese tempo la letra se cambiara por su opuesto en el disco.\r\n\r\nDe esta manera, cada 2 letras se aplicaran las piedras.\r\n\r\n```python\r\nstone_yellow = YellowStone(2)\r\nstone_redgreen = RedGreenStone(3)\r\nstone_blue = BlueStone(4)\r\n```\r\n\r\n## Stone Holder\r\n\r\nEncargado de aplicar las piedras y de llevar un control sobre cada paso realizado.\r\n\r\nAqui se guardaran todas las piedras que quieras aplicar a cierto cifrado.\r\n\r\n```python\r\nstone_holder_1 = StoneHolder([\r\n    stone_yellow,\r\n    stone_redgreen,\r\n    stone_blue\r\n])\r\n```\r\n\r\n## Disk\r\n\r\nRepresenta uno de los discos del cifrado, especificamente el disco con los caracteres que seran el resultado de la encriptacion.\r\n\r\nUn a\u00f1adido propio a esta mecanica basada en la de C\u00e9sar, 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.\r\n\r\nCada disco que quieras crear tendra que constar con 3 ajustes, el alfabeto, los splits y la seed.\r\n\r\n- 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.\r\n\r\n- Splits: Es una lista de int, cada int dentro de esta lista sera la cantidad de caracteres que determinaran el tama\u00f1o 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.\r\n\r\nseed: Una semilla para que la parte randomizada pueda replicarse si se necesita.\r\n\r\n```python\r\ndisk_1 = Disk(\r\n    alphabet = \"\u00bf#CDEFGHIJK[}*OPQRSTU?!XYZ\",\r\n    splits = [6,7],\r\n    seed = 2025\r\n)\r\n```\r\n\r\n## Cipher\r\n\r\nLa 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.\r\n\r\nAqui le daras todo lo creado anteriormente para que el cipher este completo.\r\n\r\n```python\r\ncipher = Cipher(\r\n    disk = disk_1,\r\n    stone_holder = stone_holder_1,\r\n    seed = 2025,\r\n)\r\n```\r\n\r\nAdemas 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.\r\n\r\n```python\r\ncipher.config_cipher(\r\n    source_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\r\n    disk_order = ['XS', '\u00bfR', 'O[', 'J#'],\r\n    disk_index = ('Q', 'X')\r\n)\r\n```\r\n\r\nDe esta manera el cipher ya habria quedado configurado para su uso, solo quedaria darle un mensaje para encriptarlo o desencriptarlo.\r\n\r\nAdemas de decidir si ese mensaje se guarda o no, usando un True o False.\r\n\r\nLo cual podria quedar asi.\r\n\r\n```python\r\nmensaje = \"Good Morning/Evening GitHub user\"\r\n\r\nmensaje_encriptado = cipher.Encrypt(mensaje,True)\r\n\r\nmensaje_desencriptado = cipher.Decrypt(mensaje_encriptado,False)\r\n```\r\n\r\nEsto procederia a guardarse en un log, para poder ver toda la configuracion del cifrado, tanto las piedras como el disco.\r\n\r\n## Ejemplo Completo \r\n```python\r\nstone_yellow = YellowStone(2)\r\nstone_redgreen = RedGreenStone(3)\r\nstone_blue = BlueStone(4)\r\n\r\nstone_holder_1 = StoneHolder([\r\n    stone_yellow,\r\n    stone_redgreen,\r\n    stone_blue\r\n])\r\n\r\ndisk_1 = Disk(\r\n    alphabet = \"\u00bf#CDEFGHIJK[}*OPQRSTU?!XYZ\",\r\n    splits = [6,7],\r\n    seed = 2025\r\n)\r\n\r\ncipher = Cipher(\r\n    disk = disk_1,\r\n    stone_holder = stone_holder_1,\r\n    seed = 2025,\r\n)\r\n\r\ncipher.config_cipher(\r\n    source_alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\r\n    disk_order = ['XS', '\u00bfR', 'O[', 'J#'],\r\n    disk_index = ('Q', 'X')\r\n)\r\n\r\nmensaje = \"Good Morning/Evening GitHub user\"\r\n\r\nmensaje_encriptado = cipher.Encrypt(mensaje)\r\n\r\nmensaje_desencriptado = cipher.Decrypt(mensaje_encriptado)\r\n```\r\n\r\n## CipherIO\r\n\r\nAl final el mensaje sera guardado en un Log, por default en una carpeta que creara llamada \"Messages/Encrypted\" o \"Messages/Decrypted\"\r\n\r\nAqui se guardaran las configuraciones usadas tanto de las Piedras como del Cifrado y sus alfabetos y demas.\r\n\r\nusando el CipherIO puedes configurar esta ruta, aunque solo hace esto por ahora, a futuro a\u00f1adire mas funciones a esta parte.\r\n\r\nAdemas tendra que ser a\u00f1adido a la configuracion del cipher para que este comience a usarlo.\r\n\r\n```python\r\nlogger_1 = CipherIO(\r\n    base_path = \"./Messages\"\r\n)\r\n\r\ncipher = Cipher(\r\n    disk = disk_1,\r\n    stone_holder = stone_holder_1,\r\n    seed = 2025,\r\n    logger = logger_1\r\n)\r\n```\r\n\r\n\r\n## Changelog\r\n\r\nPuedes consultar los cambios y versiones en el archivo [CHANGELOG.md](./CHANGELOG.md).\r\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2024 John Frederick Knight Berra  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "Cifrado C\u00e9sar con a\u00f1adidos de fantasia, permite encriptar y desencriptar mensajes",
    "version": "2.1.0",
    "project_urls": {
        "Homepage": "https://github.com/FrederickKnight/Magical_Cipher_Disk"
    },
    "split_keywords": [
        "python",
        " cipher",
        " encrypted",
        " disk",
        " magic",
        " d&d"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "22145c4cb459bcaaabec1382e79216d8d92ae46caeeab1328b9136b42c8f9b97",
                "md5": "71a476b9cabff267edb38b3f828c5b87",
                "sha256": "ea509125eccd8dc667645902638032cb9423d3067fe93e6dd66c2a77508d24aa"
            },
            "downloads": -1,
            "filename": "magical_cipher_disk-2.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "71a476b9cabff267edb38b3f828c5b87",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 19187,
            "upload_time": "2025-07-28T05:23:04",
            "upload_time_iso_8601": "2025-07-28T05:23:04.028285Z",
            "url": "https://files.pythonhosted.org/packages/22/14/5c4cb459bcaaabec1382e79216d8d92ae46caeeab1328b9136b42c8f9b97/magical_cipher_disk-2.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "be2f19c25c06c877ef9e37ad80126981dcf37e4cd0c0ef467398d4313ddeeaa9",
                "md5": "0adf63054b4e1670e2508f2b052799c9",
                "sha256": "48121776cf50745ceb4d1f00ea791c7bc40c20d516c9965be5c845b2c2cd6483"
            },
            "downloads": -1,
            "filename": "magical_cipher_disk-2.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0adf63054b4e1670e2508f2b052799c9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 14806,
            "upload_time": "2025-07-28T05:23:05",
            "upload_time_iso_8601": "2025-07-28T05:23:05.129349Z",
            "url": "https://files.pythonhosted.org/packages/be/2f/19c25c06c877ef9e37ad80126981dcf37e4cd0c0ef467398d4313ddeeaa9/magical_cipher_disk-2.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-28 05:23:05",
    "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"
}
        
Elapsed time: 1.07446s