Before we start with the technical material, I wanna give you a quick overview of what cryptography is about and the different areas of cryptography. So the core of cryptography of course is secure communication that essentially consists of two parts. The first is secured key establishment and then how do we communicate securely once we have a shared key. We already said that secured key establishment essentially amounts to Alice and Bob sending messages to one another such that at the end of this protocol, there's a shared key that they both agree on, shared key K, and beyond that, beyond just a shared key, in fact Alice would know that she's talking to Bob and Bob would know that he's talking to Alice. But a poor attacker who listens in on this conversation has no idea what the shared key is. And we'll see how to do that later on in the course. Now once they have a shared key, they want exchange messages securely using this key, and we'll talk about encryption schemes that allow them to do that in such a way that an attacker can't figure out what messages are being sent back and forth. And furthermore an attacker cannot even tamper with this traffic without being detected. In other words, these encryption schemes provide both confidentiality and integrity. But cryptography does much, much, much more than just these two things. And I want to give you a few examples of that. So the first example I want to give you is what's called a digital signature. So a digital signature, basically, is the analog of the signature in the physical world. In the physical world, remember when you sign a document, essentially, you write your signature on that document and your signature is always the same. You always write the same signature on all documents that you wanna sign. In the digital world, this can't possibly work because if the attacker just obtained one signed document from me, he can cut and paste my signature unto some other document that I might not have wanted to sign. And so, it's simply not possible in a digital world that my signature is the same for all documents that I want to sign. So we're gonna talk about how to construct digital signatures in the second half of the course. It's really quite an interesting primitive and we'll see exactly how to do it. Just to give you a hint, the way digital signatures work is basically by making the digital signature via function of the content being signed. So an attacker who tries to copy my signature from one document to another is not gonna succeed because the signature. On the new document is not gonna be the proper function of the data in the new document, and as a result, the signature won't verify. And as I said, we're gonna see exactly how to construct digital signatures later on and then we'll prove that those constructions are secure. Another application of cryptography that I wanted to mention, is anonymous communication. So, here, imagine user Alice wants to talk to some chat server, Bob. And, perhaps she wants to talk about a medical condition, and so she wants to do that anonymously, so that the chat server doesn't actually know who she is. Well, there's a standard method, called a mixnet, that allows Alice to communicate over the public internet with Bob through a sequence of proxies such that at the end of the communication Bob has no idea who he just talked to. The way mixnets work is basically as Alice sends her messages to Bob through a sequence of proxies, these messages get encrypted and decrypted appropriately so that Bob has no idea who he talked to and the proxies themselves don't even know that Alice is talking to Bob, or that actually who is talking to whom more generally. One interesting thing about this anonymous communication channel is, this is bi-directional. In other words, even though Bob has no idea who he's talking to, he can still respond to Alice and Alice will get those messages. Once we have anonymous communication, we can build other privacy mechanisms. And I wanna give you one example which is called anonymous digital cash. Remember that in the physical world if I have a physical dollar, I can walk into a bookstore and buy a book and the merchant would have no idea who I am. The question is whether we can do the exact same thing in the digital world. In the digital world, basically, Alice might have a digital dollar, a digital dollar coin. And she might wanna spend that digital dollar at some online merchants, perhaps some online bookstore. Now, what we'd like to do is make it so that when Alice spends her coin at the bookstore, the bookstore would have no idea who Alice is. So we provide the same anonymity that we get from physical cash. Now the problem is that in the digital world, Alice can take the coin that she had, this one dollar coin, and before she spent it, she can actually make copies of it. And then all of a sudden instead of just having just one dollar coin now all of a sudden she has three dollar coins and they're all the same of course, and there's nothing preventing her from taking those replicas of a dollar coin and spending it at other merchants. And so the question is how do we provide anonymous digital cash? But at the same time, also prevent Alice from double spending the dollar coin at different merchants. In some sense there's a paradox here where anonymity is in conflict with security because if we have anonymous cash there's nothing to prevent Alice from double spending the coin and because the coin is anonymous we have no way of telling who committed this fraud. And so the question is how do we resolve this tension. And it turns out, it's completely doable. And we'll talk about anonymous digital cash later on. Just to give you a hint, I'll say that the way we do it is basically by making sure that if Alice spends the coin once then no one knows who she is, but if she spends the coin more than once, all of a sudden, her identity is completely exposed and then she could be subject to all sorts of legal problems. And so that's how anonymous digital cash would work at a high level and we'll see how to implement it later on in the course. Another application of cryptography has to do with more abstract protocols, but before I speak the general result, I want to give you two examples. So the first example has to do with election systems. So here's the election problem. Suppose ... we have two parties, party zero and party one. And voters vote for these parties. So for example, this voter could have voted for party zero, this voter voted for party one. And so on. So in this election, party zero got three votes and party two got two votes. So the winner of the election, of course, is party zero. But more generally, the winner of the election is the party who receives the majority of the votes. Now, the voting problem is the following. The voters would somehow like to compute the majority of the votes, but do it in such a way such that nothing else is revealed about their individual votes. Okay? So the question is how to do that? And to do so, we're gonna introduce an election center who's gonna help us compute the majority, but keep the votes otherwise secret. And what the parties will do is they will each send the funny encryption of their votes to the election center in such a way that at the end of the election, the election center is able to compute and output the winner of the election. However, other than the winner of the election, nothing else is revealed about the individual votes. The individual votes otherwise remain completely private. Of course the election center is also gonna verify that this voter for example is allowed to vote and that the voter has only voted once. But other than that information the election center and the rest of the world learned nothing else about that voter's vote other than the result of the election. So this is an example of a protocol that involves six parties. In this case, there are five voters in one election center. These parties compute amongst themselves. And at the end of the computation, the result of the election is known but nothing else is revealed about the individual inputs. Now a similar problem comes up in the context of private auctions. So in a private auction every bidder has his own bid that he wants to bid. And now suppose the auction mechanism that's being used is what's called a Vickrey auction where the definition of a Vickrey auction is that the winner is the highest bidder. But the amounts that the winner pays is actually the second highest bid. So he pays the second highest bid. Okay, so this is a standard auction mechanism called the Vickrey auction. And now what we'd like to do is basically enable the participants to compute, to figure out who the highest bidder is and how much he's supposed to pay, but other than that, all other information about the individual bids should remain secret. So for example, the actual amount that the highest bidder bid should remain secret. The only thing that should become public is the second highest bid and the identity of the highest bidder. So again now, the way we will do that is we'll introduce an auction center, and in a similar way, essentially, everybody will send their encrypted bids to the auction center. The auction center will compute the identity of the winner and in fact he will also compute the second highest bid but other than these two values, nothing else is revealed about the individual bids. Now, this is actually an example of a much more general problem called secure multi-party computation. Let me explain what secure multi-party computation is about. So here, basically abstractly, the participants have a secret inputs to themselves. So, in the case of an election, the inputs would be the votes. In the case of an auction, the inputs would be the secret bids. And then what they would like to do is compute some sort of a function of their inputs. Again, in the case of an election, the function's a majority. In the case of auction, the function happens to be the second highest, largest number among x one to x four. And the question is, how can they do that, such that the value of the function is revealed, but nothing else is revealed about the individual votes? So let me show you kind of a dumb, insecure way of doing it. What we do is introduce a trusted party. And then, this trusted authority basically collects individual inputs. And it kinda promises to keep the individual inputs secret, so that only it would know what they are. And then, it publishes the value of the function, to the world. So, the idea is now that the value of the function became public, but nothing else is revealed about the individual inputs. But, of course, you got this trusted authority that you got to trust, and if for some reason it's not trustworthy, then you have a problem. And so, there's a very central theorem in crypto and it really is quite a surprising fact. That says that any computation you'd like to do, any function F you'd like to compute, that you can compute with a trusted authority, you can also do without a trusted authority. Let me at a high level explain what this means. Basically, what we're gonna do, is we're gonna get rid of the authority. So the parties are actually not gonna send their inputs to the authority. And, in fact, there's no longer going to be an authority in the system. Instead, what the parties are gonna do, is they're gonna talk to one another using some protocol. Such that at the end of the protocol all of a sudden the value of the function becomes known to everybody. And yet nothing other than the value of the function is revealed. In other words, the individual inputs is still kept secret. But again there's no authority, there's just a way for them to talk to one another such that the final output is revealed. So this is a fairly general result, it's kind of a surprising fact that is at all doable. And in fact it is and towards the end of the class we'll actually see how to make this happen. Now, there are some applications of cryptography that I can't classify any other way other than to say that they are purely magical. Let me give you two examples of that. So the first is what's called privately outsourcing computation. So I'll give you an example of a Google search just to illustrate the point. So imagine Alice has a search query that she wants to issue. It turns out that there are very special encryption schemes such that Alice can send an encryption of her query to Google. And then because of the property of the encryption scheme Google can actually compute on the encrypted values without knowing what the plain texts are. So Google can actually run its massive search algorithm on the encrypted query and recover in encrypted results. Okay. Google will send the encrypted results back to Alice. Alice will decrypt and then she will receive the results. But the magic here is all Google saw was just encryptions of her queries and nothing else. And so, Google as a result has no idea what Alice just searched for and nevertheless Alice actually learned exactly what she wanted to learn. Okay so, these are magical kind of encryption schemes. They're fairly recent, this is only a new development from about two or three years ago, that allows us to compute on encrypted data, even though we don't really know what's inside the encryption. Now, before you rush off and think about implementing this, I should warn you that this is really at this point just theoretical, in the sense that running a Google search on encryption data probably would take a billion years. But nevertheless, just the fact that this is doable is already really surprising, and is already quite useful for relatively simple computations. So in fact, we'll see some applications of this later on. The other magical application I want to show you is what's called zero knowledge. And in particular, I'll tell you about something called the zero knowledge proof of knowledge. So here ... what happens is there's a certain number N, which Alice knows. And the way the number N was constructed is as a product of two large primes. So, imagine here we have two primes, P and Q. Each one you can think of it as like 1000 digits. And you probably know that multiplying two 1000-digit numbers is fairly easy. But if I just give you their product, figuring out their factorization into primes is actually quite difficult. And, in fact, we're gonna use the fact that factoring is difficult to build public key cryptosystems in the second half of the course. Okay, so Alice happens to have this number N, and she also knows the factorization of N. Now Bob just has the number N. He doesn't actually know the factorization. Now, the magical fact about the zero knowledge proof of knowledge, is that Alice can prove to Bob that she knows the factorization of N. Yes, you can actually give this proof to Bob, that Bob can check, and become convinced that Alice knows the factorization of N, however Bob learns nothing at all. About the factors P and Q, and this is provable. Bob absolutely learns nothing at all about the factors P and Q. And the statement actually is very, very general. This is not just about proving the factorization of N. In fact, almost any puzzle that you want to prove that you know an answer to, you can prove it is your knowledge. So if you have a crossword puzzle that you've solved. Well, maybe crosswords is not the best example. But if you have like a Sudoku puzzle, for example, that you want to prove that you've solved, you can prove it to Bob in a way that Bob would learn nothing at all about the solution, and yet Bob would be convinced that you really do have a solution to this puzzle. Okay. So those are kind of magical applications. And so the last thing I want to say is that modern cryptography is a very rigorous science. And in fact, every concept we're gonna describe is gonna follow three very rigorous steps, okay, and we're gonna see these three steps again and again and again so I wanna explain what they are. So the first thing we're gonna do when we introduce a new primitive like a digital signature is we're gonna specify precisely what the threat model is. That is, what can an attacker do to attack a digital signature and what is his goal in forging signatures? Okay, so we're gonna define exactly what does it mean for a signature for example to be unforgeable. Unforgeable. Okay and I'm giving digital signatures just as an example. For every primitive we describe we're gonna precisely define what the threat model is. Then we're gonna propose a construction and then we're gonna give a proof that any attacker that's able to attack the construction under this threat model. That attacker can also be used to solve some underlying hard problem. And as a result, if the problem really is hard, that actually proves that no attacker can break the construction under the threat model. Okay. But these three steps are actually quite important. In the case of signatures, we'll define what it means for a signature to be, forgeable, then we'll give a construction, and then for example we'll say that anyone who can break our construction can then be used to say factor integers, which is believed to be a hard problem. Okay, so we're going to follow these three steps throughout, and then you'll see how this actually comes about. Okay, so this is the end of the segment. And then in the next segment we'll talk a little bit about the history of cryptography.