Research prototype for anonymous communication

Anonymity through separated duties.

Anon-Sec-Net is a C prototype that gives routing, brokering and storage to different roles, so no single operator holds enough to link a receiver to the service it talks to.

Ships with a matched onion-routing baseline and the attack simulations used to test the design. Built to study an idea, not to protect real traffic.

receiver sideservice gateways meet at a cache serversender side
Swipe the diagram sideways to see both sides. Each party reaches its Service Gateway over two separate three-hop paths: one carries requests out, the other brings responses back.
Path A, requestsPath B, responsesPlanned
01 / The idea

In onion routing, the relays hold every duty at once.

The nodes that carry a circuit also locate the service and deliver its content, so the same small set of operators is both the infrastructure and the threat. Anon-Sec-Net asks what changes when those duties are pulled apart and given to parties that never need to trust each other.

01

Route

Mix nodes relay fixed-size Sphinx packets. Each one sees only its neighbours and never the endpoints or the payload.

02

Broker

Service Gateways terminate a party's two paths and handle its requests, without learning where that party is on the network.

03

Store

The Cache Server holds signed ciphertext under lookup keys. It can neither read the content nor see who asked for it.

Route. Broker. Store.
Keep them in separate hands.
Linking a receiver to a service means compromising several independent roles at once.
02 / Roles

Everyone sees a little. Nobody sees the whole.

Each role is a separate process with its own keys. In a deployment, each could be run by a different operator.

mix_node

Mix node

Relays 1024-byte Sphinx packets one hop at a time, blinding the payload with AES-CTR.

Sees
The previous and next hop, its own per-session hop key.
Never sees
Endpoints, payload, or the other path.
service_gateway

Service Gateway

Terminates a party's two paths, binds them into one session and brokers its requests.

Sees
The request type and the content key.
Never sees
The network address of the party behind the paths.
cache_server

Cache Server

Stores signed ciphertext and relays the content-key handshake. Only Service Gateways can reach it.

Sees
Opaque blobs under lookup keys.
Never sees
Plaintext, or any party's address.
client / sender

Receiver and Sender

Agree a fresh content key for every request. The Sender signs everything it publishes.

Sees
Their own traffic.
Never sees
Each other's location.
planned

Network Gateway

Connects the network to the public internet, with outside servers reached through the Service Gateways. It is part of the design and has not been built in this prototype.

03 / How it runs

Publish a value. Fetch it anonymously. Verify it end to end.

01Build pathsEight ECDHE handshakes with signed node descriptors: six hops drawn from a weighted pool, two with the Service Gateway.
02PublishThe Sender PUTs signed, encrypted content through its own paths to the Cache Server.
03RequestThe Receiver sends a GET over path A, carrying a pre-built return header for path B.
04Agree a keyReceiver and Sender negotiate a per-request content key, relayed through the Cache Server.
05ReturnThe response comes back over path B; the Receiver checks the signature and decrypts.
   terminal
# build, then start the whole network
$ cd ASN && make nodes
$ (cd ../tests/ASN && ./start_nodes_pool.sh)

# terminal 1: publish, and leave the Sender running
$ ./sender.exe
> PUT mykey hello

# terminal 2: fetch through the network
$ ./client.exe
> GET mykey
Response (5 bytes, signature verified,
confidentiality-protected): hello
Build variants

Every defence is a compile-time flag.

make nodesSphinx forwarding with bidirectional cover traffic at a per-client rate tier.
make hardenedShared fixed-rate dispatch clock plus exponential per-hop mixing delay.
make poolmixBatch mixing at each hop instead of per-packet delay.
make hopdecoyDecoys terminated at each hop; combines with the two above.
make instrumentedTiming and bandwidth probes for benchmarks.
04 / Findings

Tested against its own claims, including where it falls short.

Every result below comes from a seeded script or a live measurement in the repository.

Compromisef4 against f3

Linking a receiver to a service takes four compromised positions, one more than a Tor onion service. All of that margin comes from role separation, and at f = 0.1 it is gone once operators correlate beyond about 0.01.

Dual paths aloneNo gain

One path's entry and exit already give routing-level linkage. Against the plain build a passive correlator reaches TPR 0.998 to 1.000 at FPR 10-3, the same as against a single path.

Per-hop mixing delayTPR 0.006

The hardened build brings a sequence correlator down from ceiling, at a measured throughput cost.

Hop decoys with batch mixing100% to 28.5%

Detection by a GRU correlator at FPR 10-3 when decoys are terminated and batch-mixed at each hop.

Adaptive cover trafficAUC 1.0

Load-adaptive cover leaks activity level once real load passes about 1.5 times the cover ceiling. Constant-rate cover stays at chance.

ReproducibleOne command each

Each simulation runs from a single seeded command. See ASN/eval2 for the full list.

05 / Cost

Measured against a matched onion-routing baseline.

The repository includes a single-path, three-hop onion-routing implementation on the same crypto library and testbed, so the comparison isolates the protocol.

Path construction6.32 ms8 handshakes, against 0.83 ms for 3
Per-hop processing5.0 µsconstant-cost AES-CTR blinding
Throughput, 200 sessions8.9 Mbpsagainst 11.7 Mbps on 16 vCPU
Live GET with key handshake1.46 s3.15 s with 50 ms per-hop mixing

Measured over loopback; absolute numbers depend on hardware. Data files and machine specs: results/README.md.

06 / Scope

A research prototype, with its shortcuts in plain view.

Anon-Sec-Net exists to study a design question. These simplifications belong in any result built on it.

No directory authorities.Node identity keys are pinned trust-on-first-use against a synthetic consensus, so first contact with a node is unverified.
Sender paths are fixed.Receivers draw from a 100-node weighted pool with persistent guards; the Sender uses fixed nodes.
No Network Gateway yet.The link to the public internet exists only in the design.
Cache Server access control.The Cache Server binds to loopback and has no application-layer authentication.
Small payloads.At most 463 bytes of application data per packet, less after the content handshake.
Single host.All results come from loopback testbeds; there is no wide-area evaluation.
07 / Licence

Free software.

Anon-Sec-Net is released under the GNU General Public License v3.0 or later. Study it, change it, break it and publish what you find.

Files adapted from DeepCoFFEA for the flow-correlation baseline keep their MIT licence.

Read the licence
Open source, GPL-3.0-or-later

Split the duties.
Run the network.
Attack the result.

Clone the repository, bring up the pool network and fetch your first value in a few minutes. Then switch on a defence and measure what it buys.

To compare several anonymity designs side by side, see AnonTestLab, a general emulator that grew out of this project.

Explore the repository