#!/usr/bin/env python # coding: utf-8 # ## Diffie-Helman with an additive group # # ### Public parameters # In[1]: get_ipython().run_line_magic('display', 'latex') # In[2]: N = 2^100 G = Zmod(N) G # In[3]: g = G(12345) g, g.order() # ### Romeo # In[4]: a = randint(1, N) A = a*g A # ### Juliet # In[5]: b = randint(1, N) B = b*g B # ### Romeo # In[6]: S = a*B S # ### Juilet # In[7]: S = b*A S # ### Lady Capulet # In[8]: a == A / g and b == B / g # ## Diffie-Hellman with $\mathbb{F}_q^*$ # # ### Public parameters # In[9]: q = next_prime(2^100) (q-1).factor() # In[10]: log(6070659658921032842417,2).n() # In[11]: G = Zmod(q) G # In[12]: g = G(2) g.multiplicative_order() == q-1 # ### Romeo # In[13]: a = randint(1, N) A = g^a A # ### Juliet # In[14]: b = randint(1, N) B = g^b B # ### Romeo # In[15]: S = B^a S # ### Juilet # In[16]: S = A^b S # ### Lady Capulet # In[17]: print(1000 * chr(63)) # In[18]: get_ipython().run_line_magic('time', 'A.log(g)') # ## Elliptic curves # In[19]: E = EllipticCurve([2,3]) E # In[20]: E.plot() # In[21]: k = GF(101) E = EllipticCurve(k, [2,3]) E # In[22]: E.plot() # In[23]: R. = FractionField(QQ["x1", "y1", "x2", "y2"]) E = EllipticCurve(R, [2,3]) P = E.point((x1, y1, 1), check=False) Q = E.point((x2, y2, 1), check=False) P, Q # In[24]: P+Q # In[25]: 2*P # In[ ]: