<div dir="ltr">+1!<div><br></div><div>I am one of those lurkers trying to grasp. Thank you Trevor!</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 7, 2016 at 5:16 AM, Ron Garret <span dir="ltr"><<a href="mailto:ron@flownet.com" target="_blank">ron@flownet.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Wow, thanks for taking the time to write this up!  This has been more helpful than you can possibly imagine.<br>
<br>
I started work on an EC survey a few days ago, but as you might imagine, curves are quite the rabbit hole so I don’t expect to have anything ready to show for a few weeks at the earliest.  But I thought I would mention it just in case anyone else out there is thinking about diving in to this so we don’t duplicate efforts.<br>
<div class="HOEnZb"><div class="h5"><br>
On Nov 6, 2016, at 3:51 PM, Trevor Perrin <<a href="mailto:trevp@trevp.net">trevp@trevp.net</a>> wrote:<br>
<br>
> On Thu, Nov 3, 2016 at 7:01 PM, Andy Isaacson <<a href="mailto:adi@hexapodia.org">adi@hexapodia.org</a>> wrote:<br>
>> As far as I can tell there's a quite remarkable<br>
>> pile of specialized knowledge necessary to be able to effectively work with<br>
>> elliptic curve cryptography, and this list is mostly for folks who already<br>
>> have the knowledge to discuss things.<br>
><br>
><br>
> I think it helps a lot to think of layers built on top of each other,<br>
> from high-level to low:<br>
> - Protocols (Signatures, Diffie-Hellman, MQV, etc.)<br>
> - Groups (where discrete log is hard)<br>
> - Elliptic Curves (where points form groups)<br>
> - Fields (the coordinates of elliptic-curve points are field<br>
> elements, e.g in GF(2^255-19))<br>
><br>
><br>
> Here's a (rambling) tour of a couple layers, I'll try to connect it to<br>
> recent discussion:<br>
><br>
> Groups<br>
> -------<br>
> At the level of DH or signatures, elliptic curve crypto is mostly just<br>
> "discrete log" crypto, i.e. it deals with (cyclic) groups where<br>
> calculating discrete logs is hard.  Constructs like DH, DSA, etc apply<br>
> whether the group elements are points on an elliptic curve or integers<br>
> modulo some prime.<br>
><br>
> In either case you'll have some element (elliptic curve point; or<br>
> integer mod prime) that generates a group with large prime order q<br>
> (number of elements), which is where you want to do crypto.  But this<br>
> group is often part of a larger group, with order = cofactor * q.<br>
><br>
> If cofactor=1 then things are simpler, but cofactor > 1 means there's<br>
> other groups co-existing with the "main subgroup", and there can be<br>
> weird interactions.<br>
><br>
> "Small subgroup attacks" on DH with reused keys is the classic case:<br>
> Someone gives you a DH public value A, you raise it to your reusable<br>
> DH private value b to get a shared key and encrypt something with that<br>
> key.<br>
><br>
> However!  Instead of A generating the main subgroup, it was<br>
> maliciously chosen to generate some small-order subgroup with j<br>
> elements.  The attacker can trial-decrypt your encrypted data to<br>
> determine which of the j keys was chosen, thus learning your private<br>
> key b mod j.  By repeating this with different A_i of order j_i the<br>
> attacker can calculate b via the Chinese Remainder Theorem.<br>
><br>
> With traditional "mod p" or "finite field" Diffie-Hellman, you can<br>
> choose a "safe prime" p=2q+1 to get a cofactor of 2 and a main<br>
> subgroup order of q.  This prevents the attack because the 2-element<br>
> subgroup containing (1,-1) is easy to test for, and because leaking a<br>
> single bit of your key (mod 2) doesn't matter much.<br>
><br>
> For traditional Schnorr or DSA signatures you have to send a value<br>
> (mod q) as part of the signature, so you want a prime p = cofactor*q +<br>
> 1, where cofactor is large (instead of cofactor=2).  Thus, using<br>
> DSA-style primes for DH would introduce a risk of small-subgroup<br>
> attacks against re-used keys, requiring an expensive validation check<br>
> (exponentiation by q) to ensure received public values are in the<br>
> correct subgroup.<br>
><br>
> (To make this topical:  A recent paper points out that NIST recommends<br>
> DSA-style primes for DH in SP800-56A [0,1].  RFC 5114 also recommends<br>
> specific DSA-style primes for "IKE, TLS, SSH, and SMIME", without<br>
> mentioning the need for validation checks [2].  The paper analyzes the<br>
> "fragility" of the implementation landscape that has resulted, though<br>
> various complications mostly seem to prevent devastating attacks, in<br>
> the implementations looked at.)<br>
><br>
> So note that group structure and cofactor/subgroup questions are<br>
> complicated even in "regular" DH, without getting to EC.<br>
> With EC, cofactors are typically small enough (e.g. 1 for NIST<br>
> P-curves, 8 for Curve25519) that the above attack isn't that relevant,<br>
> though sending invalid points (not on the curve) can lead to a similar<br>
> attack.<br>
><br>
> However, cofactor>1 can still have subtle and unexpected effects, e.g.<br>
> see security considerations about "equivalent" public keys in RFC<br>
> 7748, which is relevant to the cofactor multiplication "cV" in<br>
> VXEdDSA, or including DH public keys into "AD" in Signal's (recently<br>
> published) X3DH [3].<br>
><br>
><br>
> Signatures<br>
> -----------<br>
> Discrete-log signatures (El Gamal, Schnorr, DSA, EC-DSA, EdDSA) build<br>
> on top of the group structure, so can be considered without too much<br>
> EC detail.<br>
><br>
> Academic intro to crypto books usually cover the basics well, the<br>
> typical reference points are:<br>
> * Schnorr's identification protocol<br>
> * Fiat-Shamir transform<br>
> * Security proof via Random Oracle Model and oracle rewinding<br>
><br>
> From there, DJB has a great writeup on concrete design details [4], as<br>
> well as the Ed25519 and "More curves for EdDSA" papers.<br>
><br>
> It's also worth understanding these signatures as instances of<br>
> "zero-knowledge proofs" which can do fancier things.  E.g. see<br>
> Camenisch-Stadler [5] examples 2 and 3 on "equality of two discrete<br>
> logarithms" (relevant to VRF), and "or" proofs (relevant to signature<br>
> variants like "designated verifier" signatures).<br>
><br>
><br>
> Curves<br>
> -------<br>
> This is harder math, and I'm not sure Montgomery / Edwards curves have<br>
> made it into good textbooks and overviews yet.  I think people lean on<br>
> DJB's Curve25519 and Ed25519 papers, "Twisted Edwards Curves" [6], and<br>
> their references.  The authors have a "gentle introduction" to EC as<br>
> well [7].<br>
><br>
> I'm not the person to do it, but if anyone wants to try an overview of<br>
> modern curve equations / coordinate systems / algorithms, I'm sure it<br>
> would be widely appreciated (there's about 600 people on this list,<br>
> probably most here to learn things like that).<br>
><br>
> Trevor<br>
><br>
><br>
> [0] <a href="https://eprint.iacr.org/2016/995" rel="noreferrer" target="_blank">https://eprint.iacr.org/2016/<wbr>995</a><br>
> [1] <a href="http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf" rel="noreferrer" target="_blank">http://nvlpubs.nist.gov/<wbr>nistpubs/SpecialPublications/<wbr>NIST.SP.800-56Ar2.pdf</a><br>
> [2] <a href="https://tools.ietf.org/html/rfc5114" rel="noreferrer" target="_blank">https://tools.ietf.org/html/<wbr>rfc5114</a><br>
> [3] <a href="https://whispersystems.org/docs/specifications/x3dh/" rel="noreferrer" target="_blank">https://whispersystems.org/<wbr>docs/specifications/x3dh/</a><br>
> [4] <a href="https://blog.cr.yp.to/20140323-ecdsa.html" rel="noreferrer" target="_blank">https://blog.cr.yp.to/<wbr>20140323-ecdsa.html</a><br>
> [5] <a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.56.1208" rel="noreferrer" target="_blank">http://citeseerx.ist.psu.edu/<wbr>viewdoc/summary?doi=10.1.1.56.<wbr>1208</a><br>
> [6] <a href="https://eprint.iacr.org/2008/013" rel="noreferrer" target="_blank">https://eprint.iacr.org/2008/<wbr>013</a><br>
> [7] <a href="http://ecchacks.cr.yp.to/" rel="noreferrer" target="_blank">http://ecchacks.cr.yp.to/</a><br>
<br>
______________________________<wbr>_________________<br>
Curves mailing list<br>
<a href="mailto:Curves@moderncrypto.org">Curves@moderncrypto.org</a><br>
<a href="https://moderncrypto.org/mailman/listinfo/curves" rel="noreferrer" target="_blank">https://moderncrypto.org/<wbr>mailman/listinfo/curves</a><br>
</div></div></blockquote></div><br></div>