We return to our STOC recap programming with Justin Holmgren, who will tell us about an exciting new result in program obfuscation. (However, he doesn’t tell us how to say “indistinguishability obfuscation” 10 times fast).
Justin Holmgren on How to Use Indistinguishability Obfuscation: Deniable Encryption, and More, by Amit Sahai and Brent Waters
One very recent topic of study in cryptography is program obfuscation – that is, how to make a program maximally unintelligible, while still preserving the functionality. We will represent programs as circuits, which for most purposes is equivalent to any other representation. At some level, obfuscation of a program seems like it should be an easy task – any programmer knows that it’s easy to end up with unreadable spaghetti code, but theoretical treatment of the issue was lacking, and finding a construction with provable security properties has proven quite difficult.
In 2001, Barak et al.  precisely formulated black-box obfuscation, which says that if you can compute something given the obfuscated program, you could also compute it given black-box access to the program. This is a natural and very strong notion of obfuscation. If we could obfuscate programs according to this definition, we could easily solve many difficult problems in cryptography. For example, a public-key fully homomorphic encryption scheme could be constructed from an ordinary symmetric-key encryption scheme by obfuscating a program which decrypts two input ciphertexts, and outputs the encryption of their NAND. Unfortunately,  also showed that black-box obfuscation is impossible to achieve.
One weaker definition of obfuscation that  did not rule out is called indistinguishability obfuscation (iO). It requires that if two circuits and are functionally equivalent (for all , ), then their obfuscations are indistinguishable. In 2013, Garg et al.  gave the first candidate construction for iO. This construction is not proven secure under standard assumptions (e.g. the hardness of factoring), but no attacks on the construction are currently known, and it has been proven that certain types of generic attacks cannot possibly work.
It isn’t immediately clear whether iO is useful. After all, what information is the obfuscation really hiding if it only guarantees indistinguishability from functionally equivalent programs? “How to use Indistinguishability Obfuscation: Deniable Encryption and More”, by Amit Sahai and Brent Waters , shows several applications of iO to building cryptographic primitives, and proposes iO as a “hub of cryptography”, meaning that constructions which use iO as a building block would be able to benefit from improvements in the efficiency or underlying computational assumptions of iO constructions.
As a first example of how to use iO, they show how to construct an IND-CPA public key cryptosystem based on one-way functions and iO. This uses a few other basic and well-studied cryptographic primitives (it is known that all of them exist if one-way functions exist). First, a pseudorandom generator is a deterministic function which takes as input a random string , and computes a longer string which is indistinguishable from truly random. The length of can be polynomially larger than the length of , but we will let be twice the length of . A pseudorandom function family is parameterized by a secret key and an input , and produces outputs of some fixed length. Oracle access to for some random unknown is computationally indistinguishable from oracle access to a truly random function. The main special property that  require is a puncturable pseudorandom function family. That is, for a secret key and an input , a “punctured” key can be computed. allows one to compute for all , but essentially reveals no information about .
The power of iO comes from combining its indistinguishability guarantees with those of other cryptographic primitives, in what is known as the hybrid method. We will start with the security game played with a real scheme, and give a sequence of other games, each indistinguishable from the previous one to the adversary, such that the adversary obviously has no advantage in the last game. This will prove that the scheme is secure.
For example, a simple public key encryption scheme for one-bit messages (let be a PRG, and be a puncturable pseudorandom function family) would be the following.
- The secret key is just a puncturable PRF key .
- The public key is the obfuscation of an Encrypt program. Encrypt takes a message and randomness , and outputs .
- To decrypt a ciphertext given , one just computes .
In the IND-CPA security game, there is a challenger and an adversary. The challenger generates the public and secret key, and gives the public key to the adversary. The challenger also generates an encryption of a random bit , and gives this to the adversary. The adversary wins if he can guess the bit that the challenger chose.
In the first hybrid, the challenger encrypts by choosing a truly random , and generating the ciphertext . This is indistinguishable by the security property of a pseudorandom generator.
In the next hybrid, the program Encrypt which is obfuscated and given to the adversary uses a punctured key instead of the full PRF key . This is with high probability functionally equivalent, because is most likely not in the range of . So by the security of iO, this hybrid is indistinguishable from the previous one.
Next, the ciphertext is generated by choosing a truly random bit , and generating the ciphertext . This is also indistinguishable to the adversary, because the punctured key reveals nothing about . That is, if these two hybrids were distinguishable, then given only , one could distinguish between a truly random bit and the true value .
In this hybrid, it is clear (by analogy to a one-time pad) that no adversary can distinguish a ciphertext encrypting from a ciphertext encrypting . So the original scheme is also secure.
Sahai and Waters achieve more than just public-key encryption – they also achieved the long-standing open problem of publicly deniable encryption. This is an encryption system for which if , one can also compute a “fake” randomness for any other message such that is also equal to c, and is indistinguishable from . The motivation is that after a message is encrypted, coercing the encrypter into revealing his message is futile – there is no way of verifying whether what he says is the truth. Note that of course the decrypter could be coerced to reveal his secret key, but there’s nothing that can be done about that.
The basic idea of the deniable encryption scheme is that the encryption public key is again an obfuscated program – this program takes a message and randomness string. If the randomness string has some rare special structure (it is a hidden sparse trigger), it is interpreted as encoding a particular ciphertext, and the program will output that ciphertext. Otherwise, the program encrypts normally. There is also a public obfuscated Explain program, which allows anybody to sample a random hidden sparse trigger, but not test whether or not a string is a hidden sparse trigger.
At present, iO obfuscation is known to imply some very powerful primitives, including for example multi-input functional encryption. It is still open to construct fully homomorphic encryption for iO, or even collision resistant hash functions from iO, or to show that no such reduction is possible.
 On the (Im)possibility of Obfuscating Programs, Barak, Goldreich, Impagliazzo, Rudich, Sahai, Vadhan, Yang, 2001.
 Candidate Indistinguishability Obfuscation, Garg, Gentry, Halevi, Raykova, Sahai, Waters, 2013.
 How to Use Indistinguishability Obfuscation: Deniable Encryption, and More, Sahai, Waters, 2014.