{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2021-04-18T10:57:36.822235Z", "start_time": "2021-04-18T10:57:36.799234Z" } }, "outputs": [], "source": [ "from Crypto.Util.number import getPrime, isPrime, sieve_base, GCD\n", "import random" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2021-04-18T10:57:37.376235Z", "start_time": "2021-04-18T10:57:37.356235Z" } }, "outputs": [], "source": [ "def jacobi_symbol(a, n):\n", " if a ==0:\n", " return 0\n", " if a ==1:\n", " return 1\n", " #write a = 2^e *s where a1 is odd\n", " e =0\n", " a1 = a\n", " while a1 & 1==0: #while a1 is even\n", " a1>>=1\n", " e+=1\n", " \n", " #if e is even set s = 1\n", " if e & 1 == 0:\n", " s = 1\n", " elif n % 8 == 7 or n % 8 == 1:\n", " s = 1\n", " elif n % 8 == 3 or n % 8 == 5:\n", " s = -1\n", " \n", " if n % 4 == 3 and a1 % 4 == 3:\n", " s = -s\n", " \n", " n1 = n % a1\n", " if a1 ==1:\n", " return s\n", " else:\n", " return s * jacobi_symbol(n1, a1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Prerequisites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Fermat's test\n", "- Number theory basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Theory" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- https://www.youtube.com/watch?v=S3vNCMTEXQM\n", "- https://www.youtube.com/watch?v=clwrHZA98GI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, suppose $p$ is prime, and consider the modular equation $x^2 \\equiv 1 \\pmod{p}$. \n", "\n", "What are the solutions to this equation? \n", "- We know that $x^2 - 1 \\equiv 0 \\pmod{p} \\iff (x-1)(x+1) \\equiv 0 \\pmod{p}$. \n", "\n", "Since $p$ is prime, $p$ has to divide either $x-1$ or $x+1$ => $x \\equiv \\pm 1 \\pmod{p}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let\n", "- $p$ be an **odd prime** and write $p−1=2^rs$ with $s$ **odd**. \n", "- $a$ be any number NOT divisible by $p$.\n", "\n", "Then **one** of the following two conditions is true:\n", "- $a^s \\equiv 1 (mod \\ p)$\n", "- One of $a^s,a^{2s},a^{4s},...,a^{2^{r−1}s} \\equiv −1 \\bmod p$\n", "\n", "Miller rabin test uses the contrapositive of this\n", "- if for some $a$ neither of the above holds => $p$ is not prime\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Remarks**:\n", "- (Monier-Rabin Bound): For $n \\neq 9$ odd and composite the number of strong liars $|L(n)| \\leq \\dfrac {\\phi(n)} 4$\n", "- (number of strong liars) For most composite integers $n$, the number of strong liars for $n$ is actually much smaller than the theoretical upper bound of $φ(n)/4$. Consequently, the Miller-Rabin error-probability bound is much smaller\n", "- (fixed bases in Miller-Rabin) If $a_1$ and $a_2$ are strong liars for $n$, their product $a_1\\cdot a_2$ is very likely, but not certain, to also be a strong liar for $n$. A strategy that is sometimes employed is to fix the bases $a$ in the Miller-Rabin algorithm to be the first few primes(composite bases are ignored because of the preceding statement), instead of choosing them at random" ] }, { "attachments": { "image.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Code" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2021-04-18T10:58:01.321587Z", "start_time": "2021-04-18T10:58:01.305587Z" } }, "outputs": [], "source": [ "def miller_rabin_test(n, k):\n", " '''\n", " Arguments: \n", " n: int -- number to be tested\n", " k: int -- number of trials\n", " Return: `Composite` or `Probably prime`'''\n", " \n", " #check parity\n", " if not n & 1:\n", " return 'Composite'\n", " \n", " r = 0\n", " s = n-1\n", " #write n-1 = 2^r*s\n", " while not s & 1:\n", " s = s>>1\n", " r+=1\n", " assert(pow(2, r)* s == n-1)\n", " \n", " for i in range(k):\n", " a = random.randint(2, n-2)\n", " x = pow(a, s, n)\n", " if x == 1 or x == n-1:\n", " continue #search for another witness\n", " for _ in range(r):\n", " x = pow(x, 2, n)\n", " if x == n-1:\n", " break \n", " else:\n", " #if it doesnt break, neither condition is satisfied => this executes => we found a composite\n", " return \"Composite\"\n", " return \"Probably prime\"\n", " " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2021-04-18T10:58:02.036042Z", "start_time": "2021-04-18T10:58:01.819031Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Composite\n", "Probably prime\n", "Composite\n" ] } ], "source": [ "print(miller_rabin_test(2403, 100))\n", "p = getPrime(512)\n", "print(miller_rabin_test(p, 100))\n", "print(miller_rabin_test(561, 100))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Breaking Miller-Rabin " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- https://eprint.iacr.org/2018/749.pdf\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fixed bases -> Arnault method" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def miller_rabin_test_fixed(n, a_list):\n", " '''returns Composite or Probably prime'''\n", " \n", " #check parity\n", " if not n & 1:\n", " return 'Composite'\n", " \n", " r = 0\n", " s = n-1\n", " #write n-1 = 2^r*s\n", " while not s & 1:\n", " s = s>>1\n", " r+=1\n", " assert(pow(2, r)* s == n-1)\n", " \n", " for a in a_list:\n", " x = pow(a, s, n)\n", " if x == 1 or x == n-1:\n", " continue #search for another witness\n", " for _ in range(r):\n", " x = pow(x, 2, n)\n", " if x == n-1:\n", " break \n", " else:\n", " #if it doesnt break, neither condition is satisfied => this executes => we found a composite\n", " return \"Composite\"\n", " return \"Probably prime\"\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- https://core.ac.uk/download/pdf/81930829.pdf\n", "- https://www.jointmathematicsmeetings.org/mcom/1995-64-209/S0025-5718-1995-1260124-2/S0025-5718-1995-1260124-2.pdf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let $n = p_1p_2..p_h$\n", "Define: \n", "- $k_i = \\cfrac {p_i - 1} {p_1 - 1}$\n", "- $m_i = \\cfrac {\\Pi_{j \\neq i} {p_j - 1}} {p_1 - 1} \\forall 1 \\leq i \\leq h$\n", "\n", "If $k_i, m_i \\in \\mathbb{Z} \\ \\forall 2 \\leq i \\leq h => n$ is a Carmichael number" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(The law of quadratic reciprocity) If $p$ and $q$ are distinct odd primes, we have\n", "$\\left(\\dfrac{q}{p}\\right)\\left(\\dfrac{p}{q}\\right)=(-1)^{\\frac{p-1}{2} \\frac{q-1}{2}}$\n", "\n", "\n", "Additional proprieties:\n", "- if $\\gcd(a, n) = 1$ and $\\left(\\dfrac a {p_i} \\right)= -1$ for all $1 \\leq i \\leq h$ then $a$ will be a Miller Rabin non-witness with respect to $n$ \n", "- for any prime $p$, $\\left(\\dfrac a {p}\\right)$ can be determined from $\\left(\\dfrac p a\\right)$ and the values of $a \\bmod 4$ and $p \\bmod 4$ => for each a we can compute the set $S_a$ of possible non-residues mod $4a$ of potential primes $p$\n", " $$S_a \\text{ satisfying } \\left(\\dfrac a {p}\\right) = -1 \\iff p \\bmod 4a \\in S_a$$\n", " \n", "Starting with some $p_1$ we can determine the other $p_i$ of the form $p_i = k_i(p_1 - 1)+ 1$ for all $1 \\leq i \\leq h => $ $$k_i(p_1 - 1) + 1 \\bmod 4a \\in S_a \\ \\forall 1\\leq i \\leq h$$\n", "\n", "If the coeff $k_i$ are coprime to $a$ then the condition becomes:$$p_1 \\bmod 4a∈⋂^h_{i=1}k^{−1}_i(S_a+k_i−1)$$ where $k^{−1}_i(S_a+k_i−1)$ is the set $\\{k^{−1}_i(s+k_i−1) | s \\in S_a\\}$ => We have a set of conditions for the values of $p_1$ for each $a$\n", "\n", "So for each value of $a$ we have a few candidates in our subset from $S_a$. We select one of these candidates $z_a$ for each $a \\in A$ and using the CRT we can combine these conditions into a single one $p_1 \\bmod \\text{lcm}(4, a_1, .. a_h)$ \n", "\n", "The $k_i$ are a set of primes usually smaller than $\\max(A)$ such that $k_i^{-1}$ exists mod $4a$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Algorithm**:\n", "- Generate the set $S_a$ of residues modulo $4a$ of primes $p$ s.t $\\left(\\dfrac a {p}\\right) = -1$ for each base $a$\n", "- Select $k_i$ coprime to all $a$\n", "- Find the subsets that meet the condition \n", " - $p_1 \\bmod 4a∈⋂^h_{i=1}k^{−1}_i(S_a+k_i−1)$\n", "- Choose 1 residue / set => $z_a$ (arbitrary but not all combinations will lead to a solution)\n", "- Verify additional conditions:\n", " - for $h = 3 $\n", " - $p_1 \\equiv k_3^{-1} \\bmod k_2$\n", " - $p_1 \\equiv k_2^{-1} \\bmod k_3$\n", "- Use CRT with all the conditions \n", " - $p_1 = z \\bmod \\text{lcm}(4, a_1, ... a_h, k_2, ... k_h)$\n", "- Compute $p_i = k_i(p_1 - 1) + 1$ such that all $p_i$ are prime." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fixed bases -> Bleichenbacher" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "https://www.semanticscholar.org/paper/Breaking-a-Cryptographic-Protocol-with-Pseudoprimes-Bleichenbacher/e9f1f083adc1786466d344db5b3d85f4c268b429?p2df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(Korselt's Criterion)**: A composite integer $n$ is a Carmichael number if and only if the following two conditions are satisfied:\n", "- $n$ is square-free, i.e., $n$ is not divisible by the square of any prime; \n", "- $p−1$ divides $n−1$ for every prime divisor $p$ of $n$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Erdos's idea to construct pseudoprimes\n", "- Choose $M \\in \\mathbb{Z}$ that has many divisors\n", "- Let $R$ be the set of primes $r$ such that $r−1$ is a divisor of $M$. \n", "- If a subset $T⊂R$ can be found such that\n", "$$ C = \\underset {r\\in T}{\\prod} r \\equiv 1 \\bmod M \\ \\ \\ (1)$$\n", "Then C is a Carmichael number because C satisfies the Korselt's criterion \n", "\n", "**Note**: One can hope to find such sets $$ if $R$ contains more than about $\\log_2(M)$ primes\n", "\n", "\n", "Additionally, a Carmichael number $C$ is a strong pseudoprime for a base $a$ if the order of $a$ modulo $r$ is divisible by the same power of 2 for all primes factors $r$ of $C$. \n", "If all prime factors $r$ are congruent 3 modulo 4 then this condition is satisfied when $a$ is a quadratic residue modulo either all prime factors $r$ or none at all, because in that case the order of $a$ modulor is either even or odd for all $r$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Algorithm**\n", "- Choose $M \\in \\mathbb{Z}$\n", "- Find a set $R$ of primes s.t $\\forall $a$ \\in $A$ \\ \\exists c_i \\in \\{-1,1\\} \\text{ with } \\left(\\dfrac {a_i} r\\right) = c_i \\ \\forall r \\in R$\n", "- Find a subset $T \\subset R$ that can satisfy equation (1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- https://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test\n", "- https://brilliant.org/wiki/prime-testing/" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.4" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }