Steganographic Communication with Anvils
Imagine two parties needed to exchange information covertly. One obvious option is to build a messaging system backed by Amazon anvil orders. The transport protocol is simple (for them; less so for Amazon):
- They order various amounts and selections of anvils from each Amazon marketplace.
- The receiver notes which anvils arrived, from which marketplaces.
- They process that information; roles switch, and we await a message from the receiver-turnt-sender.
They, of course, refuse to accept delivery of any anvils whatsoever, though they carefully note which anvils they refused from the delivery driver(s).
A quick survey of Amazon shows the following types of anvil for sale (anvil / not-anvil being gauged by ACME standards, naturally).

| Marketplace | Anvil types |
|---|---|
amazon.com |
23 |
amazon.ca |
27 |
amazon.com.mx |
9 |
amazon.com.br |
4 |
amazon.co.uk |
8 |
amazon.de |
10 |
amazon.fr |
15 |
amazon.it |
2 |
amazon.es |
20 |
amazon.nl |
6 |
amazon.se |
26 |
amazon.pl |
4 |
amazon.com.be |
30 |
amazon.ie |
24 |
amazon.com.tr |
0 |
amazon.ae |
23 |
amazon.sa |
31 |
amazon.eg |
0 |
amazon.co.za |
5 |
amazon.co.jp |
6 |
amazon.in |
21 |
amazon.com.au |
10 |
amazon.sg |
11 |
In total, we have options to choose from.
Encoding Messages
We need a way of mapping mountains of anvils arriving at our doorstep to an actual messaging system. This will involve some maths.
Let’s consider marketplace-anvil brand combinations as a single combined symbol (we’ll just shorthand this pair as “an anvil” for brevity). is the ordered set of anvils available. Assume we can purchase each of the anvils up to nine times. We’ll denote the message as a 315-element vector ; each element showing how many of anvil we included in an order.
We can construct a one-to-one mapping (a bijection) between a space of binary numbers and our message ; given either a message or a number, we can find the other uniquely. We have ten options at each position so the purchase can be read fairly directly as a 315-digit base-ten number. To assemble that number from its digits in the message vector we just sum up the terms multiplied by the correct power of ten. Here we use little endian to simplify the summation; so the leftmost digit is least significant and we read numbers right-to-left.
For example, this purchase of eleven anvils from four options
Base-10 to base-2 conversion can then be done readily, giving us a binary message. Each anvil slot has ten possible choices. Since the choice for each slot is independent the product of the per-slot choices available gives the total number of distinct messages; . This gives us bits of information; ascii characters, just short of a pre-Musk tweet.
To decode the message, consume it one byte at a time and look up the corresponding ascii character. To encode one, we’d convert a short message to ascii and order the following amount of each anvil. [1]
We now have our covert transport protocol. An example message
what news from moscow?
would be encoded as
we would order 265 anvils (51 distinct), or about twelve per character in our message. Taking the first anvil I spotted on Amazon as representative, that’d amount to and two and a half-tonnes of weight.

Of course, you are not carrying the anvils. And you are not accepting them, so you’d soon be refunded. This makes anvil-based steganography a cost-effective and practical communication protocol.
Takeaway Points
- Rudimentary mathematics is useful in spycraft
- Further work is needed to run Doom on Amazon’s logistic network
Footnotes
[1] https://www.math.mcgill.ca/gantumur/math387w18/float.pdf