Exploiting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Diffie-Hellman bug in socat

A few days ago socat, a popular networking tool, issued a curious sounding security advisory:

"In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenSSL address implementation cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hard coded 1024 bit DH p parameter was not prime. The effective cryptographic strength of a key exchange using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se parameters was weaker than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one one could get by using a prime p. Moreover, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no indication of how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se parameters were chosen, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existence of a trapdoor that makes possible for an eavesdropper to recover cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shared secret from a key exchange that uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m cannot be ruled out."

More background information on this vulnerability can be found on Ars Technica and Hacker News, in this post I want to focus on building an exploit.

The patch shows that

p = 143319364394905942617148968085785991039146683740268996579566827015580969124702493833109074343879894586653465192222251909074832038151585448034731101690454685781999248641772509287801359980318348021809541131200479989220793925941518568143721972993251823166164933334796625008174851430377966394594186901123322297453

It has been discovered that

p = 271 * 13597 * 38894884397634366007356454548332370646972724268802781973440208895542936165564656473524541403310393405820598366261673173802130771236325314878371830363723788045821711985461441675679316058246609104355161134470046705337593170498462616195650378975298117141144096886684800236261920005248055422089305813639519

The last factor, let's denote it F3889, is a 1002-bit non-prime integer, whose factors remain unknown. By trial division we know that its smallest factors are larger than $2^{40}$. If we want to go furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, we'll need to deploy a proper factorization algorithm. In that case I'll choose Lenstra elliptic curve factorization, whose running time depends on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of smallest factor of F3889 racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 size of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number itself. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smallest factor is smaller than $2^{250}$, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Lenstra's algorithm would recover it before too long. The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r factors can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n be recovered by eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r Lenstra's or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general number field sieve algorithm.

On cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r hand if F3889 is a product of two 500-bit primes, chances are we might never be able to factor it (without spending a million of dollars or so). This is very unlikely, if $p$ was indeed randomly generated. Thus, it's reasonable to assume that anyone determined and lucky enough can factor F3889 completely. It'll be a fun project, let me know if you want to work on it :).

But, you might ask, why do we care so much about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 factors of $p$? It seems to have nothing to do with solving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discrete log problem (DLP) on $Z_p$, doesn't it? The answer is yes, knowing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 factors of $p$, and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are small enough, allows one to solve DLP on $Z_p$, thanks to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chinese Remainder Theorem (CRT).

As I wrote before on this blog, CRT is one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most powerful cryptanalysis tools ever. I've seen countless systems broken because of it. Whenever analyzing or designing a new system, ask yourself if you can break it using this simple trick, and you'll be surprised that most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 times cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 answer is yes. Pohlig and Hellman probably asked this question cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, and eventually figured out that if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 order of a group is a product of small primes (i.e., a smooth number), one can solve DLP in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subgroups, which is easier, and combine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results using CRT to obtain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 discrete log in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original group.

Let's look at an example. Suppose that we want to solve for $x$, given $g$ and $h = g^x \pmod{n}$, where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 order of group $Z_n$ is $\phi(n) = q_1 * q_2$ with $q_1$ and $q_2$ are prime. We can break this problem into three smaller sub-problems:
1/ Find $x_1$ such that $h^{q_1} = (g^{q_1})^{x_1} \pmod{n}$
2/ Find $x_2$ such that $h^{q_2} = (g^{q_2})^{x_2} \pmod{n}$
3/ We can prove that $x = x_1 \pmod{q_2}$ and $x = x_2 \pmod{q_1}$, and thus can figure out $x$ with CRT.

Note that 1/ and 2/ are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves DLP, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are in subgroups of order $q_1$ and $q_2$, respectively. Hence, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pohlig-Hellman algorithm reduces DLP in group of order $q_1 * q_2$ to DLP in group of order $q_1$ or $q_2$. If $q_1$ or $q_2$ or small, we can brute-force for $x_1$ or $x_2$. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are larger, we can deploy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pollard's rho or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index calculus algorithm. It has been estimated that an academic team can break discrete log if $q_1$ or $q_2$ is a 768-bit prime and that a nation-state can break a 1024-bit prime.

I hope that it's clearer now why we need to factor $p$. We want to calculate $\phi(p)$ and its factors, which we need to deploy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pohlig-Hellman attack. Is it surprising that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 factors of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 order of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 group determines how hard DLP is on that group?

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest factor of $p$ is smaller than 2^800 it's reasonable to assume that anyone knowing this factor can solve DLP on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multiplicative group $Z_p$. That is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can find $x$ given $g$ and $h$, where $g^x = h \pmod{p}$; this in turn allows cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m recovering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shared secret just by passively eavesdropping on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Diffie-Hellman key exchange. Note that if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 larger factors of $p$ are not safe prime, i.e., not in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form of $2 * q + 1$ where $q$ is also a prime, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 computation cost is even smaller.

