Two-secret combiner
SHA3-256 and BLAKE2b-256 are computed independently per passphrase, then XOR-mixed with domain separation.
KeyWeaver derives the same high-entropy cryptographic key from the same two passphrases — every time, on any machine. No salt to lose. No keyfile to back up. Just the recipe.
# Derive a VeraCrypt-compatible key with Argon2id
python keyweaver.py --kdf argon2id --veracrypt --fingerprint
SHA3-256 and BLAKE2b-256 are computed independently per passphrase, then XOR-mixed with domain separation.
Choose PBKDF2-SHA512 for portability, scrypt for memory hardness, or Argon2id for the modern best practice.
Same passphrases plus the same parameters always produce the same key. Re-derive on any machine, any time.
Output as full hex, 32-byte VeraCrypt hex, or a binary keyfile written with restrictive permissions.
Scriptable command line for automation. Tkinter GUI for one-off derivations — no extra dependencies.
Strength meter, minimum-entropy enforcement, clipboard auto-clear, atomic keyfile writes, and a one-way fingerprint for cross-checks.
Two passphrases pass through independent two-hash constructions, are XOR-combined with domain separation, then stretched through a memory-hard KDF.
person parameter is VC2_P1 for the first passphrase and VC2_P2 for the second, so swapping inputs yields a different key.SHA512(label ‖ combined_block), preserving determinism.Python 3.8 or newer. The Argon2id KDF requires argon2-cffi, which is included in the requirements file.
# Clone
git clone https://github.com/MuchDevSuchCode/KeyWeaver.git
cd keyweaver
# Install dependencies
pip install -r requirements.txt
# Run the CLI
python keyweaver.py --help
# Run the GUI
python keyweaver_gui.py
python keyweaver.py --kdf argon2id --veracrypt --fingerprint
python keyweaver.py --kdf scrypt --output-mode keyfile \
--keyfile ~/secrets/vol1.key
python keyweaver.py --kdf argon2id --copy --copy-timeout 60
python keyweaver.py --min-entropy 100
⚠ Parameters are part of the determinism contract. Pick once, write them down, and never change them for a given key — otherwise you cannot reproduce that key.
| KDF | Default | Tighter | Notes |
|---|---|---|---|
| PBKDF2-SHA512 | iter=600 000 |
iter=2 000 000+ |
Stdlib only. No memory hardness. |
| scrypt | N=16 384, r=8, p=1≈16 MiB |
N=1 048 576≈1 GiB |
Memory-hard. Strong GPU resistance. |
| Argon2id | m=65 536, t=3, p=164 MiB |
m=1 048 576, t=41 GiB |
Modern best practice. Recommended for new deployments. |
O_EXCL writes, mode 0600).
Memory wiping is best-effort: Python cannot reliably erase immutable strings.
Internal buffers use bytearray and are zeroed after use.
For high-value workflows, run on a system with encrypted swap and locked memory pages.
One file, one dependency, one deterministic key.
Get KeyWeaver →