Lenticrypt: A Provably Plausibly Deniable Cryptosystem
sultanik.com
sultanik.com
This can't be true; there are more possible plaintexts than there are keys in the public domain.
This system provides a way for someone to "comply" with a request to decrypt an encrypted file, without giving up the encrypted file. So if you had the 'books' from the drug cartel on your laptop as an encrypted spreadsheet you could also encrypt an innocent (but private) business ledger into the same file. If the border guards say "Give us the password to decrypt this file." You comply, and they see your private business ledger which you would have every reason to protect while traveling. They don't see the Cartel's ledger, which would incriminate you.
Why not "Erotic messages with my wife", "My medical records", "My business plan", "My home videos", or any other number of things most regular people probably don't want anyone snooping around.
The difference is that we are using publicly available streams of data (book text, encoded youtube video bytes, etc) instead of truly random data as the key.
This scheme takes advantage of the fact that with a one-time pad you can provide a key that will decode it to any possible plaintext (of the proper length).
As for the security, using non randomly generated keys makes it harder to make any security claims about this technique. One-time pads are also subject to numerous side channel attacks, including arbitrary message modification.
Edit: IIUC, it works like this. Let's say plaintext1[1] == 'a', and plaintext2[1] =='b'. Then ciphertext[1] = i, with i chosen such that key1[i] == 'a' and key2[i] == 'b'. Of course this means that you'll be repeatedly using the same key material which is very much not how an OTP works, and will most likely be blowing up the data by a factor of 4 on encryption (each byte becomes a word).
>Unlike alternative plausibly deniable cryptosystems like the recently discontinued TrueCrypt—whose ciphertext size grows in proportion to the number of plaintexts (i.e., hidden volumes) it encrypts—Lenticrypt's ciphertext size is proportional to the largest plaintext it encrypts.
If you're objecting to the claim that the ciphertext will be blown up, please note the word 'proportional' in there. Producing a word of output for every input byte of the largest input file is still proportional. All that's saying is that the bloat factor is the same whether you're encrypting 2 files or 10. (The claim they're making here seems pretty worthless anyway, since the required key size will grow absurdly quickly as the number if input files is increased).
If it behaves like a one-time pad, where f(d1, k) = d2, and you can find a d' such that f(d', k) = d3, then it means that d' is likely to be gibberish and I don't understand what this is doing.
I probably don't understand the requirements for the keys; do they need to be at least as long as the cleartext? Otherwise, there's a bug:
With copies of keys and cleartexts from /usr/bin, I tried
./lenticrypt.py -e eqn shotwell -e grep php -o f1
php was the largest cleartext at 4388Kb. Memory use by lenticrypt stopped growing at 474Mb. The eqn and grep keys were both about 148k. After 15 minutes (on an admittedly rather old laptop, though very high end six years ago) and 57% encrypted, the program suddenly exited with no error and status 0, and f1 at a size of 6468K. Regrettably,
bash-4.2$ ./lenticrypt.py -d eqn f1 > shotwell.d
Found length header. File format version is 3
Traceback (most recent call last):
File "./lenticrypt.py", line 773, in <module>
for byte in decrypt(args.decrypt[1], args.decrypt[0]):
File "./lenticrypt.py", line 630, in decrypt
file_length = struct.unpack("<Q", raw_length)[0]
struct.error: unpack requires a string argument of length 8
[Edit] the 15 minutes were spent with one core at about 100% CPU use. L1 cache 32k, L2 cache 4Mb, no L3 cache. DDR2-667 memory.For an extremely contrived example:
Intended Plaintext for Alice: HI
Intended Plaintext for Bob: BY
Communicate to Alice that the key is : HITIME
Communicate to Bob that the key is : BODYME
"Cyphertext": Index 1, Index 4
Tell the government that the key is : NOHOME
Isn't that true of any cryptosystem?
EDIT: follow-up is correct; this is only true of OTP. Sorry for the noise.
the only system that has this same property (as far as i know) would be the one-time-pad.
my crypto is a bit rusty, so i may be wrong..
#desired plaintexts > #public domain keys