Role:
Sole designer & engineer
Stack:
Go, FrodoKEM-640, ML-KEM-768, ChaCha20-Poly1305
Licence:
GNU GPL v3 or later
Fury
Post-quantum-only file encryption, with no classical fallback and no plaintext private keys.
- Cryptography
- Command-line tool
- Go library
- Cross-platform
The problem
Every mainstream encryption tool still defaults to classical public-key cryptography (RSA or elliptic curve), with post-quantum options bolted on as an opt-in flag, if they exist at all. That's a reasonable transitional position for most software, but for people who specifically want post-quantum protection today, "opt in to remember" isn't good enough: it's exactly the kind of setting that gets left at its default. Fury exists for people who want the safer choice to be the only choice.
What I built
A command-line file encryption tool, wire format and Go library built around a hybrid key agreement: FrodoKEM-640 plus ML-KEM-768 both wrap the same file key, so breaking one KEM alone isn't enough to recover it. There are no X25519, SSH-key or classical-only recipients. Fury recipients carry a post-quantum label and mixed-label encryption fails closed rather than silently downgrading. Private identities can only be serialised under a passphrase, with Argon2id parameters stored alongside the file and capped on parse so a malicious file can't force excessive work. The payload itself is ChaCha20-Poly1305 in fixed-size STREAM-style chunks, bound to a header MAC over the encrypted recipient blocks.
The toolset is deliberately small: fury to encrypt and decrypt, fury-keygen to generate and manage identities, and fury-inspect to report a file's suite, post-quantum status and size breakdown without decrypting it. Input defaults to stdin and output to stdout, so it composes with pipelines the way a proper Unix tool should.
Engineering decisions
- Hybrid over single-KEM: two independent post-quantum assumptions, rather than betting everything on one still-young algorithm.
- Fail closed on suite mismatch: there's no silent fallback path an attacker: or a confused user: could exploit to force weaker encryption.
- Versioned suites: the format is self-describing, so new defaults can be added later without stranding data encrypted today.
- Short fingerprints, verified resolution: large post-quantum public keys are unwieldy to share by hand, so short
furyfp1fingerprints resolve through cache, files or HTTPS key servers and are verified before use.
What it demonstrates
Applied cryptographic engineering rather than cryptographic research: choosing conservative, well-reviewed primitives, composing them so that failure modes are explicit and fail safe, and shipping the result as free software with a public design document so the security model can be checked against your own threat model rather than taken on trust.
Downloads
Prefer building from source? go install github.com/andydixon/fury/cmd/...@latest
| OS | Architecture | Size | ||
|---|---|---|---|---|
| macOS | Intel x86-64 | 5.2 MB | Download | sha256 |
| Apple Silicon ARM64 | 4.7 MB | Download | sha256 | |
| Windows | 32-bit x86 | 5.2 MB | Download | sha256 |
| 64-bit x86-64 | 5.3 MB | Download | sha256 | |
| ARM64 | 4.7 MB | Download | sha256 | |
| Linux | 32-bit x86 | 5.0 MB | Download | sha256 |
| 64-bit x86-64 | 5.1 MB | Download | sha256 | |
| ARM | 4.9 MB | Download | sha256 | |
| ARM64 | 4.6 MB | Download | sha256 | |
| LoongArch 64 | 4.8 MB | Download | sha256 | |
| MIPS | 4.9 MB | Download | sha256 | |
| MIPS little-endian | 4.8 MB | Download | sha256 | |
| MIPS64 | 4.6 MB | Download | sha256 | |
| MIPS64 little-endian | 4.6 MB | Download | sha256 | |
| PowerPC 64 | 4.7 MB | Download | sha256 | |
| PowerPC 64 little-endian | 4.7 MB | Download | sha256 | |
| RISC-V 64 | 4.7 MB | Download | sha256 | |
| IBM s390x | 5.0 MB | Download | sha256 | |
| BSD family | FreeBSD 32-bit x86 | 5.0 MB | Download | sha256 |
| FreeBSD x86-64 | 5.1 MB | Download | sha256 | |
| FreeBSD ARM | 4.9 MB | Download | sha256 | |
| FreeBSD ARM64 | 4.5 MB | Download | sha256 | |
| NetBSD 32-bit x86 | 4.9 MB | Download | sha256 | |
| NetBSD x86-64 | 5.0 MB | Download | sha256 | |
| NetBSD ARM | 4.9 MB | Download | sha256 | |
| NetBSD ARM64 | 4.5 MB | Download | sha256 | |
| OpenBSD 32-bit x86 | 5.0 MB | Download | sha256 | |
| OpenBSD x86-64 | 5.1 MB | Download | sha256 | |
| OpenBSD ARM | 4.9 MB | Download | sha256 | |
| OpenBSD ARM64 | 4.6 MB | Download | sha256 | |
| OpenBSD PowerPC 64 | 4.6 MB | Download | sha256 | |
| OpenBSD RISC-V 64 | 4.7 MB | Download | sha256 | |
| DragonFly BSD x86-64 | 5.0 MB | Download | sha256 | |
| Unix & WebAssembly | AIX PowerPC 64 | 5.1 MB | Download | sha256 |
| illumos x86-64 | 5.1 MB | Download | sha256 | |
| Solaris x86-64 | 5.1 MB | Download | sha256 | |
| JavaScript WebAssembly | 5.3 MB | Download | sha256 | |
| WASI WebAssembly | 5.3 MB | Download | sha256 | |
| Plan 9 | 32-bit x86 | 4.8 MB | Download | sha256 |
| 64-bit x86-64 | 4.9 MB | Download | sha256 | |
| ARM | 4.7 MB | Download | sha256 |