Blog

Technical guides on post-quantum cryptography, reliable algorithmic trading, Python and AI — each one written from the code behind it.

Post-quantum cryptography

Fifty seconds for half a megabyte: the optimisation that fixed the constant, not the order

A quadratic radix conversion survived for months inside a cryptography library with every test green. The comment documenting it convinced everyone the problem was solved. Measurement, cause, and the classical algorithm that made it 111× faster.

QuipuRustRendimiento

Seal a file so no one can dispute you didn't touch it

A single hash forces you to reveal the whole set to prove one file. A Merkle tree doesn't. How Tunjo works: an integrity root, a triple post-quantum signature, and a verifier anyone can run.

RustCriptografíaPost-cuántico

They steal your database and can't crack a single password

Argon2 makes each guess expensive, but the attacker who takes your user table has infinite time and GPUs. An OPRF changes the game: the hash depends on a key that doesn't travel with the database. How it works, what it costs, and what breaks.

SeguridadContraseñasOPRF

What is post-quantum cryptography, and why should you migrate now?

The quantum threat, the 'harvest now, decrypt later' attack, and the NIST standards ML-KEM and ML-DSA — explained clearly, and why to start migrating today.

CriptografíaPost-cuánticaSeguridad

Hybrid encryption: why combine classical and post-quantum cryptography

What hybrid encryption is, why combining X25519 with ML-KEM-1024 (and Ed25519 with ML-DSA-87) is safer than picking just one, and how Quipu applies it.

CriptografíaPost-cuánticaQuipu

Quipu: post-quantum encryption in pure Rust, with a Python wheel

Quipu is a hybrid post-quantum encryption library for data at rest, written in pure Rust. For non-Rust users it ships as a native Python wheel (PyO3). Why we dropped the C ABI and multi-language bindings, with examples.

QuipuRustPython

Small reliable libraries

I killed the process and the drain still hung: a grandchild held the pipe

A subprocess hangs, I kill it with SIGKILL, and my program still waits for its output forever —at 0% CPU—. The pipe wasn't held by the child: a grandchild inherited it, and while it lives EOF never arrives.

SistemasSubprocesosRust

My adaptive memory stayed empty in production, and it wasn't a bug

A system meant to learn from its own failures accumulated zero records, while a neighbouring table grew. There was no error in the code —the logs were clean—. It was a deadlock: two safety mechanisms starving each other.

DiseñoSistemas adaptativosRust

Don't claim a security boundary holds — demonstrate it

Confining what a piece of code can touch —the file system, spawning processes— is a capability problem. And there's a huge difference between designing the boundary and PROVING it holds: the first is a claim; the second, a harness that attacks its own boundary and keeps the evidence.

SeguridadNode.jsCapabilities

My detector was blind across 1,029 of 6,309 lines and its three tests stayed green

A test bench made only of negative cases over files that are clean today cannot tell a correct rule from a blind one: both return empty. How to detect it, and the three conditions that make a pair of tests actually discriminate.

PruebasVerificaciónCalidad

I said no data was leaving. On the first good run, two records left

A zero, a silence or a "not found" are indistinguishable from a real negative when the code that would produce them never ran — and they arrive with the confidence of having verified. The positive control, and why you have to look again after the first success.

VerificaciónObservabilidadIntegraciones