I was experimenting with RubberhoseFS, but since it is very hard to compile on anything modern, I decided to implement my own version, stripped of many unnecessary features. Namely, my implementation would only work on files (as opposed to drives/volumes/partitions), and in batch mode (no random access). However, before I start implementing it, I would like to verify that my understanding of RubberhoseFS is correct.
I wrote a full documentation of my intended implementation here, it contains all details of what I intend to do.
It boils down to this:
- A file of fixed size is created, regardless of how much actual content is intended to be in it. This file is split into blocks, initialised to random noise.
- A fixed number of "aspects" (views) is created, regardless of how many are actually used.
- Each aspect holds one symmetric master key protected by a password (or a key); one lattice key generator encrypted by the key; and one map of blocks used by that aspect (initially empty, until data is written to it), also encrypted by the key
- If a block is referenced by a map of one aspect, it holds data encrypted by a key generated by the aspect's "Lattice Generator", seeded by the block sequence number (i.e. if this is the 3rd block of that aspect, the lattice generator will be seeded with "3". If the block is not referenced by any aspect, it contains random noise.
Is this comparable to what RubberhoseFS does? Does this seem like a reasonable implementation of Deniable Encryption?
Additionally, what is meant by the "Lattice generator"? Which primitives would I use to implement this?
And finally, RubberhoseFS uses a "whitening code" to prevent Known Plaintext Attacks. To my understanding, for each block, a random noise of the same size as half of the block is generated. The other half is then the plaintext, XORed with the random noise. Both of these are then encrypted using the key from the lattice generator, and stored in the block. Is this interpretation correct? And is whitening really necessary, if the key space is large?