It's probably dublicate but I can't figure out the correct keywords for search. You can help by just telling me those words, I'm rather good with Google :)
I want to develop somewhat like file storage with encryption of every file. There is only one user, and all the data (and code) is stored on his local machine. User is able to import some files in and read the formerly imported ones.
Requirements
Main attack vector is unauthorized data reading. No need to protect from illegal importing files.
In addition, I'd like to implement plausible deniability. It will look like this: there's two storage actually, one of them is encrypted with empty password and it's OK to expose it's contents to anyone. It is used to obscure the fact that there's something hidden. Just an additional shield.
The key that the whole system's security is based upon is that user's password is stored inside his head only, i. e. not reachable programmatically (unless there's keylogger, telepathic software, or satellite with hi-res camera that can see you typing).
Implementation
For now I've end up with the following scheme.
User's password is a key for encrypting/decrypting the random generated level 2 password(s). Symmetric cypher is used (e. g. AES which is considered secure for the moment).
Level 2 cryptography is asymmetric. Encryption (public) key is used when importing unencrypted files from external sources. Decription (private) key is used for reading files. As asymmetric algorythms are slow, these keys are actually used to protect the session key (unique for each file). Private key is available in memory as plain text only when encrypting session key.
Level 3 uses symmectric cryptography, AES again or some secure stream cypher (only in case of much much better performance because security is preferred). It is used to actually encrypt/decrypt file contents.
You've finally read it to the end :) Here are the questions:
How to simplify this scheme not harming the security?In short: remove middle level. Still have to use two levels though, to prevent cypher fatigue/enthropy exhausting and to satisfy my paranoia :)
How to enhance it's security? I know there are bugs here, crypto is a tricky thing.Many thanks to @DeerHunter to point out potential flaws.
What to google and to read about this? No fundamental things like Shneier please :)Well, I've got enough terms and concepts to dive into. For now, at least.
I'm still not sure whether I should use asymmetric cyphers (in level one). I thought that it would help to split the risks: decryption (private) key is spawned as plaintext just for a moments, while encryption (public) key can even be exposed to everyone. But in comparison with symmetric syphers, I still have one key to secure in RAM, and there's additional (public) key to worry about.
EDIT1. I don't want to design my own standard, it's far beyond my knowledge. I'm gonna use things that are proved secure where possible. E. g. what I'll do by myself is just combine several classes from Crypto++ to work together. I only need the right design to do it. For now I don't think that full-disk encryption is suitable in my case. I've thought about TrueCrypt etc but it doesn't allow to hide the presence of the encrypted data. I'd prefer solution (crypto standard or protocol) for per-file encryption.
EDIT2. Rearranged text to split requrements and implementation, added deniable plausibility req.
EDIT3 There's one more question left about asymmetric crypto.