{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Diffie-Helman with an additive group\n",
"\n",
"### Public parameters"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%display latex"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Ring of integers modulo 1267650600228229401496703205376"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"N = 2^100\n",
"G = Zmod(N)\n",
"G"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"(12345, 1267650600228229401496703205376)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g = G(12345)\n",
"g, g.order()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Romeo"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"564406577611328532484954357188"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = randint(1, N)\n",
"A = a*g\n",
"A"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Juliet"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"503720102684786702022153569808"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b = randint(1, N)\n",
"B = b*g\n",
"B"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Romeo"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"228410533081048134149090809408"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S = a*B\n",
"S"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Juilet"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"228410533081048134149090809408"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S = b*A\n",
"S"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lady Capulet"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"True"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a == A / g and b == B / g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Diffie-Hellman with $\\mathbb{F}_q^*$\n",
"\n",
"### Public parameters"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"2^2 * 52203989 * 6070659658921032842417"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"q = next_prime(2^100)\n",
"(q-1).factor()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"72.3623432858776"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"log(6070659658921032842417,2).n()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Ring of integers modulo 1267650600228229401496703205653"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G = Zmod(q)\n",
"G"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"True"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g = G(2)\n",
"g.multiplicative_order() == q-1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Romeo"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"688518890487597170145982205186"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a = randint(1, N)\n",
"A = g^a\n",
"A"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Juliet"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"1109678265174356466346207666960"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"b = randint(1, N)\n",
"B = g^b\n",
"B"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Romeo"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"797981624234085127193677551253"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S = B^a\n",
"S"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Juilet"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"797981624234085127193677551253"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"S = A^b\n",
"S"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Lady Capulet"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\n"
]
}
],
"source": [
"print(1000 * chr(63))"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 9.63 s, sys: 6.67 ms, total: 9.63 s\n",
"Wall time: 9.63 s\n"
]
},
{
"data": {
"text/html": [
""
],
"text/plain": [
"1110459341366172091661731357883"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%time A.log(g)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Elliptic curves"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Elliptic Curve defined by y^2 = x^3 + 2*x + 3 over Rational Field"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"E = EllipticCurve([2,3])\n",
"E"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nq1YtjjvuOObOnbvTx99xxx1UqVKlzNWhQ4ckVSull0ceeYT999+fmjVr0rt3byZMmLDDxz7zzDNU\nqVKFqlWrfv/ZqlWrVhKr1faMGzeOU089lebNm1OlShVee+21qEsSu/6+jB07dpv/d1WtWpWVK1cm\nqWLtyN13303Pnj3Jzs6mcePG/OQnP2H27NlRl6VySmiAWL9+Pccc0xe4B9j5dlBKnnvuuYeHH36Y\nxx57jE8//ZTatWtzwgknUFBQsNPv69SpEytWrGD58uUsX76cDz74IEkVS+ljxIgR3HDDDdxxxx1M\nnjyZLl26cMIJJ7Bq1aodfk9OTs73n6vly5ezcOHCJFas7Vm/fj1du3blkUce+dHtDJU8u/O+xGIx\n5syZ8/3na9myZTRq1CjBlerHjBs3jp/97GeMHz+ed999ly1btnD88cezcePGqEtTOZRrG9fddf75\n5wPwz38uZMGCHz1uQkny4IMPcuuttzJw4EAAnn32WRo3bsy///1vzj777B1+X1ZWFg0bNkxWmVJa\neuCBBxg8eDAXXnghAMOGDePNN9/kqaee4qabbtru98RiMT9bKebEE0/kxBNPBMJZSEoNu/u+NGzY\n0G2uU8zIkSPL/Pxvf/sbjRo1YtKkSfTt2zeiqlReCZ+BAOjZMxmvovJYsGABy5cv55hjjvn+a9nZ\n2fTq1YuPP/54p987Z84cmjdvzgEHHMD555/PokWLEl2ulFa2bNnCpEmTyny+YrEYxx577E4/X+vW\nrWO//fajVatWnH766cyYMSMZ5UqVQjwep2vXrjRr1ozjjz+ejz76KOqStB1r1qwhFovRoEGDqEtR\nOSQlQPTpE26XLUvGq2lnli9fTiwWo3HjxmW+3rhxY5YvX77D7+vduzd/+9vfePvttxk2bBgLFiyg\nX79+rF+/PtElS2lj1apVFBUV7dLnq23btjz11FO89tpr/P3vf6e4uJg+ffqwZMmSZJQsZbSmTZvy\n2GOP8fLLL/Ovf/2Lli1b0r9/f6ZMmRJ1adpKPB7n+uuvp2/fvs5XpokKCxAvvPACdevWpW7dumRn\nZ/Phhx9+f9/RR4fb0aMr6tVUXj98X7Zs2bLdx8Xj8Z2uJz3hhBM488wz6dSpE8cddxwjR45k9erV\n/OMf/0hU6VLG2Nnnq3fv3px//vl07tyZI444gn/96180bNiQv/71r0muUso8bdq04YorrqBbt270\n7t2bJ598kj59+vDAAw9EXZq2MmTIEGbMmMGLL74YdSkqpwqbgTjttNPo3bv39z9v3rz59z+uWzfc\nvvNORb2ayuuH78umTZuIx+OsWLGizL+Srly5km7dupX7eXNycmjTps2P7t4kVSb77LMPVatWZcWK\nFWW+vnLlym26EjuSlZVFt27d/GxJCdKzZ88y/8ipaF177bWMHDmScePG0bRp06jLUTlVWAeidu3a\ntG7d+vurevXqZe6PxWJMmQILFlTUK6o8fvi+dOjQgSZNmjB6q3ZQfn4+48ePp0/JWrNyWLduHfPm\nzfPDLm1lr732onv37mU+X/F4nNGjR5f781VcXMy0adP8bEkJMmXKFD9fKeLaa6/l1VdfZcyYMbRq\n1SrqcrQLEroL0+rVq/n666//by1vnJo1Z3HXXXHuvrtJuf81ThXv+uuv57e//S0HHngg++23H7fe\neistWrTgtNNO+/4xxxxzDGeeeSZDhgwB4Be/+AUDBw5k3333ZcmSJdx+++1kZWWRm5sb1S9DSklD\nhw7loosuonv37vTs2ZMHHniADRs2cPHFFwNw4YUX0qJFC37/+98DcNddd9G7d28OPPBA1qxZw733\n3svChQu5/PLLI/xVaP369cydO/f7nX7mz5/P559/ToMGDWjZsmXE1VVeP/a+3HzzzSxdupRnnnkG\nCLsO7r///nTs2JFNmzbx+OOPM2bMGN5xSUTkhgwZwvDhw3nttdeoXbv2953bnJwcatSoEXF1+jEJ\nDRCvvfYal1xyCbFYjFgsxqZNuTz9NLRocTt33nlbIl9aO3HTTTexYcMGBg8ezJo1azjiiCMYNWoU\n1apV+/4xCxYsKLNv/eLFizn33HP59ttvadiwIX379uWTTz5h7733juKXIKWss88+m1WrVnHbbbex\nYsUKunbtyttvv/39Nq2LFy8mK6v0P72rV6/myiuvZPny5dSvX5/u3bvz8ccf065du6h+CQImTpzI\nUUcd9f3/v2644QYALrroIp566qmIq6u8fux9Wb58eZkdAgsKCrjhhhtYunQptWrVonPnzowePZp+\n/fpF9UvQ/xk2bBixWIz+/fuX+frTTz/9/TbYSl2xeBI3uP7yS2jXDp5+Gv7vH+Mk7aH8/HxycnLI\ny8tzn3NJkpRwSdnGtUTbtnDaafC730FhYTJfWZIkSVJFSGqAALj9dpg7F4YPT/YrS5IkSdpTSV3C\n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\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"E.plot()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"Elliptic Curve defined by y^2 = x^3 + 2*x + 3 over Finite Field of size 101"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k = GF(101)\n",
"E = EllipticCurve(k, [2,3])\n",
"E"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAw0AAAJICAYAAAAjAwiLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XuYlWWhNvB7AE8gM5KHQTwnpngWC0t05zE1ddQ0GkzL\nSrPS7VbLcu8++myn2cnKndb2UGZZg5VZlmUlJrrzfCzP4jEzoG0yoygosr4/1qfjAC4B18yzZub3\nuy4u32ex1uIeXNe8c/M8z/s2VSqVSgAAAF7DkNIBAACAxqY0AAAANSkNAABATUoDAABQk9IAAADU\npDQAAAA1KQ0AAEBNSgMAAFBTvygNlUolXV1dcR86AADoe/2iNDzzzDNpaWnJM888UzoKAAAMOv2i\nNAAAAOUoDQAAQE1KAwAAUJPSAAAA1LTMpeHaa69NW1tb1llnnQwZMiSXXXbZYs/53Oc+lzFjxmT4\n8OHZc889M2PGjB6///TTT+f9739/WlpaMmrUqBx55JGZO3fu8n8VAABAr1nm0jB37txsu+22Ofvs\ns9PU1LTY73/5y1/OWWedlXPOOSc33XRTRowYkb322isvvPDCK8859NBDc++992batGm5/PLLc801\n1+Too49+Y18JAADQK5oqb+DmB0OGDMkvfvGLtLW1vfLYmDFjctJJJ+WEE05IknR1daW1tTUXXnhh\nJk2alHvvvTdbbLFFbr311my33XZJkt/97nfZd99988QTT2T06NGL/TldXV1paWlJZ2dnmpublzcu\nAACwHOq6p+GRRx7JzJkzs/vuu7/yWHNzc3bYYYdcf/31SZIbbrgho0aNeqUwJMkee+yRpqam3Hjj\njfWMQz8ybVry6U8nF11UOgkAAIsaVs83mzlzZpqamtLa2trj8dbW1sycOfOV56y11lo9fn/o0KF5\n05ve9MpzGFz+8Idk772ThQur47//PTnppLKZAADo1idXT6pUKkvc/7Csz2Fg+s1vugtDkvzqV+Wy\nAACwuLrONIwePTqVSiWzZs3qMdswe/bsV5YjjR49OrNnz+7xupdeeilPP/30YjMUi2pvb8+wYT0j\nT548OZMnT67TV0AJm2/ec7zFFmVyAACwZHUtDRtttFFGjx6dadOmZeutt05S3cR844035phjjkmS\nvOMd78icOXNy++23v1Ikpk2blkqlkh122KHm+0+dOtVG6AHoyCOTJ59Mrrgi2Wqr5KtfLZ0IAIBX\n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\ny2illZKf/SyZNy+5/fYlF4aXXur7XACUU/fS8PDDD+c73/lONt100/z+97/Pxz72sRx33HG56KKL\nkiQzZ85MU1NTWhe5dXNra2tmzpxZ7zgA1FGlknz849ViMXp09QpLAAx8db960sKFCzNhwoR84Qtf\nSJJss802ufvuu/Od73wnhx122Gu+rlKppKmpqd5xAKijyy9P/vu/q8ezZiVHHJE89FDRSAD0gbqX\nhrXXXjvjxo3r8di4cePy85//PEkyevToVCqVzJo1q8dsw+zZs7Pd61wMvL29PcOG9Yw8efLkTJ48\nuU7pAahlzpye45evsgTAwFb30jBx4sTcf//9PR67//77s8EGGyRJNtpoo4wePTrTpk3L1ltvnaS6\n0fnGG2/MMcccU/O9p06daiM0QEH771/dHH3vvdXxZz5TNg8AfaPupeGEE07IxIkTc/rpp2fSpEm5\n8cYbc/755+e888575TnHH398Tj311IwdOzYbbrhhpkyZknXXXTcHHHBAveMAUEctLcmNNyZXX520\ntiYTJpROBEBfqPslV5PkN7/5TU4++eTMmDEjG220UT75yU/mwx/+cI/nnHLKKTn33HMzZ86c7Lzz\nzjn77LMzduzYJb6fS64CAEA5vVIa6k1pAACAcup+yVUAAGBgURoAAICalAYAAKAmpQGgATz7bHLp\npdWrEgFAo1EaAAqbOzeZODF5z3uSXXdNTjqpdCIA6ElpAChs2rTkz3/uHp95ZrJwYbk8ALAopQGg\nsNVX7zlebbVkiO/OADQQpyWAwiZOTD772WTllat3We7oKJ0IAHpyczcAgD5UqSRNTaVTwLIx0wAA\n0Afuuy/ZbLNkhRWSQw5JXnihdCJYekoDAEAfOPbY5P77k5deSi65JDn//NKJYOkpDQAAfeCf/6w9\nhkamNAAA9IETTui+MtpaayWHHVY2DywLG6EBAPrInXcmM2YkO+1UvVoa9BdKAwDAIDRrVvL5zyfP\nPJP8678mEyaUTkQjUxoAAAah8eOT22+vHo8cmdxzT7LuumUz0bjsaQAAGGSef767MCTV2Ya//KVc\nHhqf0gAAMMisskqy7bbd41VXTbbaqlweGt+w0gEAAOh7v/1tdU9DV1dy3HGWJlGbPQ2wjB5/PLnl\nluq/yGyySek0y2/WrOS666pfw5Zblk5DCTNmJH/+c7L99skGG5ROA0AjM9MAy+C225Jddqmu/Vxp\n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\n",
"text/plain": [
"Graphics object consisting of 1 graphics primitive"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"E.plot()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"((x1 : y1 : 1), (x2 : y2 : 1))"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"R. = FractionField(QQ[\"x1\", \"y1\", \"x2\", \"y2\"])\n",
"E = EllipticCurve(R, [2,3])\n",
"P = E.point((x1, y1, 1), check=False)\n",
"Q = E.point((x2, y2, 1), check=False)\n",
"P, Q"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"((-x1^3 + x1^2*x2 + x1*x2^2 - x2^3 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2) : (x1^3*y1 - 3*x1*y1*x2^2 + 2*y1*x2^3 - 2*x1^3*y2 + 3*x1^2*x2*y2 - x2^3*y2 - y1^3 + 3*y1^2*y2 - 3*y1*y2^2 + y2^3)/(x1^3 - 3*x1^2*x2 + 3*x1*x2^2 - x2^3) : 1)"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"P+Q"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
"((9*x1^4 - 8*x1*y1^2 + 12*x1^2 + 4)/(4*y1^2) : (-27*x1^6 + 36*x1^3*y1^2 - 54*x1^4 - 8*y1^4 + 24*x1*y1^2 - 36*x1^2 - 8)/(8*y1^3) : 1)"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"2*P"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "SageMath 7.4.beta3",
"language": "",
"name": "sagemath"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}