Charabia
This library was designed for reversible sheltering of sensitive information/data, meaning you can shelter strings or tokens using this encoder.
Charabia gets it's name from the French of "gibberish", as when encoded, the text quite literally looks like a load of gibberish.
Getting started
Import the module:
import charabia
-
Separator ConfigurationFirstly, you should configure the encoder to use a separator configuration. Each separator in the configuration has a chance to be the separator/splitter of each character within the encoded string.
charabia.setseps("ABCDEFGH")
Alternatively, you can use a temporary configuration as a context manager by using the
tempsep()method (standing for temporary separators)with charabia.tempsep("ABCDEFGH"): ...
Separator duplicates and insertion order is not relevant, so it does not matter what order you provide them in (
ABCD==DCBA). -
Separator AcknowledgementThe exact separator configuration is required in order to decode a specific string. This means it's really important to remember the separator config you used to encode a given string.
-
EncoderNow we have configured charabia, we can start encoding and decoding strings. For the following examples, we will use the configuration
ABCD.>>> charabia.setseps("ABCD") >>> codes = [] >>> for _ in range(5): >>> encoded = charabia.encode("Hello world!") >>> print(encoded) >>> codes.append(encoded) 'VGBZEvCPaWBvusAvZFAnGCbFXDZlZCbPeAvkiDFukDxH' 'VQCPYZClkWDPusAvFbCxQCvbtBPPvDFFeAbaiAbYaAHn' 'hQAbaPAPEWCZEsDvblDdcAFPjDvbbDFleCluWBZkaCRH' 'LwBluPBZusCFOsCPZbDHQAbPNBZvvCZFSAlOiClEuCxR' 'hcCZOvCvEWBPOsDFvbBHwAbbjCvFFAllSCFYWBZuOBHR'
5 unique results have been produced with this separator configuration. The longer the string, the more likely they are to be unique from other strings.
Now using the same configuration, lets decode each of the strings in the
codeslist we created.>>> for c in codes: >>> print(charabia.decode(c)) 'Hello world!' 'Hello world!' 'Hello world!' 'Hello world!' 'Hello world!'
Despite being different, all these results are decoded to exactly the same original string.
-
Configuration conflictsCharabia operates based on the separators provided in setseps, so if the incorrect separators are given to decode a string, things may not work as expected.
Let's grab one of our results from earlier,
VGBZEvCPaWBvusAvZFAnGCbFXDZlZCbPeAvkiDFukDxH. This will only translate to "Hello world!" with the configurationABCD, so lets change the configuration and see what happens:>>> with charabia.tempsep("EFGH"): >>> print(charabia.decode("VGBZEvCPaWBvusAvZFAnGCbFXDZlZCbPeAvkiDFukDxH")) CharabiaError: failed to decode with configuration EFGH
Methods
-
setseps()Use this function to configure the separators used for charabia. Must be alphanumeric, and must range between 1 and 42.
charabia.setseps("MySeparators123")
-
getseps()Get the separators associated with the current charabia configuration.
>>> charabia.setseps("QwErTy103") >>> charabia.getseps() 'QwErTy103' >>> charabia.setseps("aaaaaa") >>> charabia.getseps() 'a'
-
tempseps()Context manager to temporarily alter the separator configuration. This will fall back to the original global setting after
__exit__().>>> with charabia.tempseps("ABC"): >>> charabia.decode("ZPgCbkbCbbTCPZgCFEJAlZuCPYRARmBotBfYBfZ") 'testing 123'
-
encode()Use the encode method to encode standard text into charabia. Ensure that charabia is configured before using this method.
>>> charabia.setseps("AsDfGhJkL") >>> charabia.encode("Hello world!") 'VwklElsPuCfFuWflFPAdwJZPNAPvlAFFIGPaMhZuOAnx'
-
decode()The reverse of
encode(). Self-explanatory, really.>>> charabia.setseps("AsDfGhJkL") >>> charabia.decode("VwklElsPuCfFuWflFPAdwJZPNAPvlAFFIGPaMhZuOAnx") 'Hello world!'
-
splitseps()Exposed helper function used to split a string with the current or provided separator configuration. Seeing as this command can be used for debugging purposes, you can pass your own configuration straight into the command if you're not wanting to use tempseps for what you're trying to do. The options there :P
>>> charabia.setseps("fioh452") >>> encoded = charabia.encode("hello world!") >>> print(encoded) 'bayhFEvibaCfbuW2bPb4dw5lZN5lFbfPlShZaWfFkaixn' >>> print(charabia.splitseps(encoded)) ['bay', 'FEv', 'baC', 'buW', 'bPb', 'dw', 'lZN', 'lFb', 'PlS', 'ZaW', 'Fka', 'xn'] >>> print(charabia.splitseps("VwklElsPuCfFuWflFPAdwJZPNAPvlAFFIGPaMhZuOAnx", "AsDfGhJkL")) ['Vw', 'lEl', 'PuC', 'FuW', 'lFP', 'dw', 'ZPN', 'Pvl', 'FFI', 'PaM', 'ZuO', 'nx']
-
create_tower()The same as passing the
tower_rowskwarg toencode(). Creates a tower for the given string.>>> string = "bayhFEvibaCfbuW2bPb4dw5lZN5lFbfPlShZaWfFkaixn" >>> print(charabia.create_tower(string, 10)) ''' bayhFEviba CfbuW2bPb4 dw5lZN5lFb fPlShZaWfF kaixn '''
-
demolish_tower()Removes a tower from a string.
>>> string = """ bayhFEviba CfbuW2bPb4 dw5lZN5lFb fPlShZaWfF kaixn """ >>> print(charabia.demolish_tower(string)) 'bayhFEvibaCfbuW2bPb4dw5lZN5lFbfPlShZaWfFkaixn'
Internal exposed methods
The following methods are only designed for internal use, but are exposed for public use if wanted.
-
configured()Returns whether charabia is fully configured.
-
generate_encoding_indexes()Generates the encoding indexes used for a specific configuration. This is an exposed but internal function, so you must pass separators to it. You should only use this if you know what you're doing, and if you know the encode function well.
>>> print(charabia.generate_encoding_indexes("QwErTy103")) { 0: ['a', 'k', 'u', 'O', 'Y'], 1: ['b', 'l', 'v', 'F', 'P', 'Z'], 2: ['c', 'm', 'G'], 3: ['d', 'n', 'x', 'H', 'R'], 4: ['e', 'o', 'I', 'S'], 5: ['f', 'p', 'z', 'J'], 6: ['g', 'q', 'A', 'K', 'U'], 7: ['h', 'B', 'L', 'V'], 8: ['i', 's', 'C', 'M', 'W'], 9: ['j', 't', 'D', 'N', 'X'] }
-
generate_decoding_indexes()This is really just the same as the encode counterpart, use it in the same way.
{ 'a': '0', 'k': '0', 'u': '0', 'O': '0', 'Y': '0', 'b': '1', 'l': '1', 'v': '1', 'F': '1', 'P': '1', 'Z': '1', 'c': '2', 'm': '2', 'G': '2', 'd': '3', 'n': '3', 'x': '3', 'H': '3', 'R': '3', 'e': '4', 'o': '4', 'I': '4', 'S': '4', 'f': '5', 'p': '5', 'z': '5', 'J': '5', 'g': '6', 'q': '6', 'A': '6', 'K': '6', 'U': '6', 'h': '7', 'B': '7', 'L': '7', 'V': '7', 'i': '8', 's': '8', 'C': '8', 'M': '8', 'W': '8', 'j': '9', 't': '9', 'D': '9', 'N': '9', 'X': '9', 'Q': ' ', 'w': ' ', 'E': ' ', 'r': ' ', 'T': ' ', 'y': ' ', '1': ' ', '0': ' ', '3': ' ', '\n': '' }
Installation
Install using the recommended installer, Pip.
pip install charabia
Metadata
Release files for charabia 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| charabia-2.0.0.tar.gz | 6.9 kB | Without provenance | Details for charabia-2.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| charabia-2.0.0-py3-none-any.whl | Python 3 | none | any | Details for charabia-2.0.0-py3-none-any.whl |
Total release size: 14.1 kB
Release files / charabia-2.0.0.tar.gz
| Download URL | charabia-2.0.0.tar.gz |
|---|---|
| Size | 6.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ddb749978741035954a58964abf06b097aced6aa253cc85c94a5fa512e595aa1
|
|
BLAKE2b-256 checksum How to use checksums |
9e57a32319d9b74ca5d0faf2e80df6ed38dac64c6deb52b40935c6aa778c2539
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
|
Release files / charabia-2.0.0-py3-none-any.whl
| Download URL | charabia-2.0.0-py3-none-any.whl |
|---|---|
| Size | 7.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d6d773dd0b31d40502264958e88aaae8de0f2253f88b370b98de8c3340723a40
|
|
BLAKE2b-256 checksum How to use checksums |
264f63ded81e12819f698fe3e9b15bed40dfde2b5dac5765dca420b97fd33bb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.9
|
Security for charabia 2.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.