>> Seny Kamara: So it’s a pleasure to have Mariana Raykova speaking today. Mariana is a research scientist at SRI. She graduated from Columbia. She did her postdoc at IBM Research. I guess most of you know her. She’s done two, no three internships here. Two in the crypto group and one in the security group. And today she’ll be speaking about obfuscation. >> Mariana Raykova: Thanks Seny. Hello everyone. Today I’m going to present to you our work on indistinguishability obfuscation and constructing functional encryptions for all circuits. This is work in collaboration with Sanjam Garg, Craig Gentry, Shai Halevi, Amit Sahai and Brent Waters. So let me start by saying a few non-formal words about what obfuscation is. So code obfuscation, the goal of code obfuscation is to make programs unintelligible while at the same time maintaining their functionality. So this is one example that I took from Wikipedia of how people currently do obfuscation and what obfuscated problems look like. So if we say this initial goal, there are several questions that arise immediately. First one obviously is why would we want to do anything like this? What is this for? The next one is what unintelligible really means? Is there a way to formalize what this unintelligible means? And then the third one is once we have set up these two questions is, can we really achieve anything with these properties? So in this talk I hope that I will give answers to all three of these questions, more or less satisfyingly you will see. So let’s start with the first question. Why would we want to do obfuscation? Well obfuscation in general gives us the ability to hide secrets in software. It’s like, at the very high level. So we imagine that we have the AES, which is a symmetric key encryption. And then we look at the circuit of AES and we also embed there the secret key that we will use for the encryption. So we start with the secret key encryption. And if we obfuscate the circuit we immediately get a public key encryption. So the obfuscation of this AES circuit with the embedded key is a public encryption. And the advantage is that if the obfuscation does not add too much overhead then we have more efficient public key encryptions because in general symmetric key is much more efficient than public key. So another example that we can sum up with this. Imagine that we have a company and we came up with a proprietary algorithm for DNA classification. And we would like to release software that allows people to use this algorithm, but at the same time we don’t want to reveal our secrets in designing this algorithm. So what we can do, is we can provide an obfuscation for our program that is implementing the algorithm while hiding our proprietary information. And then the third example that I would mention is maybe when we think about distribution of software patches. So assume that we have found out that our program has some vulnerability and we want to distribute a software patch. But if people are able to look at this patch that we are distributing, this would also immediately point them to the vulnerability so they can try and leverage this into a patch of already existing software. However, if we had a way to obfuscate this patch, then we can release this fix while hiding the vulnerability as well. So these are… >>: [indiscernible] too or just the patch? >> Mariana Raykova: I mean once you want to apply the patch then you have to, you also, you don’t need to have it obfuscated. It can be in the clear. So but, and in… yeah? >>: If it’s in the clear, if you have an obfuscated patch and the thing you’re patching is in the clear, then you can see which part is updated so you know where the vulnerability is. >> Mariana Raykova: Yeah. So I mean if you assume that you can compare the two things and then find out just by the comparison on the whole code where the change is, then yeah. So the question is whether you, maybe the patch is much smaller and just by looking in the patch you can get the direct pointer to the place where you are patching. So in general, obfuscation is used in contemporary work where people try to come up with that whole solution for obfuscation which mostly implements the principal of security-via-obscurity. So what they really do is make time consuming reverse engineering on a particular obfuscated program. But in no way do they provide any provable properties for existing obfuscations. So this means that our challenge as cryptographers is really to construct obfuscation schemes that provide provable security guarantees. And if you happen not to be into application and you don’t care about applications of obfuscation, I will give you another motivation that you might care about just by virtue of the fact that obfuscation is a very useful primitive. And there is this whole series of new results in crypto that came out immediately after this paper and they implement many new and interesting functionalities which were not possible before we had obfuscation. And for the purposes of this talk, I will actually focus on functional encryption which is a result from our paper. So using obfuscation we construct functional encryptions for all circuits. And here I will take a little deviation to tell you what this functional encryption, what kind of functionality functional encryption provides for you. So basically functional encryption is a generalization of usual encryption keys that give you a way to define a special type of decryption key, decryption key that reveals not the whole encrypted message but only a function evaluated on this message. So imagine that we have Mary who has her driving license and then we encrypt the driving license using functional encryption. Then when Mary goes to the bar we can provide the bartender with the key that allows him to decrypt the ciphertext from the functional encryption and the only thing that he learns is whether Mary is over 21. And the same thing we can provide the policeman with a decryption key that allows him just to learn the type of driving category for Mary’s driving license. So this is the functionality of functional encryption and I will later show you how to construct it. So what are our results in this paper that I will present from now on? So we propose the first indistinguishability obfuscation scheme for all circuits. There are two steps in our construction. We first give a candidate obfuscation construction for our shallow circuits or circuits that can be substantiated in NC1. And then we show how to use this obfuscation of NC1 circuits together with fully homomorphic encryption to obtain obfuscation for any circuit in P. So this is our result on obfuscation and then using obfuscation together with functional encryption I will show you how to construct a functional encryption scheme. For the purposes of the presentation I will shift a little bit the order in which I will talk about the different parts of our results. And the reason for this is that this is really the most complicated part, the most messy part maybe from the talk because this is where we also introduce a new hardness assumption. So I will start from the ones that are clean and smooth constructions with nice proofs and then I will proceed to the more complicated one. Yes? >>: [indiscernible] >> Mariana Raykova: Well for this particular example of functional encryption yeah, you can think of… >>: [indiscernible] >> Mariana Raykova: I really, yeah you can just provide the ciphertext and you can do the decryption on the ciphertext. You don’t need any interaction beyond that. So let’s now start with the more formal definition of what obfuscation is. So an obfuscation is a probabilistic algorithm that takes the input of certain program C or a circuit C and then it outputs another program which we will call the obfuscation of this program C prime. And we want, we require the following three properties from our obfuscation. First we want to guarantee that the obfuscation of the function computes exactly the functionality that we started with. So any input evaluation of the original circuit is the same as the evaluation of the obfuscated circuit. Then we want to guarantee that the obfuscated version of our program introduces only polynomial overhead in the original size of the [indiscernible] circuit. And then the third property is the property that I will just state here as unintelligible because there are many ways in which we can compartmentalize the unintelligible. And I will explain the several different flavors that we can require for security. Yeah? >>: [indiscernible] >> Mariana Raykova: It’s large. I don’t know the exact degree but it’s very large. So the first way that we can formalize the security for obfuscation is through what is called virtual blackbox obfuscation. And this security definition tries to capture the intuition that even an obfuscation for a circuit, this does not reveal anything more than a black-box access to the circuit. So it just allows us to feed it input and see the output of the computation but we don’t learn anything more apart from that. And the formal way that we state this security definition is by saying that for every polynomial time adversary A there exists a simulator S such that for all circuits the view that an adversary gets from the obfuscation of the circuits is indistinguishable from a view that’s produced by the simulator which is given all the black-box access to the functionality. So basically this captures the fact that if there is a simulator that can produce this indistinguishable view and it is given just the black-box access to the circuit, then certainly the obfuscation doesn’t reveal anything more. So this is very strong and very good security definition. The bad thing is that it’s impossible. And the work of Barak et al which also introduced this definition shows that achieving black-box obfuscation is impossible. And in particular they construct unobfuscatable family F together with some property about these families such that you can efficiently compute this property if you are given any circuit that computes f. However if you are just given random oracle access to the functionality f there is no way that you can compute this property p. And also the impossibility result for the virtual black-box obfuscation extends to the case when we allow inefficient obfuscator. So the obfuscation algorithm doesn’t need to be polynomial [indiscernible] and so the impossibility result holds. So if we have this impossibility result the natural thing is to try to look at a relaxed definition of security for obfuscation. And here comes the notion of indistinguishability obfuscation which was also introduced in the same work of Barak et al. Indistinguishability obfuscation tells us the following. It tells us that if we start with two circuits that compute the same function or this means that evaluation on any input of the circuit C0 is equal to the evaluation on the same input of the circuit C1, then the obfuscations of the two circuits are indistinguishable. So note that inefficient indistinguishability obfuscation is always possible. For this we can think just about the lexicographical order of all circuits that implement a particular functionality. And we can just designate the first circuit in this lexicographical order as the obfuscation for this functionality. The only problem is that computing this canonical order is inefficient so you don’t get indistinguishability efficient. We don’t know so far how to do efficient indistinguishability obfuscation. Also Goldwater and Ludlam introduce the notion of best possible obfuscation which tries to capture the fact that the obfuscation of a particular function doesn’t allow a learner to learn anything more than any other circuit that implements the same functionality. If we are concerned with just computational indistinguishability then the notion of best possible obfuscation is exactly the same as indistinguishability obfuscation. And since we will be talking only about computation or indistinguishability in this talk, for us indistinguishability obfuscation is equal and the best possible obfuscation. So let’s start with our actual construction for indistinguishability obfuscation. As I mentioned, it will consist of two steps. The first step will be constructing indistinguishability obfuscator for shallow circuits and this construction would be using multi-linear maps and then it will be introducing some complex new assumption. And that’s why we will leave it for later. And the second step in our construction will be to bootstrap the indistinguishability obfuscation for NC1 together with fully homomorphic encryption and to obtain indistinguishability obfuscation for any circuit of in P. This will be a simple and provable construction and that’s why we will start with this construction. So how do we start with an obfuscation in NC1 and obtain obfuscation for any circuit? Well let’s think about what are the properties that homomorphic encryption gives us. So we have some function f that we want to compute an obfuscation of this function. So if we imagine that we encrypt the function f with fully homomorphic encryption, then we get an encryption of the function and we have the property that we can take any plain text input and we can evaluate it with this encrypted function. And we will obtain the final output type of x. But the only problem is that it still we be encrypted under FHE. So, and in the functionality obfuscation we really want to be able to get this output result in the clear. So also when we do this evaluation we will keep a transcript of all the steps that we performed when we were evaluating the encrypted function f on the plain text x. So now we can imagine defining a circuit that takes as input the plain text x. The result of the evaluation f of x and also this transcript that is telling us exactly what happened in the evaluation. And we can take this as a proof that we really performed the evaluation of this encrypted function f on the input x and we can check that really the evaluation, the result of this evaluation f of x is the evaluation of the encrypted function f on the input x and the result is this ciphertext c. So if we can check this proof that guarantees that this is really a ciphertext obtained from the honest evaluation, then we can also use the secret key for the fully homomorphic encryptions key to decrypt the ciphertext c. And note that this functionality that I describe here in this box is all circuits and NC1. This is based on the fact that we have proof for which verification algorithm is in NC1 and also we have fully homomorphic encryption schemes for which the decryption circuit is also in NC1. So now that…yeah? >>: [indiscernible] >> Mariana Raykova: Output fx? >>: [indiscernible] >> Mariana Raykova: So we, but we need to talk [indiscernible] f of x. Right? And f of x is only encrypted. We have only f of x encrypted. Yeah we have everything encrypted. So what we will do is we will obfuscate this functionality. Right? We are trying to build an obfuscation for the function f so we have to have f encrypted. We are trying to hide what’s the function. So what we will do is since we already assumed that we have obfuscation for NC1, we will obfuscate this shallow circuit. So this condition of decryption would verify that whatever ciphertext we have [indiscernible], it’s really the evaluation of our obfuscated function on some input and if this verification holds, then we can use the secret key for the FHE to decrypt the final output. So in this case our obfuscator for any circuit would consist of the FHE encrypted function f together with the obfuscation of this small condition of decryption circuit. Yeah? >>: [indiscernible] >> Mariana Raykova: So the SK is embedded in here, right? This circuit will have SK hardwired. Yeah, so when you write the [indiscernible] your obfuscation algorithm will be the one that generates the parameters for the FHE. You encrypt the function that you will be obfuscating. And then you generate the obfuscation. So we are assuming that we have NC1 obfuscator, right? We are just using it to obfuscate this function here which consists of the proof verification and then the FHE decryption. >>: [indiscernible] >> Mariana Raykova: So I haven’t told you anything about the proof yet. Right? I will proceed with explaining what happens with the proof. So Brian was hitting on the correct question is that you can prove this construction security only if you assume virtual black-box obfuscation. So that’s why we will have to modify this construction. So instead of having one set of FHE encryptions, we will introduce a second parallel FHE encryption scheme. So we will encrypt twice our obfuscated functions on the two different FHE encryption keys. We can similarly obtain the evaluation, the encrypted, the result of the evaluation encrypted under the two different keys. We can keep the transcript that exactly the same way. We can define the condition of decryption [indiscernible] in NC1, which is good. And we can obfuscate this part so now our obfuscator for the whole p will consist of the two encrypted functions f under the two different keys and the obfuscation of the condition of decryption. So now this construction is good enough to prove indistinguishability obfuscation for NC1. And here is an outline of the proof idea how we will show this. So in the proof we have to show indistinguishability obfuscation. We have to show that this construction is a good indistinguishability obfuscator. And as a reminder this means that we have to show that the indistinguishability obfuscation of C1, of C0 and C1, when they evaluate exactly the same function are indistinguishable. So we have to show that this set of two ciphertext and the conditional decryption obfuscation of the condition of decryption is different from these two. Where the difference is really, okay, so let’s go through the steps. So I will show you a number of steps transformation that we will start from this distribution and we will end up in this distribution and I will show you at each step why two consecutive steps are indistinguishable. So what is the first step? Well in the first step we will change the second encryption. Instead of encrypting the circuit C0 it will encrypt the circuit C1. And why do we claim that these two are indistinguishable? Well we will claim that these two are indistinguishable because of the semantic security of the fully homomorphic encryption. We just have two different encryptions of two different semantics. And also by virtue of the fact that we haven’t used anywhere the secret decryption key for the second FHE. What we are using here is the decryption key for the red FHE parameters. The next step will be changing the obfuscation where instead of embedding SK0 we will be embedding SK1. And why these two [indiscernible] will be indistinguishable will come from the property of the indistinguishability obfuscation of NC1. Because these two circuits will still evaluate exactly to the same on any input. Together with the property that we have perfectly sound non-interactive witness indistinguishable proof, which basically means that nobody, no adversary can generate cheating proof that would allow you to decrypt if you are not feeding exactly the same encryption if you haven’t evaluated the red ciphertext and the yellow ciphertext on two different messages. So this indistinguishabilty of these two sets follow from the obfuscation, the indistinguishability obfuscation property for NC1 together with this [indiscernible] this property of our proof. Yeah? >>: [indiscernible] >> Mariana Raykova: So this means that one of them is decrypting the output here and one of them is decrypting the output here. We know that these two circuits evaluate to the same. Right? This is our starting definition, is that C0 and C1 evaluate to the same on any input. So you just have to make sure that when you produce the correct proof that says that the yellow and the red were evaluated exactly on the same input. So if we have guaranteed that they are evaluated on the same input then you are guaranteed that their output will be the same. Yeah? >>: [indiscernible] >> Mariana Raykova: Yeah the encryption always… >>: [indiscernible]. Where do you use this? >> Mariana Raykova: You use, here the, you use it by the fact that you cannot provide input for the obfuscations that evaluated the two ciphertext on two different inputs. Right? As part of the proof you are checking that the two ciphertext that you are giving into the obfuscation are evaluation of the two encryption of the same function on the same input. Because if you were able to see the two evaluations on two different inputs then you will be able to, in one case you will be decrypting the first one and the other case you will be decrypting the second one. And if you manage to cheat and provide two different inputs then you will be able to evaluate. So you have to guarantee that he is not able to produce a cheating, that there doesn’t exist a cheating proof for this system. And we, I mean in our paper we construct such a proof system. >>: [indiscernible] >> Mariana Raykova: So the verification algorithm is in the obfuscation. So the next step is just switching the first ciphertext. The security here is again from the semantic security of FHE. And then the last step of switching the key back from SK1 to SK0 again follows in the same way as the previous step. So this is the outline of the construction from NC1 to P. Now I will proceed with the next clean construction which is the functional encryption construction starting from obfuscation for all circuits. So let me define what functional encryption is. So a functional encryption consists of an algorithm that produces the parameters for this key which is a public encryption key. And then a master secret key. Then we have an encryption algorithm which takes a message and encrypts that message under the public key. We also have a key generation algorithm which takes the master secret key and the particular function which will be associated with the resulting decryption key. So it produces a decryption key associated with F and when we want to decrypt a particular ciphertext that encrypts a message m with a decryption key that’s associated with function F, then the output of the decryption is the evaluation of F on the encrypted message m. So this is the formal definition of functional encryption. So let’s see now how we construct functional encryption, if we have obfuscation for any circuit. So the set up for our functional encryption key will consist of generating two pairs of parameters for semantically secure public encryption keys. Then if we want to encrypt a message m, what we will do is we will encrypt the message under the two public keys for the public encryption key. And then we will also produce a proof that these two ciphertexts encrypt the same message. So our ciphertext will be two ciphertexts and a proof. Then if we want to generate a decryption key for a function F, what we will do is we will generate an obfuscation for a function that takes a function encryption ciphertext which is two regular ciphertexts and the proof. It checks the proof which guarantees that the two ciphertexts encrypt the same message. And if this verification holds, then what we will do is we will decrypt the first ciphertext which is under the SK0 key and then we will take this decrypted value and we will evaluate only the function F. And this will be the output. If this verification did not hold, then the decryption will fail. I mean this verification wouldn’t hold only if you don’t have a correctly constructed ciphertext. And then the decryption is easy. We just interpret the decryption key as an obfuscated program and we evaluate it on the particular ciphertext. So this is the whole construction for the functional encryption. It’s very similar to the… yeah? >>: [indiscernible] >> Mariana Raykova: Yeah. We will use it in the proof. We will need it only for the proof, which appears on the next slide. So why did we need really these two parallel encryption keys? I mean you can, might be reminded of the proof for CTA security from [indiscernible] where they have this parallel, two public key encryption schemes. So what is, I never mentioned to you, what is the definition of security of functional encryption. So there are different notions of security for functional encryption. There are simulation definition which we know is impossible. And that’s why we will prove security for another, security definition, which is indistinguishability security, which roughly says that the encryptions of two messages are indistinguishable if you are given decryption keys for function that evaluates to the same value on the two messages. That’s the intuition for the security definition for indistinguishability. So what does this mean? So we have an encryption of the first message. And then we have a decryption for a function, for a particular function that obeys this property. And then we will have the encryption of the second message with the decryption key of the same function. So I need to show you how to transition from this distribution to this distribution, and claim that these steps are all computational indistinguishability. So first step that we will do, is we will change the encryption, the proof in this encryption with a simulated proof. So for this we need to have statistical simulations on [indiscernible], which we know how to do. The next step will be once we have the simulated proof, we can afford to change the encryption in the second ciphertext from m0 to m1 because we already have the simulated proof and the whole point of the proof was to guarantee that these two things are in the same. These two steps are indistinguishable just from the semantic security of the public key encryption. Then what we will do is we will start actually using the second encryption scheme parameters. So we will change the decryption key. Instead of using the decryption key for the red scheme, to use the decryption key for the blue scheme, which means that in the decryption step you will decrypt the second ciphertext instead of the first one. So here you are decrypting C0 and then evaluating the function. Here we will be decrypting C1 and then evaluate the function F. Why are these two steps indistinguishable? Well because we have a guarantee that F of m0 is equal to F of m1. So these two obfuscations are obfuscations of functions that are really evaluating exactly the same functionality. They have the same output on any input. Right? The only reason is that this is a simulated proof for the challenge message as any adversary, no adversary can generate a simulated proof. So an adversary would be able to produce only valid encryptions that encrypt the same two messages in the two slots. So these two decryption keys obviously will evaluate to the same. And on this challenge message we will have the property that F of m0 is equal to F of m1 so this follows that these two steps are indistinguishable. And we basically continue in the same way, switching the first message back to m1 and then switching the decryption key from using SK1 to using Sk0. So this is basically how final the proof for the construction. So now that we have gone through all the nice construction with a relatively clear proof, we will go to the obfuscation construction for circuits in NC1. So let’s start with all the ingredients that I will be using for this construction. And then I will tell you step by step how we will put them together into our construction. So we will be using a representation of circuits in NC1 using branching programs, which were introduced by Barrington. We will also use Kilian’s technique for randomizing branching programs. We will also use multi-linear maps for which we have the construction of Garg, Gentry, Halevi and then Karong [phonetic], La Pointe [phonetic] and [indiscernible]. So we will put all these things together and then I will describe several different further modifications that are in to do with different issues that this original construction will have. They will come as defenses to particular attacks that we saw in the original construction. And then at the end I will state for you a complicated assumption and give you some, point you to some evidence that maybe it is a good assumption. So what is a, what are branching programs or oblivious branching programs? They were introduced as a computational model which was introduced by Barrington in ‘86. So how do you describe computation with a branching program? So if you have a branching program of length m that takes input of length n bits, consists of m pairs of matrices which, these should be 5x5 matrices, so all these matrices are 5x5 matrices. And then in addition to that you have a function that tells you, that maps any position in the branching program to a bit in the input. So you have these [indiscernible] for each position, [indiscernible] of matrices for each position of the branching program. And then you have a function that tells you, for each position in the branching program, which input you have to look at. Why would you be looking at the input? Well, for the evaluation. The evaluation of a branching program for a function F consists, is basically the multiplication of all, of one matrix in each position, where you choose which matrix to take, depending on the input bit in the position given by this map. So for each position in the branching program, you look at this function and if the input bit was one, you use the matrix for A1. And if the input bit was 0 then you use the other matrix. Really I think the best thing is to look at an example to understand how branching programs work. So imagine that you have a branching program of length 9. So this means that you have 9 [indiscernible] of matrices. And if this branching program has input of length 4-bit, and then the map that maps branching program positions to input bits says that the position 3, 6 and 9 are determined by the first bit in the input. So if this first bit is 0, then for the evaluation we have to use the matrices that correspond to input bit 0. Then similarly, we can look at the subset of position in the branching program determined by the second bit in the input. So if that input is 1, then we take the other matrices and we do the same thing with the rest of the input bits 3 and 4, and put the evaluation on the branching program. We just select the corresponding matrices and we multiply them all together. Once we have multiplied these matrices, we check whether the product is the identity matrix. And if the product is the identity matrix, this means that the output of the evaluation is 1. Otherwise the output of the evaluation is 0. This is how branching programs work and this is how the computation in a branching program is described. Barrington’s theorem says that every function that’s computable by a depth d circuit has a branching program representation that is of length of 4d. And what does this mean, is that every circuit that’s an NC1, which means that it’s a depth of O of log n has a branching program of polynomial length. So that’s why our construction would really work for functions in NC1. So we have defined what the branching program is. Let’s try to see what the randomized branching program is. Let’s use an approach that was introduced by Kilian. And in his paper he was using randomized branching programs for two party computation. So we will use them in different context. So if we started with a branching program that was of length m and takes input of size n, then we obtain a randomized branching program by sampling m random matrices, random invertible matrices, also of size 5x5. And we compute new matrices which are the product of the original matrices in the branching program, multiply those both sides with two of the random matrices, which is the matrix in position i minus 1. And then this is the invert of the [indiscernible] following randomizing matrix at position i. So basically you insert all these m random matrices in between your other matrices. What this enforces is really that the only way to evaluate a branching program is in the correct order. You cannot mix matrices and take a matrix at position 10 and then put it in position 2 instead of that. You keep the mapping exactly the same, the mapping between… yeah? >>: [indiscernible] >> Mariana Raykova: I mean you can compute different… >>: [indiscernible] but you can certainly multiply all the even pairs together and then… >> Mariana Raykova: Yeah but if you, you will not, you will break the property of the branching program that… >>: [indiscernible] >> Mariana Raykova: So basically the randomized branching program now consists of these new randomized matrices and the original map between positions in the branching program and the input. And this randomized branching program provides a single input privacy, which means that if you look at the matrices that correspond to a single input for an evaluation, these matrices don’t reveal anything more than the output of the computation. The only meaningful thing you can obtain from them is if you multiply them in order and then compare them against identity. And this is basically the idea of Kilian’s two party computation protocol. What we want to do here is we want to use these randomized branching programs to do obfuscation. We want to somehow embed them in a protocol that says that when we give them out, really this is an obfuscation from the program. The only thing we can do is multiply in the correct order and evaluate a function. We are still far from that and so how would we want to use this randomized branching program? Well we want to compute a randomized branching program for a universal function and then provide for the positions that are determined by the obfuscated function. We will provide only one of the randomized matrices from the branching program. And for all positions that are determined from the actual input on which we will be evaluating F, then we will provide both matrices. We will evaluate the obfuscation just in the same way we were evaluating a randomized branching program. Of course this is not sufficient construction because once we give more than one input for a branching program, more than one matrix for a position for the input, then the privacy for the inputs is lost. So how are we going to fix this problem? Well we would encode these randomized matrices using multi-linear maps. So that’s how we will be hiding the matrices. So let me define what a multi-linear map is. It is basically a cryptographic primitive that allows you to do both addition and multiplication on encoded values. So you have, you start with several groups and then you have a map that allows you to compute operation on encoding the two values that result into an encoding of the product of these values. And the difference from a multi-linear map and fully homomorphic encryption is that you have an additional property that you can, in this idealized definition of the multi-linear map, you will be able to do comparisons, multi comparisons. In reality we don’t have a construction for this idealized definition of a multi-linear map. What we have is actually approximation of a multi-linear map where the encoding algorithm is randomized algorithm. It’s not a deterministic algorithm. So we don’t just take Ga for the encoding. But then we have a function that’s called zero-test, which basically allows you to test whether a particular encoding is an encoding of 0, which helps you do the quality test. The hardness assumptions for multi-linear maps are analogs to the descript log and the multi-linear DDH. So we have two known constructions for approximate multi-linear maps and we will be using those. So now that we have the definition of this multi-linear map, what we will do is we will take the matrices from the randomized branching program and we will encode each entry in the matrix using the multilinear map. So this notation is a bit abusing notation. This basically means that each entry in this randomized matrix is encoded using a multi-liner map. The properties of the multi-linear maps just tells us that we can perform the evaluation of the randomized branching program underneath the multi-linear map. We can do the whole multiplication of the matrices and then at the end we can also do the comparisons of the results against the identity matrix, again using the zero-test function from the multi-linear map. So is this good enough for hiding the matrices B? I mean it looks pretty good. But here is an attack that we can still do even if we have done all this encoding with the multi-linear maps. So imagine that we have a randomized branching program and we will be evaluating this randomized branching program on two different inputs, x and x prime. So the prescribed way in which we can evaluate this is select the corresponding matrices and then multiply all of them. However, what we can still do is we can take subsets of the positions, like consecutive positions, two consecutive positions with only subset of them and we can do the correct computation and we can compare these two values. We still have the power to compare these values because the randomized matrices are still aligned and we have the zero-test property from the multi-linear map. And what this attack roughly maps to is learning whether the intermediate values in the evaluations of these two functions are equal. This is a graph mapping of what this attack allows us to learn. Another type of attack that‘s still not prevented is what is called a mixed input attack. So in a randomized branching program we have this mapping that tells you which positions in the branching program are determined by a particular input. So in general in the honest evaluation what you should be doing is you should be taking matrices that correspond to the same bit when you are evaluating a branching program. However, so far we haven’t done anything that prevents an evaluator to take an inconsistent set of matrices for that position. So he can take 1 here and then 0 and 0 here. So this is what we will call inconsistent matrix selection. You can still do the evaluation and test for the results because all the randomizing matrices did this to enforce you to take one matrix in each position. But they didn’t enforce anything about consistency here. So what this attack roughly allows you to learn is what happens with the evaluation if you fix some internal wires to a particular position, to a particular bit 0 or 1. So what is the fix for these two types of attacks that are still remaining? It’s a technique that we call multiplicative bundling. So what we will do is we will compute constants for all positions in the branching program that are determined by the same input bit. We will compute constants and we will multiply them into the B matrices. And this constant will be the property that if you have taken the matrices, consistent matrices, then these constants will cancel out. They will have product 1. So if these are the matrices for 0, this 1 they will be canceling out. However, if you try to multiply inconsistent matrices as in the previous attack, then the product of this constant will be something unknown, different from 1. And this would eventually prevent you from being able to do the zero-test in the final output. So you wouldn’t be able to get any meaningful information when you evaluate the branching program with the inconsistent set of matrices and then try to do the zero-test at the end. In fact what we do in our actual construction is, we have two parallel branching programs, the real one and then a dummy branching program. The dummy branching program doesn’t do any actual computations. The only matrix that we are embedding here is the identity matrix. However, the constant that we are using in this real evaluation branching program and in the dummy evaluation program are chosen in such a way that they implore the consistent use of matrices in positions that are determined by the same bit. So we make sure the product of all the alpha constants in positions determined by the same input g is equal to the product of all the beta constants in the positions determined by the same big g. So now the evaluation is evaluate the real computation in the real branching program, evaluate the dummy branching program then subtract those to cancel out the influence of the randomizing constant. And then apply the zero-test. So basically this multiplicative bundling insures this property. Unfortunately, these two types of attacks, what you can still try to do is try to check whether you have somewhere matrices inside the computation that differ by a multiplicative constant just by doing the multi-linear map [indiscernible] the corresponding positions. This thing allows you to compute an encoding of the determinant of a matrix or try to determine the rank of a matrix. All of these attacks on these pieces in the construction we don’t know how to leverage them into an actual attack of the obfuscation. There is no obvious way how to leverage them. However, these are not things that you would like to be able to do. So even though we don’t know how to reverse and to attack, we try to prevent all these kinds of additional computations that you can do with the pieces in the obfuscation. And counter measures that we introduce to stop these attacks are the following. What we will do is we will embed the matrices from the randomized branching program in much higher dimension matrices. So what will be the dimension of these matrices will be such that you have tried to do things inside. If you tried to compute a matrix rank, we want to guarantee that you go beyond the level for the multi-linear map. And the level of the multi-linear map tells you how far you can apply the zero-test and learn useful things. So basically this extension with the higher dimension matrices will prevent the attacks that I list in the previous slide. So now what we will do is we will embed the matrices from the branching program together with this randomizing the multiplicative bundling constants in the lower right corner. Then we will generate random values in the, for the rest of the diagonal. And then we will apply the randomization for the randomized branching program on top of this newly expanded dimension matrices. So this of course introduces some issues in the correctness of the evaluation of the branching program. Because you still have the property that the multiplication in the lower right diagonal will be the computation of the branching program. However all the top, they have no interest that we introduce to be random values. They have no relation in the two, in the real evaluation branching program and in the dummy evaluation branching program. So to manage this and get back the correctness of the evaluation, we introduce what we call bookends vectors. These bookends vectors will make sure that they would cancel all the random values in the diagonals, in the top of the diagonals. And also we will make sure that the non-canceling part that will go in the lower right corner or which is the part of the randomized branching program, they will have the same product in the real computation branching program and in the dummy computation branching program. And we will also apply the randomization matrices. We will tie everything together with the randomization matrices by multiplying these bookends vectors with the first randomization matrix from the order and then we will multiply the last randomization matrix with the right bookends vector. So the evaluation now will be not only the multiplication of the matrices from the original branching program, but also at the end we will multiply with the two bookends vectors. Which the bottom line of this computation will be that you will cancel out all the random values on the upper diagonal. So you will be canceling once you multiply with these two vectors. Then we’ll have zeroes in these positions, so you will cancel the effect of the interest in this diagonal and you will be left only with the result of the branching programs which you can compare for equality. So if you didn’t follow this last part, I will tell you that there is a different way to enforce the same property that is kind of much cleaner and some works after ours introduced it. So just to recap. What is the construction for the obfuscation of NC1? We start with a branching program. Then we introduce the multiplicative bundling that forces you to use consistent matrices for each input bit. Then we embed these matrices in these higher dimension matrices to prevent all these attacks if we don’t know really how to leverage every one. Then we randomize the matrices using the randomization technique from Kilian. We compute our bookends vectors, which bring us back the correctness for the computation that was destroyed by the higher dimension. As I mentioned, there is an alternative approach where you start using asymmetric multi-linear maps that basically force you to do only the correct computations. And they rely on some other assumption, but I don’t think they introduce any more assumptions than we already have. It’s a much clearer solution I would say. So at the end, once we have obtained all these randomized matrices we encode them with a multi-linear map that has high enough level to allow the evaluation of the computations for the branching program, but nothing more. And then once you have this obfuscation the evaluation of the obfuscation function is just computation on the two branching programs. The real computation and the dummy one. And then compare the results. So what is the security of this construction? So basically the assumption that we have is that once you have this transformation, if you apply this transformation on functions on two circuits that are implementing the same functions, these two distributions of these randomized encoded matrices are indistinguishable. Basically the assumption says that once you are given this obfuscation that consists of these matrices, the only way that you can get useful information is to multiply them in the correct order. And by virtue of the fact that these two circuits evaluate to the same value, you will be guaranteed that you will be getting the same values in both cases. The evidence that this might be a good assumption is that we show that, in our paper we show proof of security of this assumption in what we call generic multi-linear matrix model. Then the following work after us, the two following works after us actually show that the security of this assumption in the generic multi-linear map model, and also some even more recent work shows that this is secure even if you assume some different multi-linear map with a different security property that satisfies semantic security. If you have a multi-linear map that satisfies a property that they call semantic security you can also show the security of this assumption. So these are all evidence that maybe this assumption is a good assumption. Obviously this leaves us the first big open problem from now on is coming up with better assumptions. Another thing that are interesting to look at are actually coming up with stronger notions of obfuscations. Because indistinguishability obfuscation is not really good for everything. It doesn’t really capture the initial intuition of what we want to obtain from obfuscation. And possibly our current construction satisfies a much stronger notion than undistinguishabiliy obfuscation. There is a proof that in the generic multilinear map model is virtual black-box obfuscation. So we have this proof. I mean we know that the impossibility for a larger black-box, but if we assume the generic multi-linear map model, we can show that our construction has satisfied this property. Obviously the efficiency of the construction is nowhere near to anything practical. Another interesting question is coming up with new, more new applications of obfuscation. We already have seen a whole series of follow up work. I am sure that there are more in store. So with this I would like to thank you and I will take any questions. [applause] Yes? >>: [indiscernible] if you could do indistinguishability obfuscation [indiscernible]? >> Mariana Raykova: No I think there is such a result but I mean this really doesn’t imply that I guess. I mean if the result in general about the relation but I’m not sure whether it was indistinguishability obfuscation or some of the stronger relations of obfuscations. You might be right but yeah, these are relations that start to give you connections between things that we are both guessing exist, but maybe one of them doesn’t. [applause]