Cryptographic obfuscation and 'unhackable' software
blog.cryptographyengineering.com
blog.cryptographyengineering.com
However, there is another approach where B is just an untrusted third party where you want to outsource the computation. In other words, A wants to get back the result and check it, without B knowing anything of it. There is actually a(n almost) generic construction that allows that [2]. In short, you consider the boolean circuit of what you want to compute and transform it so that the inputs are keys necessary to unroll the computation, until getting the encrypted result. More specifically, step 1 gets the input keys and compute some new key (amongst several possible); step 2 use this key for next computation and so on.
On the one hand, this constructions are very neat because they give us a better understanding of what we can do with cryptography. On the other hand, they can be a little frightening because they are the theoretical grail for DRMs and such.
[1] https://en.wikipedia.org/wiki/Verifiable_computing
[2] Part 1 of A Proof of Security of Yao's Protocol for Two-Party Computation, http://eprint.iacr.org/2004/175.pdf
Definitely. I can't help thinking that the ones who will end up using this sort of technology are corporations who want to control their users, and malware writers. The phrase "Those who give up freedom for security deserve neither" and http://www.gnu.org/philosophy/right-to-read.html also come to mind... it's scary, security is a double-edged sword.
For example, an adventure game could use this to great extent. There simply wouldn't be a way to know the story until someone would actually managed to go through it and tell you. There could be hidden levels or easter eggs and no one would ever know.
(I came up with this when I was thinking of a Minecraft clone, where you would have to discover the recipes to build stuff on your own. Although I was thinking about simply using hashed input into recipe routine for obfuscation.)
I don't see why you'd engineer out of the game every social element that makes them fun. The only category that would work for is if you procedurally generate every run through of the game and randomise all the mixes so 2 people talking to each other on computers next to each other literally don't have the same game to mix the same items together.
So people wouldn't be able to spoil the twist until someone actually got to it.
I think this would actually make people more likely to play it together, because there would be real discovery, and people wouldn't know for sure if they REALLY found everything yet.
People could tell each other what they found, but they would only be able to find it by playing, not because one guy looked at the program and just made a complete list.
(I have also thought about a similar problem before, but the result ended up being really slow, and I don't know how to make a text adventure actually fun. Mostly it was just really slow though.)
...or until someone writes a bot to brute-force their way through the game, because computers are really good at trying lots of possibilities really really quickly, many orders of magnitude more quickly than a human player could.
Still an improvement/would take longer.
Also the only way I've tried takes a while to compute, so it might be more efficient to do it based on reasoning instead of based on brute forcs?
But that might be annoying to users, depending on how long it takes to run each thing.
Is there a sweet spot for the computation time is long enough that it is more efficient for a person to reason it out than for a standard home computer to brute force, yet short enough that a human player would not find the delay to be noticeable/annoying?
The string argument to SuperSecretPasswordProtectedStuff() should be const (reference, perhaps even) and of course printf() shouldn't be used in C++.
It's ... fun and interesting that such a super-minimal example of source code (from a research professor for crying out at 200 dB(A)) has those kinds of "sloppiness indicators" in it.
Or am I just being grumpy?
Regardless, I'm glad to see someone trying to shed some proper light over the obfuscation research, I too was underwhelmed by Wired's coverage. I'm more or less clueless when it comes to all things security-related, though.
But yeah, great article, imho, in that it clarified these concepts a lot for me, as a non-crypto person.
Maybe your stackoverflow neurons put the extra 'f' in the pseudocode print() calls, or maybe the author edited it after seeing your comment :)
> obfuscating 'symmetric' primitives like pseudorandom functions
So how would be obfuscated and indistinguishable RNGs be useful, if they generate the same numbers? I'm sure there is something there, but the article doesn't tell :-/
You can think of a PRF as a keyed hash. Now, you can turn this into an encryption scheme by running it in counter mode:
keystream = PRF(K, 0) || PRF(K, 1) || ...
ciphertext = plaintext XOR keystream
Now suppose we can obfuscate this PRF with a specific key (i.e. Obf(PRF(K, _))), in a way that makes it impossible to find out what K is. Then you can distribute the encrypted program as a public key, and the private key would simply be K. That's the gist of it.You could probably manage to do it with a block cipher though.
They do this by not using a counter, but randomly-selected nonces that feed a keyless stream generator (like AES-CTR with a fixed known key), and use a mechanism (puncturing) to 'blacklist' previously-used nonces so that they reveal nothing about previous keystreams used. Without being able to ask for encryptions of arbitrary messages using a previous nonce, the attacker has little options.
Granted, this is annoying because you have to 'recompile' the obfuscated encryptor for each new nonce, but that is of no concern in the model being used.
Aren't those largely one and the same?