1101 lines
60 KiB
HTML
1101 lines
60 KiB
HTML
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="en" >
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<link rel="shortcut icon" href="../img/favicon.ico" />
|
||
<title>Curves - CryptoTools documentation</title>
|
||
<link rel="stylesheet" href="../css/theme.css" />
|
||
<link rel="stylesheet" href="../css/theme_extra.css" />
|
||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" />
|
||
<link href="../assets/_mkdocstrings.css" rel="stylesheet" />
|
||
|
||
<script>
|
||
// Current page data
|
||
var mkdocs_page_name = "Curves";
|
||
var mkdocs_page_input_path = "curves.md";
|
||
var mkdocs_page_url = null;
|
||
</script>
|
||
|
||
<!--[if lt IE 9]>
|
||
<script src="../js/html5shiv.min.js"></script>
|
||
<![endif]-->
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
|
||
<script>hljs.highlightAll();</script>
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav" role="document">
|
||
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search">
|
||
<a href=".." class="icon icon-home"> CryptoTools documentation
|
||
</a>
|
||
</div>
|
||
|
||
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../introduction/">Introduction</a>
|
||
</li>
|
||
</ul>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../installation/">Installation</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Low-level cryptographic</span></p>
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../number-theory/">Number theory</a>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../group-theory/">Group theory</a>
|
||
</li>
|
||
<li class="toctree-l1 current"><a class="reference internal current" href="#">Curves</a>
|
||
<ul class="current">
|
||
<li class="toctree-l2"><a class="reference internal" href="#points">Points</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.point">point</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.point.Point">Point</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#curves">Curves</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.curve">curve</a>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="#Cryptotools.Groups.curve.Curve">Curve</a>
|
||
<ul>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.curve.Curve.add">add</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.curve.Curve.find_reverse">find_reverse</a>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="#Cryptotools.Groups.curve.Curve.scalar">scalar</a>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../ecc/">Elliptic Curve Cryptography</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Public Keys</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../rsa/">RSA</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Utils</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../utils/">Utils</a>
|
||
</li>
|
||
</ul>
|
||
<p class="caption"><span class="caption-text">Examples</span></p>
|
||
<ul>
|
||
<li class="toctree-l1"><a class="reference internal" href="../example-rsa-keys/">Generating RSA Keys</a>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../example-curves/">Generating Curves</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
|
||
<nav class="wy-nav-top" role="navigation" aria-label="Mobile navigation menu">
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="..">CryptoTools documentation</a>
|
||
|
||
</nav>
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content"><div role="navigation" aria-label="breadcrumbs navigation">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href=".." class="icon icon-home" aria-label="Docs"></a></li>
|
||
<li class="breadcrumb-item">Low-level cryptographic</li>
|
||
<li class="breadcrumb-item active">Curves</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
<div class="section" itemprop="articleBody">
|
||
|
||
<h1 id="elliptic-curves">Elliptic Curves</h1>
|
||
<h2 id="points">Points</h2>
|
||
|
||
|
||
<div class="doc doc-object doc-module">
|
||
|
||
|
||
|
||
<a id="Cryptotools.Groups.point"></a>
|
||
<div class="doc doc-contents first">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-class">
|
||
|
||
|
||
|
||
<h2 id="Cryptotools.Groups.point.Point" class="doc doc-heading">
|
||
<code>Point</code>
|
||
|
||
|
||
</h2>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
|
||
|
||
<p>This simple class represent the Point at the coordinate x and y in a plan</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Attributes:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>x</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Position at the x</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>y</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Position at the y</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/point.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 4</span>
|
||
<span class="normal"> 5</span>
|
||
<span class="normal"> 6</span>
|
||
<span class="normal"> 7</span>
|
||
<span class="normal"> 8</span>
|
||
<span class="normal"> 9</span>
|
||
<span class="normal">10</span>
|
||
<span class="normal">11</span>
|
||
<span class="normal">12</span>
|
||
<span class="normal">13</span>
|
||
<span class="normal">14</span>
|
||
<span class="normal">15</span>
|
||
<span class="normal">16</span>
|
||
<span class="normal">17</span>
|
||
<span class="normal">18</span>
|
||
<span class="normal">19</span>
|
||
<span class="normal">20</span>
|
||
<span class="normal">21</span>
|
||
<span class="normal">22</span>
|
||
<span class="normal">23</span>
|
||
<span class="normal">24</span>
|
||
<span class="normal">25</span>
|
||
<span class="normal">26</span>
|
||
<span class="normal">27</span>
|
||
<span class="normal">28</span>
|
||
<span class="normal">29</span>
|
||
<span class="normal">30</span>
|
||
<span class="normal">31</span>
|
||
<span class="normal">32</span>
|
||
<span class="normal">33</span>
|
||
<span class="normal">34</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Point</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This simple class represent the Point at the coordinate x and y in a plan</span>
|
||
|
||
<span class="sd"> Attributes:</span>
|
||
<span class="sd"> x (Integer): Position at the x</span>
|
||
<span class="sd"> y (Integer): Position at the y</span>
|
||
<span class="sd"> """</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_x</span> <span class="o">=</span> <span class="n">x</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_y</span> <span class="o">=</span> <span class="n">y</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">x</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_x</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">y</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_y</span>
|
||
|
||
<span class="nd">@x</span><span class="o">.</span><span class="n">setter</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">x</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_x</span> <span class="o">=</span> <span class="n">x</span>
|
||
|
||
<span class="nd">@y</span><span class="o">.</span><span class="n">setter</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">y</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_y</span> <span class="o">=</span> <span class="n">y</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_x</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_x</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">x</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_y</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">y</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div><h2 id="curves">Curves</h2>
|
||
|
||
|
||
<div class="doc doc-object doc-module">
|
||
|
||
|
||
|
||
<a id="Cryptotools.Groups.curve"></a>
|
||
<div class="doc doc-contents first">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-class">
|
||
|
||
|
||
|
||
<h2 id="Cryptotools.Groups.curve.Curve" class="doc doc-heading">
|
||
<code>Curve</code>
|
||
|
||
|
||
</h2>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<details class="quote">
|
||
<summary>Source code in <code>Cryptotools/Groups/curve.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 8</span>
|
||
<span class="normal"> 9</span>
|
||
<span class="normal"> 10</span>
|
||
<span class="normal"> 11</span>
|
||
<span class="normal"> 12</span>
|
||
<span class="normal"> 13</span>
|
||
<span class="normal"> 14</span>
|
||
<span class="normal"> 15</span>
|
||
<span class="normal"> 16</span>
|
||
<span class="normal"> 17</span>
|
||
<span class="normal"> 18</span>
|
||
<span class="normal"> 19</span>
|
||
<span class="normal"> 20</span>
|
||
<span class="normal"> 21</span>
|
||
<span class="normal"> 22</span>
|
||
<span class="normal"> 23</span>
|
||
<span class="normal"> 24</span>
|
||
<span class="normal"> 25</span>
|
||
<span class="normal"> 26</span>
|
||
<span class="normal"> 27</span>
|
||
<span class="normal"> 28</span>
|
||
<span class="normal"> 29</span>
|
||
<span class="normal"> 30</span>
|
||
<span class="normal"> 31</span>
|
||
<span class="normal"> 32</span>
|
||
<span class="normal"> 33</span>
|
||
<span class="normal"> 34</span>
|
||
<span class="normal"> 35</span>
|
||
<span class="normal"> 36</span>
|
||
<span class="normal"> 37</span>
|
||
<span class="normal"> 38</span>
|
||
<span class="normal"> 39</span>
|
||
<span class="normal"> 40</span>
|
||
<span class="normal"> 41</span>
|
||
<span class="normal"> 42</span>
|
||
<span class="normal"> 43</span>
|
||
<span class="normal"> 44</span>
|
||
<span class="normal"> 45</span>
|
||
<span class="normal"> 46</span>
|
||
<span class="normal"> 47</span>
|
||
<span class="normal"> 48</span>
|
||
<span class="normal"> 49</span>
|
||
<span class="normal"> 50</span>
|
||
<span class="normal"> 51</span>
|
||
<span class="normal"> 52</span>
|
||
<span class="normal"> 53</span>
|
||
<span class="normal"> 54</span>
|
||
<span class="normal"> 55</span>
|
||
<span class="normal"> 56</span>
|
||
<span class="normal"> 57</span>
|
||
<span class="normal"> 58</span>
|
||
<span class="normal"> 59</span>
|
||
<span class="normal"> 60</span>
|
||
<span class="normal"> 61</span>
|
||
<span class="normal"> 62</span>
|
||
<span class="normal"> 63</span>
|
||
<span class="normal"> 64</span>
|
||
<span class="normal"> 65</span>
|
||
<span class="normal"> 66</span>
|
||
<span class="normal"> 67</span>
|
||
<span class="normal"> 68</span>
|
||
<span class="normal"> 69</span>
|
||
<span class="normal"> 70</span>
|
||
<span class="normal"> 71</span>
|
||
<span class="normal"> 72</span>
|
||
<span class="normal"> 73</span>
|
||
<span class="normal"> 74</span>
|
||
<span class="normal"> 75</span>
|
||
<span class="normal"> 76</span>
|
||
<span class="normal"> 77</span>
|
||
<span class="normal"> 78</span>
|
||
<span class="normal"> 79</span>
|
||
<span class="normal"> 80</span>
|
||
<span class="normal"> 81</span>
|
||
<span class="normal"> 82</span>
|
||
<span class="normal"> 83</span>
|
||
<span class="normal"> 84</span>
|
||
<span class="normal"> 85</span>
|
||
<span class="normal"> 86</span>
|
||
<span class="normal"> 87</span>
|
||
<span class="normal"> 88</span>
|
||
<span class="normal"> 89</span>
|
||
<span class="normal"> 90</span>
|
||
<span class="normal"> 91</span>
|
||
<span class="normal"> 92</span>
|
||
<span class="normal"> 93</span>
|
||
<span class="normal"> 94</span>
|
||
<span class="normal"> 95</span>
|
||
<span class="normal"> 96</span>
|
||
<span class="normal"> 97</span>
|
||
<span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span>
|
||
<span class="normal">110</span>
|
||
<span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span>
|
||
<span class="normal">115</span>
|
||
<span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span>
|
||
<span class="normal">120</span>
|
||
<span class="normal">121</span>
|
||
<span class="normal">122</span>
|
||
<span class="normal">123</span>
|
||
<span class="normal">124</span>
|
||
<span class="normal">125</span>
|
||
<span class="normal">126</span>
|
||
<span class="normal">127</span>
|
||
<span class="normal">128</span>
|
||
<span class="normal">129</span>
|
||
<span class="normal">130</span>
|
||
<span class="normal">131</span>
|
||
<span class="normal">132</span>
|
||
<span class="normal">133</span>
|
||
<span class="normal">134</span>
|
||
<span class="normal">135</span>
|
||
<span class="normal">136</span>
|
||
<span class="normal">137</span>
|
||
<span class="normal">138</span>
|
||
<span class="normal">139</span>
|
||
<span class="normal">140</span>
|
||
<span class="normal">141</span>
|
||
<span class="normal">142</span>
|
||
<span class="normal">143</span>
|
||
<span class="normal">144</span>
|
||
<span class="normal">145</span>
|
||
<span class="normal">146</span>
|
||
<span class="normal">147</span>
|
||
<span class="normal">148</span>
|
||
<span class="normal">149</span>
|
||
<span class="normal">150</span>
|
||
<span class="normal">151</span>
|
||
<span class="normal">152</span>
|
||
<span class="normal">153</span>
|
||
<span class="normal">154</span>
|
||
<span class="normal">155</span>
|
||
<span class="normal">156</span>
|
||
<span class="normal">157</span>
|
||
<span class="normal">158</span>
|
||
<span class="normal">159</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Curve</span><span class="p">:</span>
|
||
<span class="c1"># Curve</span>
|
||
<span class="n">WEIERSTRASS</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="n">MONTGOMERY</span> <span class="o">=</span> <span class="mi">1</span>
|
||
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_a</span> <span class="o">=</span> <span class="n">a</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_b</span> <span class="o">=</span> <span class="n">b</span>
|
||
|
||
<span class="k">if</span> <span class="n">t</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="n">Curve</span><span class="o">.</span><span class="n">WEIERSTRASS</span><span class="p">,</span> <span class="n">Curve</span><span class="o">.</span><span class="n">MONTGOMERY</span><span class="p">):</span>
|
||
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">"The type of the curve is not recognized"</span><span class="p">)</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">=</span> <span class="n">t</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_xtmp</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">500</span><span class="p">)</span><span class="o">.</span><span class="n">tolist</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_x</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_y</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_yn</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_pointsSym</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">f</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">==</span> <span class="n">Curve</span><span class="o">.</span><span class="n">WEIERSTRASS</span><span class="p">:</span>
|
||
<span class="n">y</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_a</span> <span class="o">*</span> <span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_b</span>
|
||
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">==</span> <span class="n">Curve</span><span class="o">.</span><span class="n">MONTGOMERY</span><span class="p">:</span>
|
||
<span class="n">y</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">+</span> <span class="n">x</span>
|
||
<span class="k">if</span> <span class="n">y</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">sqrt</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="kc">None</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">generatePoints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_xtmp</span><span class="p">:</span>
|
||
<span class="n">y</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">y</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="k">continue</span>
|
||
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_x</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_y</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_yn</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="o">-</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_points</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span>
|
||
<span class="n">x</span><span class="p">,</span>
|
||
<span class="n">y</span>
|
||
<span class="p">))</span>
|
||
<span class="bp">self</span><span class="o">.</span><span class="n">_pointsSym</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Point</span><span class="p">(</span>
|
||
<span class="n">x</span><span class="p">,</span>
|
||
<span class="o">-</span><span class="n">y</span>
|
||
<span class="p">))</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">x</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_x</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">y</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_y</span>
|
||
|
||
<span class="nd">@property</span>
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">yn</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_yn</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">getPoints</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_points</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">getPointsSym</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pointsSym</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span> <span class="o">-></span> <span class="n">Point</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function operathe addition operation on two points P and Q</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (Object): The first Point on the curve</span>
|
||
<span class="sd"> Q (Object): The second Point on the curve</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the Point object R</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="c1">## Check if P or Q are infinity</span>
|
||
<span class="k">if</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
|
||
<span class="c1"># point doubling</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">:</span>
|
||
<span class="c1"># Infinity</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span> <span class="o">!=</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="ow">or</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Point doubling</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="c1"># It's working with the inverse modular, WHY ???</span>
|
||
<span class="n">m</span> <span class="o">=</span> <span class="p">((</span><span class="mi">3</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a</span><span class="p">)</span> <span class="o">*</span> <span class="n">inv</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="n">m</span> <span class="o">=</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="n">inv</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||
<span class="c1"># May call this Exception: base is not invertible for the given modulus</span>
|
||
<span class="c1"># I return an Infinity point until I fixed that</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="n">xr</span> <span class="o">=</span> <span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
|
||
|
||
<span class="n">yr</span> <span class="o">=</span> <span class="p">(</span><span class="n">m</span> <span class="o">*</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">xr</span><span class="p">))</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">xr</span><span class="p">,</span> <span class="n">yr</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">scalar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="o">-></span> <span class="n">Point</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function compute a Scalar Multiplication of P, n time. This algorithm is also known as Double and Add.</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (point): the Point to multiplication</span>
|
||
<span class="sd"> n (Integer): multiplicate n time P</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the result of the Scalar multiplication</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">binary</span> <span class="o">=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">n</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
|
||
<span class="n">binary</span> <span class="o">=</span> <span class="n">binary</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># We need to reverse the binary</span>
|
||
|
||
<span class="n">nP</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
<span class="n">Rtmp</span> <span class="o">=</span> <span class="n">P</span>
|
||
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">binary</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="s1">'1'</span><span class="p">:</span>
|
||
<span class="n">nP</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">nP</span><span class="p">,</span> <span class="n">Rtmp</span><span class="p">)</span>
|
||
<span class="n">Rtmp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Rtmp</span><span class="p">,</span> <span class="n">Rtmp</span><span class="p">)</span> <span class="c1"># Double P</span>
|
||
|
||
<span class="k">return</span> <span class="n">nP</span>
|
||
|
||
<span class="k">def</span><span class="w"> </span><span class="nf">find_reverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the reverse of the Point P</span>
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (Point): Point object to find </span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the object Pr, which is the reverse point of P</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">Pr</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pointsSym</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="n">p</span><span class="o">.</span><span class="n">x</span> <span class="ow">and</span> <span class="o">-</span><span class="n">P</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="n">p</span><span class="o">.</span><span class="n">y</span><span class="p">:</span>
|
||
<span class="n">Pr</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="n">Pr</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
|
||
|
||
|
||
<div class="doc doc-children">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.curve.Curve.add" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">add</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function operathe addition operation on two points P and Q</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Parameters:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>P</code></b>
|
||
(<code><span title="Object">Object</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>The first Point on the curve</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>Q</code></b>
|
||
(<code><span title="Object">Object</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>The second Point on the curve</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="Cryptotools.Groups.elliptic.Point">Point</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the Point object R</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="mkdocstrings-source">
|
||
<summary>Source code in <code>Cryptotools/Groups/curve.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 74</span>
|
||
<span class="normal"> 75</span>
|
||
<span class="normal"> 76</span>
|
||
<span class="normal"> 77</span>
|
||
<span class="normal"> 78</span>
|
||
<span class="normal"> 79</span>
|
||
<span class="normal"> 80</span>
|
||
<span class="normal"> 81</span>
|
||
<span class="normal"> 82</span>
|
||
<span class="normal"> 83</span>
|
||
<span class="normal"> 84</span>
|
||
<span class="normal"> 85</span>
|
||
<span class="normal"> 86</span>
|
||
<span class="normal"> 87</span>
|
||
<span class="normal"> 88</span>
|
||
<span class="normal"> 89</span>
|
||
<span class="normal"> 90</span>
|
||
<span class="normal"> 91</span>
|
||
<span class="normal"> 92</span>
|
||
<span class="normal"> 93</span>
|
||
<span class="normal"> 94</span>
|
||
<span class="normal"> 95</span>
|
||
<span class="normal"> 96</span>
|
||
<span class="normal"> 97</span>
|
||
<span class="normal"> 98</span>
|
||
<span class="normal"> 99</span>
|
||
<span class="normal">100</span>
|
||
<span class="normal">101</span>
|
||
<span class="normal">102</span>
|
||
<span class="normal">103</span>
|
||
<span class="normal">104</span>
|
||
<span class="normal">105</span>
|
||
<span class="normal">106</span>
|
||
<span class="normal">107</span>
|
||
<span class="normal">108</span>
|
||
<span class="normal">109</span>
|
||
<span class="normal">110</span>
|
||
<span class="normal">111</span>
|
||
<span class="normal">112</span>
|
||
<span class="normal">113</span>
|
||
<span class="normal">114</span>
|
||
<span class="normal">115</span>
|
||
<span class="normal">116</span>
|
||
<span class="normal">117</span>
|
||
<span class="normal">118</span>
|
||
<span class="normal">119</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">Q</span><span class="p">)</span> <span class="o">-></span> <span class="n">Point</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function operathe addition operation on two points P and Q</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (Object): The first Point on the curve</span>
|
||
<span class="sd"> Q (Object): The second Point on the curve</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the Point object R</span>
|
||
<span class="sd"> """</span>
|
||
|
||
<span class="c1">## Check if P or Q are infinity</span>
|
||
<span class="k">if</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="k">elif</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
|
||
<span class="c1"># point doubling</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">:</span>
|
||
<span class="c1"># Infinity</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span> <span class="o">!=</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="ow">or</span> <span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="c1"># Point doubling</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="c1"># It's working with the inverse modular, WHY ???</span>
|
||
<span class="n">m</span> <span class="o">=</span> <span class="p">((</span><span class="mi">3</span> <span class="o">*</span> <span class="nb">pow</span><span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_a</span><span class="p">)</span> <span class="o">*</span> <span class="n">inv</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="k">else</span><span class="p">:</span>
|
||
<span class="k">try</span><span class="p">:</span>
|
||
<span class="n">inv</span> <span class="o">=</span> <span class="nb">pow</span><span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="n">m</span> <span class="o">=</span> <span class="p">(</span><span class="n">Q</span><span class="o">.</span><span class="n">y</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span><span class="p">)</span> <span class="o">*</span> <span class="n">inv</span>
|
||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
||
<span class="c1"># May call this Exception: base is not invertible for the given modulus</span>
|
||
<span class="c1"># I return an Infinity point until I fixed that</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
|
||
<span class="n">xr</span> <span class="o">=</span> <span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">Q</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
|
||
|
||
<span class="n">yr</span> <span class="o">=</span> <span class="p">(</span><span class="n">m</span> <span class="o">*</span> <span class="p">(</span><span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">xr</span><span class="p">))</span> <span class="o">-</span> <span class="n">P</span><span class="o">.</span><span class="n">y</span>
|
||
<span class="k">return</span> <span class="n">Point</span><span class="p">(</span><span class="n">xr</span><span class="p">,</span> <span class="n">yr</span><span class="p">)</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.curve.Curve.find_reverse" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">find_reverse</span><span class="p">(</span><span class="n">P</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function return the reverse of the Point P
|
||
Args:
|
||
P (Point): Point object to find </p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the object Pr, which is the reverse point of P</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="mkdocstrings-source">
|
||
<summary>Source code in <code>Cryptotools/Groups/curve.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">145</span>
|
||
<span class="normal">146</span>
|
||
<span class="normal">147</span>
|
||
<span class="normal">148</span>
|
||
<span class="normal">149</span>
|
||
<span class="normal">150</span>
|
||
<span class="normal">151</span>
|
||
<span class="normal">152</span>
|
||
<span class="normal">153</span>
|
||
<span class="normal">154</span>
|
||
<span class="normal">155</span>
|
||
<span class="normal">156</span>
|
||
<span class="normal">157</span>
|
||
<span class="normal">158</span>
|
||
<span class="normal">159</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">find_reverse</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">):</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function return the reverse of the Point P</span>
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (Point): Point object to find </span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the object Pr, which is the reverse point of P</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">Pr</span> <span class="o">=</span> <span class="kc">None</span>
|
||
<span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pointsSym</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">P</span><span class="o">.</span><span class="n">x</span> <span class="o">==</span> <span class="n">p</span><span class="o">.</span><span class="n">x</span> <span class="ow">and</span> <span class="o">-</span><span class="n">P</span><span class="o">.</span><span class="n">y</span> <span class="o">==</span> <span class="n">p</span><span class="o">.</span><span class="n">y</span><span class="p">:</span>
|
||
<span class="n">Pr</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||
<span class="k">break</span>
|
||
<span class="k">return</span> <span class="n">Pr</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="doc doc-object doc-function">
|
||
|
||
|
||
<h3 id="Cryptotools.Groups.curve.Curve.scalar" class="doc doc-heading">
|
||
<code class="highlight language-python"><span class="n">scalar</span><span class="p">(</span><span class="n">P</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span></code>
|
||
|
||
</h3>
|
||
|
||
|
||
<div class="doc doc-contents ">
|
||
|
||
<p>This function compute a Scalar Multiplication of P, n time. This algorithm is also known as Double and Add.</p>
|
||
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Parameters:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<b><code>P</code></b>
|
||
(<code><a class="autorefs autorefs-internal" title="Cryptotools.Groups.point" href="#Cryptotools.Groups.point">point</a></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>the Point to multiplication</p>
|
||
</div>
|
||
</li>
|
||
<li>
|
||
<b><code>n</code></b>
|
||
(<code><span title="Integer">Integer</span></code>)
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>multiplicate n time P</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<table class="field-list">
|
||
<colgroup>
|
||
<col class="field-name" />
|
||
<col class="field-body" />
|
||
</colgroup>
|
||
<tbody valign="top">
|
||
<tr class="field">
|
||
<th class="field-name">Returns:</th>
|
||
<td class="field-body">
|
||
<ul class="first simple">
|
||
<li>
|
||
<code><span title="Cryptotools.Groups.elliptic.Point">Point</span></code>
|
||
–
|
||
<div class="doc-md-description">
|
||
<p>Return the result of the Scalar multiplication</p>
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<details class="mkdocstrings-source">
|
||
<summary>Source code in <code>Cryptotools/Groups/curve.py</code></summary>
|
||
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">121</span>
|
||
<span class="normal">122</span>
|
||
<span class="normal">123</span>
|
||
<span class="normal">124</span>
|
||
<span class="normal">125</span>
|
||
<span class="normal">126</span>
|
||
<span class="normal">127</span>
|
||
<span class="normal">128</span>
|
||
<span class="normal">129</span>
|
||
<span class="normal">130</span>
|
||
<span class="normal">131</span>
|
||
<span class="normal">132</span>
|
||
<span class="normal">133</span>
|
||
<span class="normal">134</span>
|
||
<span class="normal">135</span>
|
||
<span class="normal">136</span>
|
||
<span class="normal">137</span>
|
||
<span class="normal">138</span>
|
||
<span class="normal">139</span>
|
||
<span class="normal">140</span>
|
||
<span class="normal">141</span>
|
||
<span class="normal">142</span>
|
||
<span class="normal">143</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">scalar</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="o">-></span> <span class="n">Point</span><span class="p">:</span>
|
||
<span class="w"> </span><span class="sd">"""</span>
|
||
<span class="sd"> This function compute a Scalar Multiplication of P, n time. This algorithm is also known as Double and Add.</span>
|
||
|
||
<span class="sd"> Args:</span>
|
||
<span class="sd"> P (point): the Point to multiplication</span>
|
||
<span class="sd"> n (Integer): multiplicate n time P</span>
|
||
|
||
<span class="sd"> Returns:</span>
|
||
<span class="sd"> Return the result of the Scalar multiplication</span>
|
||
<span class="sd"> """</span>
|
||
<span class="n">binary</span> <span class="o">=</span> <span class="nb">bin</span><span class="p">(</span><span class="n">n</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
|
||
<span class="n">binary</span> <span class="o">=</span> <span class="n">binary</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="c1"># We need to reverse the binary</span>
|
||
|
||
<span class="n">nP</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
|
||
<span class="n">Rtmp</span> <span class="o">=</span> <span class="n">P</span>
|
||
|
||
<span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">binary</span><span class="p">:</span>
|
||
<span class="k">if</span> <span class="n">b</span> <span class="o">==</span> <span class="s1">'1'</span><span class="p">:</span>
|
||
<span class="n">nP</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">nP</span><span class="p">,</span> <span class="n">Rtmp</span><span class="p">)</span>
|
||
<span class="n">Rtmp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">Rtmp</span><span class="p">,</span> <span class="n">Rtmp</span><span class="p">)</span> <span class="c1"># Double P</span>
|
||
|
||
<span class="k">return</span> <span class="n">nP</span>
|
||
</code></pre></div></td></tr></table></div>
|
||
</details>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div><footer>
|
||
<div class="rst-footer-buttons" role="navigation" aria-label="Footer Navigation">
|
||
<a href="../group-theory/" class="btn btn-neutral float-left" title="Group theory"><span class="icon icon-circle-arrow-left"></span> Previous</a>
|
||
<a href="../ecc/" class="btn btn-neutral float-right" title="Elliptic Curve Cryptography">Next <span class="icon icon-circle-arrow-right"></span></a>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<!-- Copyright etc -->
|
||
</div>
|
||
|
||
Built with <a href="https://www.mkdocs.org/">MkDocs</a> using a <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
||
</footer>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
</section>
|
||
|
||
</div>
|
||
|
||
<div class="rst-versions" role="note" aria-label="Versions">
|
||
<span class="rst-current-version" data-toggle="rst-current-version">
|
||
|
||
|
||
<span><a href="../group-theory/" style="color: #fcfcfc">« Previous</a></span>
|
||
|
||
|
||
<span><a href="../ecc/" style="color: #fcfcfc">Next »</a></span>
|
||
|
||
</span>
|
||
</div>
|
||
<script src="../js/jquery-3.6.0.min.js"></script>
|
||
<script>var base_url = "..";</script>
|
||
<script src="../js/theme_extra.js"></script>
|
||
<script src="../js/theme.js"></script>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html>
|