In summary you can exploit this bug by following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se steps:
1/ Using Lenstra elliptic curve factorization and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 general number field sieve to factor $p$ completely, and
2/ Using Pohlig-Hellman and CRT to reduce DLP on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multiplicative group $Z_p$ to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multiplicative group $Z_{p'}$ where $p'$ is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest factor of $\phi(p)$, and
3/ Using Pollar's rho or index calculus to solve DLP on $Z_{p'}$, and
4/ Sniffing socat traffic and recovering cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DH shared secret, and
5/ Profit!

If this is a backdoor, it's trivial for its creators to exploit it, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can skip 1/ and pre-compute most of 2/ and 3/. Even if this is not a backdoor, I suspect that it doesn't cost more than \$10K on AWS or Google Cloud Platform to perform step 1/, 2/ and 3/. If we're so lucky that F3889 is a product of 3 primes, 2 of which are 250-bit, step 1/ might cost less than \$2K, and pre-computation for step 2/ and step 3/ might cost even less.

Comments

Thuong said…
This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.
Thuong said…
This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.
Thuong said…
Great introduction, and that is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason why we just need to care about DLP on cyclic groups of large prime orders. And to avoid most attacks (which are very similar to methods mentioned in your post), we must use strong primes.

As far as I know (please correct me if I am wrong), to generate a strong prime, i.e. a prime $p$ that has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form $kq + 1$, where $q$ is also large prime, we use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 properties of arithmetic progresses, which is stated as Dirichlet's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem: "Let $r, m$ are integers such that $\gcd(r,m)=1$, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re exists infinitely many primes of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form $r + km$ (that is all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of prime $p$ such that $p \equiv r \mod m$. Denote this set as $\pi_{r,m}$. Then $\pi_{r,m}$ approximates $\frac{1}{\phi(m)}\frac{x}{\log x}$, where $\phi(m)$ is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Euler's totient function." For reference, see

https://primes.utm.edu/notes/Dirichlet.html

From this, if we want to find a 100 bit strong prime, we can start with a 80 bit prime $q$, and choose random $k$, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n test whecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r $kq + 1$ is prime. The cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem of Dirichlet above give us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 estimation of success probability. Also, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next question might be how we can test a prime number in an efficient way? As far as I know, people prefer using elliptic curve primality proving. The construction of suitable curves for testing is difficult, and Morain-Atkin have to use complex multiplication method.

But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se things cannot defend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very efficient attack, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index calculus. Amazingly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 analogue generally fails for ECDLP, though it is again true for curves of higher genus (hyperelliptic curves)! These things mentioned in this comment can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 book of L. C. Washington about elliptic curves.
Unknown said…
Awesome post! I've been looking into it myself. Some people also told me about pollard's p-1 and p+1 factoring algorithm that might work.

The ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r thing is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new 2048bits prime cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y used might have a "bad" order. If you can factor it in primes small enough, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is Pohlig-Hellman attack as well.

Last thing: this is not only vulnerable to passive Pohlig-Hellman attacks, but also to more active attacks like small subgroup attacks where you would send a different generator of each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 smaller subgroups. 1) Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subgroup of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generator cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y used (2) for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new prime is unknown, it must be that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're not verifying that publickey sent to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir program are indeed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right subgroup 2) since we can generate our own generators, we can build smaller base for our discrete log problems and it should be faster than Pohlig-Hellman. Significantly faster? I don't know
Thai Duong said…
Thanks for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 comment, Thuong (somehow while writing this I actually wondered what you would say :-P). You're right that in practice people find a prime q, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n test if 2 * q + 1 is also a prime, if so use that as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final output. I haven't seen anyone using any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r values for k racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than 2 though. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generator is chosen such that its order is k * q, and if a larger k is used, adversary might perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 small-subgroup attack to extract log(k) bits of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Diffie-Hellman exponent. With k = 2 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can extract one bit, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can already know that by calculating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Legendre symbol.

For primality, I think most implementations don't use primality proving but only primality testing using a combination of Miller-Rabin and Lucas tests.

