The different versions of CircuitPython microcontroller code for this project support different sensor breakouts for decoding the secret messages. The same encryptor page can be used to encode secrets for all of them.
The page can be used to encrypt multiple messages/images with different values. Each encrypted secret gets copied into a SEQUENCE list inside of the code.py file.
Once a secret has been revealed successfully, it remains visibly decrypted on the screen until the user presses the BOOT button on the Feather to advance to the next puzzle in the sequence.
Click the button bellow access the encryptor page.
The page contains two tabs: one for encoding text, the other for encoding images.
For text secrets, fill in the following fields and then press the Encrypt button.
- Reading type - a dropdown. Select Temperature, Humidity, CO2, Lux, or Other based on the type of sensor/data reading you want to unlock the secret.
- Precision level - an integer number. Larger numbers result in a wider range of successful decryption values,
1means the value must fall between two consecutive values i.e.22-23. Whereas10would mean a range of 10 values like42-52. For GPS, the precision level is used for the number of decimal places in the coordinates i.e.40.656,-74.007is3decimals. - Sensor value - a float number. The target sensor reading for unlocking the secret. The actual key will be derived from a range that covers the target value based on the precision level.
- Plaintext - a text string input. The secret message that you wish to encrypt.
When you press Encrypt, a sequence entry text box will appear with an object containing the encrypted message along with metadata required to decrypt and validate it.
Press the copy button, along the top right of the box, and then paste the whole thing into the SEQUENCE list inside of code.py in the user configuration section near the top.
SEQUENCE = [
{
"type": "text",
"data": "?tH,OledH]BF9zxBSX'LUY^C7390.HFaS[GX",
"sha256": "583fd7f36f35c16fb4dc60edf493c74679ce6f26f928bf9995dcae85becf6962",
"reading": "lux",
"precision_level": 100,
},
# Add more entries here...
]
Encrypting image secrets is similar to text. The main differences are:
- Drag and drop an image file on the page instead of entering plaintext into a box. The page supports PNG, JPEG, and BMP formatted images.
- Nonce / IV - required for AES encryption. Leave the default or change it to any 16 character string.
- Max palette colors - how many colors to use for the palette of the resulting Bitmap image. Using the default
256is fine for most cases.
After you fill in the fields and click Encrypt & Download two things will happen. An encrypted copy of the image will be downloaded with a name like some_image.abmp.enc, and the sequence entry box will appear and get populated with an entry for the encoded image.
Press the copy button along the top right of the box and then paste the whole thing into the SEQUENCE list inside of code.py in the user configuration section near the top.
Make sure that the data value in the object has the exact name of the downloaded image file. You can change the name to anything, but the name of the file must match the data value in this object. Change them both together if you do.
Copy the encoded image file to the CIRCUITPY drive.
SEQUENCE = [
{
"type": "image",
"data": "secret_image.abmp.enc",
"iv": b"InitializationVe",
"sha256": "932185ffbba8b245a97a0819428d6038997e968174cadd3bd0a5bab970d0e560",
"reading": "temperature",
"precision_level": 1,
},
# Add more entries here...
]
Page last edited May 06, 2026
Text editor powered by tinymce.