Skip to main content

Client library for unbiased random integers backed by Geiger counter decay timing.

Project description

Nuclear Random

Experimental Python random integers backed by Geiger counter decay timing.

pip install nuclear-random
from nuclear_random import choice, nuclear_random, randint, random_bytes, service_status

print(nuclear_random(100))      # 0..100 inclusive
print(nuclear_random(10_000))   # 0..10000 inclusive
print(randint(10, 20))          # 10..20 inclusive
print(random_bytes(16).hex())   # 16 extracted bytes from the entropy pool
print(choice(["red", "green", "blue"]))

status = service_status()
print(status.pool_size_bytes, status.estimated_cpm)

How It Works

The public API consumes extracted bits from an ESP32-C3 connected to a Geiger counter on GPIO 6. Each click sends the time since the previous click. The server takes a small number of raw timing bits and runs them through a Von Neumann debiasing extractor before storing full bytes in Redis.

For any request nuclear_random(max_value), the API reads max_value.bit_length() extracted bits and returns the candidate only if it is <= max_value. Candidates above the requested maximum are rejected and the API reads the next bits.

This rejection-sampling step avoids modulo bias.

Configuration

By default the client uses:

https://nuclear-api.datanode.live

Override it while testing:

export NUCLEAR_RANDOM_API_URL=http://127.0.0.1:19000

or per call:

nuclear_random(131, api_url="http://127.0.0.1:19000")

Server

The server stack is Docker-only and includes:

  • FastAPI API
  • Redis extracted entropy byte pool
  • InfluxDB telemetry
  • Wi-Fi ingest endpoint for the ESP32-C3
  • USB serial monitor for diagnostics
  • status metrics for the future website
  • Redis-backed public API rate limiting
cp server/.env.example server/.env
docker compose -p nuclear-random --project-directory server up -d redis influxdb api
docker compose -p nuclear-random --project-directory server --profile collector up -d collector

See docs/architecture.md, docs/deployment.md, and docs/hardware.md. See docs/publishing.md for PyPI release steps.

The ESP32-C3 firmware posts click events to https://nuclear-api.datanode.live/v1/entropy/click. Its INGEST_TOKEN must match the server INGEST_TOKEN in /home/server/nuclear_random/server/.env. It should still be built with CDCOnBoot=cdc so the USB serial debug stream is visible on /dev/ttyACM0.

Useful API endpoints:

GET  /healthz
GET  /v1/status
GET  /v1/random/int?max=100
GET  /v1/random/bytes?length=16
POST /v1/entropy/click

Status

This project is alpha-quality. It uses radioactive decay timing with Von Neumann debiasing, but it has not been cryptographically certified.

License

MIT

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

nuclear_random-0.2.0.tar.gz (19.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nuclear_random-0.2.0-py3-none-any.whl (6.2 kB view details)

Uploaded Python 3

File details

Details for the file nuclear_random-0.2.0.tar.gz.

File metadata

  • Download URL: nuclear_random-0.2.0.tar.gz
  • Upload date:
  • Size: 19.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nuclear_random-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a3669f5ce54b714dc54ff6dc58ba3e5fc9ce47c6f8405303ce5217c1a6126374
MD5 1c9d6a7192e6ba4f2d7777597f90970b
BLAKE2b-256 fb2592715947504f1dd718f7b96f6e397e62e0afc8be36d10af106c4a27576d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for nuclear_random-0.2.0.tar.gz:

Publisher: publish.yml on TimofeySukh/nuclear-random

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nuclear_random-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: nuclear_random-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 6.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nuclear_random-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f55b8003ee6016bfcc0668aa546a6c4b1d8d6fcbf58d49adb56f2052ac673d84
MD5 9b901f092ef88ad4f85964f21f8fe5ab
BLAKE2b-256 c0c5c3341d02013fdb9121dff5e7be63639e2169c445945187a9573a2ccdfe06

See more details on using hashes here.

Provenance

The following attestation bundles were made for nuclear_random-0.2.0-py3-none-any.whl:

Publisher: publish.yml on TimofeySukh/nuclear-random

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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