I'm still working on that book of Washington, and I'll greatly appreciate if you explain how complex multiplication works. I found it's very hard to understand :(.
Thai Duong said…
David Wong: yes, small-subgroup attacks should work too. Though I don't think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y are too practical in real world settings, where most people use ephemeral keys.
Thuong said…
This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.
Thuong said…
This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.
Unknown said…
> I haven't seen anyone using any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r values for k racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than 2 though

You can't use something else than 2, ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise you get an even number > 2 => not a prime
Thuong said…
Thanks you for your waiting :D. Unfortunately, I know very little on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topic of complex multiplication. I just mention a little bit about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 definition here. Though it is used to construct curves with given number of points (very important in ECDLP, right?), I really don't know how it works.

Let us consider an elliptic curve over $\mathbb{Q}$, denoted $E(\mathbb{Q})$. As we know, it is an abelian group, which has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ring of endomorphism. Recall that an endomorphism is a polynomial map from $E(\overline{\mathbb{Q}})$ to itself, that transform $\infty$ to $\infty$. Then it is obvious to see that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multiplication by an integer $n$, defined by $P$ to $nP$ is an endomorphism. For ordinary curves, $End(E(\overline{\mathbb{Q}}))$ is isomorphic to $\mathbb{Z}$, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ring of integers. For curves with complex multiplication, this ring is strictly larger than $\mathbb{Z}$.

For example, consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 curve $y^2=x^3+x$, it has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 complex multiplication $\phi(x,y)=(-x,iy)$, where $i^2+1=0$ (Recall that this curve defined over $\mathbb{F}_p$, where $p > 3$ and $p \equiv 3\mod 4$, it is a supersingular curve. In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 finite fields case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Frobenius map $(x,y) \rightarrow (x^p,y^p)$ is also an endomorphism, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 endomorphism ring is strictly larger than $\mathbb{Z}$ in this situation).

A very important application of this curve is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365orem, that has a profound meaning: Let $F/\mathbb{Q}(i)$ be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Galois extension of $\mathbb{Q}(i)$ of finite degree, and suppose that $Gal(F/\mathbb{Q}(i))$ is abelian. Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is an integer $n \ge 1$ such that $F \subset \mathbb{Q}(i)(E[n])$, where $E[n]$ is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 set of $n$-torsion group, and $\mathbb{Q}(i)(E[n])$ is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 extension field of $\mathbb{Q}(i)$ obtained by adding $x$ and $y$ coordinates of elements in $E[n]$.

The content of this comment can be found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 book of Silverman and Tate "Rational points on elliptic curves" (Chapter VI). For applications of complex multiplication in cryptography, if you are curious (me too), why don't we establish a small program for understanding about this?

P.S: TEX really works in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 comments, when we see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full post mode.
Thai Duong said…
Thanks Thuong. I didn't even know that LaTex works correctly =).

Yes, let's set up a small reading group or something that sought out to understand everything one needs to know about elliptic curve crypto :). My personal email address is thaidn@gmail.com, I can create a group on Google Groups or something, and we can start from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. Occasionally we can blog about what we've found and learned on this blog or elsewhere. Jet let me know which medium you prefer.

I propose starting with this question: how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hell did macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365maticians discover that points on elliptic curve form a group? The point addition law doesn't look natural at all. It looks like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 book of Washing actually explains why (chapter 9 and 11), but I still don't quite understand. Do you?
Thuong said…
Thanks you for your comment. I really appreciate your ideas about creating a group to discuss on ECC. It is a very good way to learn. I will think about this and send email to you later.

For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question, I do think that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addition law on elliptic curves is naturally defined in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 algebraic viewpoint. In Chapter XI, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author develops cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory of divisors, which allows us to define addition law for curves of higher genus. The addition law on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se groups is not "point plus point" as elliptic curves. We have to work with reduced divisors. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se groups are called Jacobian varieties. For an elliptic curve, we have a bijective map between "points" on its Jacobian variety and its "actual" points. Hence, we can define cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addition law based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 addition law on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 variety. It is an interesting story (but a little bit long), and it cannot be fully covered in this comment.
Unknown said…
> how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hell did macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365maticians discover that points on elliptic curve form a group

I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were just trying to figure out how to find rational points on a curve. At first cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re were easy points to find, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n how to find new ones? A good way was to trace a line between two of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, and you get a new point. And by reversing it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 y axis you would get a new point again (this is because of y^2). Later on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y figured out that it was forming a group (apparently cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof is pretty easy so I guess it is not so difficult to imagine). There is a video of Bonneh on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subject: https://www.youtube.com/watch?v=4M8_Oo7lpiA