/usr/share/doc/python-crypto-doc/Crypto.PublicKey.ElGamal-module.html is in python-crypto-doc 2.6.1-4ubuntu0.3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 | <?xml version="1.0" encoding="ascii"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Crypto.PublicKey.ElGamal</title>
<link rel="stylesheet" href="epydoc.css" type="text/css" />
<script type="text/javascript" src="epydoc.js"></script>
</head>
<body bgcolor="white" text="black" link="blue" vlink="#204080"
alink="#204080">
<!-- ==================== NAVIGATION BAR ==================== -->
<table class="navbar" border="0" width="100%" cellpadding="0"
bgcolor="#a0c0ff" cellspacing="0">
<tr valign="middle">
<!-- Home link -->
<th> <a
href="Crypto-module.html">Home</a> </th>
<!-- Tree link -->
<th> <a
href="module-tree.html">Trees</a> </th>
<!-- Index link -->
<th> <a
href="identifier-index.html">Indices</a> </th>
<!-- Help link -->
<th> <a
href="help.html">Help</a> </th>
<!-- Project homepage -->
<th class="navbar" align="right" width="100%">
<table border="0" cellpadding="0" cellspacing="0">
<tr><th class="navbar" align="center"
><a href="http://www.pycrypto.org/">PyCrypto.org</a></th>
</tr></table></th>
</tr>
</table>
<table width="100%" cellpadding="0" cellspacing="0">
<tr valign="top">
<td width="100%">
<span class="breadcrumbs">
<a href="Crypto-module.html">Package Crypto</a> ::
<a href="Crypto.PublicKey-module.html">Package PublicKey</a> ::
Module ElGamal
</span>
</td>
<td>
<table cellpadding="0" cellspacing="0">
<!-- hide/show private -->
<tr><td align="right"><span class="options"
>[<a href="frames.html" target="_top">frames</a
>] | <a href="Crypto.PublicKey.ElGamal-module.html"
target="_top">no frames</a>]</span></td></tr>
</table>
</td>
</tr>
</table>
<!-- ==================== MODULE DESCRIPTION ==================== -->
<h1 class="epydoc">Module ElGamal</h1><p class="nomargin-top"></p>
<p>ElGamal public-key algorithm (randomized encryption and signature).</p>
<div class="rst-section" id="rst-signature-algorithm">
<h1 class="heading">Signature algorithm</h1>
<p>The security of the ElGamal signature scheme is based (like DSA) on the discrete
logarithm problem (<a class="rst-reference external" href="http://www.cosic.esat.kuleuven.be/publications/talk-78.pdf" target="_top">DLP</a>). Given a cyclic group, a generator <em>g</em>,
and an element <em>h</em>, it is hard to find an integer <em>x</em> such that <em>g^x = h</em>.</p>
<p>The group is the largest multiplicative sub-group of the integers modulo <em>p</em>,
with <em>p</em> prime.
The signer holds a value <em>x</em> (<em>0<x<p-1</em>) as private key, and its public
key (<em>y</em> where <em>y=g^x mod p</em>) is distributed.</p>
<p>The ElGamal signature is twice as big as <em>p</em>.</p>
</div>
<div class="rst-section" id="rst-encryption-algorithm">
<h1 class="heading">Encryption algorithm</h1>
<p>The security of the ElGamal encryption scheme is based on the computational
Diffie-Hellman problem (<a class="rst-reference external" href="http://en.wikipedia.org/wiki/Computational_Diffie%E2%80%93Hellman_assumption" target="_top">CDH</a>). Given a cyclic group, a generator <em>g</em>,
and two integers <em>a</em> and <em>b</em>, it is difficult to find
the element <em>g^{ab}</em> when only <em>g^a</em> and <em>g^b</em> are known, and not <em>a</em> and <em>b</em>.</p>
<p>As before, the group is the largest multiplicative sub-group of the integers
modulo <em>p</em>, with <em>p</em> prime.
The receiver holds a value <em>a</em> (<em>0<a<p-1</em>) as private key, and its public key
(<em>b</em> where <em>b*=g^a</em>) is given to the sender.</p>
<p>The ElGamal ciphertext is twice as big as <em>p</em>.</p>
</div>
<div class="rst-section" id="rst-domain-parameters">
<h1 class="heading">Domain parameters</h1>
<p>For both signature and encryption schemes, the values <em>(p,g)</em> are called
<em>domain parameters</em>.
They are not sensitive but must be distributed to all parties (senders and
receivers).
Different signers can share the same domain parameters, as can
different recipients of encrypted messages.</p>
</div>
<div class="rst-section" id="rst-security">
<h1 class="heading">Security</h1>
<p>Both DLP and CDH problem are believed to be difficult, and they have been proved
such (and therefore secure) for more than 30 years.</p>
<p>The cryptographic strength is linked to the magnitude of <em>p</em>.
In 2012, a sufficient size for <em>p</em> is deemed to be 2048 bits.
For more information, see the most recent <a class="rst-reference external" href="http://www.ecrypt.eu.org/documents/D.SPA.17.pdf" target="_top">ECRYPT</a> report.</p>
<p>Even though ElGamal algorithms are in theory reasonably secure for new designs,
in practice there are no real good reasons for using them.
The signature is four times larger than the equivalent DSA, and the ciphertext
is two times larger than the equivalent RSA.</p>
</div>
<div class="rst-section" id="rst-functionality">
<h1 class="heading">Functionality</h1>
<p>This module provides facilities for generating new ElGamal keys and for constructing
them from known components. ElGamal keys allows you to perform basic signing,
verification, encryption, and decryption.</p>
<blockquote>
<pre class="py-doctest">
<span class="py-prompt">>>> </span><span class="py-keyword">from</span> Crypto <span class="py-keyword">import</span> Random
<span class="py-prompt">>>> </span><span class="py-keyword">from</span> Crypto.Random <span class="py-keyword">import</span> random
<span class="py-prompt">>>> </span><span class="py-keyword">from</span> Crypto.PublicKey <span class="py-keyword">import</span> ElGamal
<span class="py-prompt">>>> </span><span class="py-keyword">from</span> Crypto.Util.number <span class="py-keyword">import</span> GCD
<span class="py-prompt">>>> </span><span class="py-keyword">from</span> Crypto.Hash <span class="py-keyword">import</span> SHA
<span class="py-prompt">>>></span>
<span class="py-prompt">>>> </span>message = <span class="py-string">"Hello"</span>
<span class="py-prompt">>>> </span>key = ElGamal.generate(1024, Random.new().read)
<span class="py-prompt">>>> </span>h = SHA.new(message).digest()
<span class="py-prompt">>>> </span>while 1:
<span class="py-prompt">>>> </span> k = random.StrongRandom().randint(1,key.p-1)
<span class="py-prompt">>>> </span> <span class="py-keyword">if</span> GCD(k,key.p-1)==1: break
<span class="py-prompt">>>> </span>sig = key.sign(h,k)
<span class="py-prompt">>>> </span>...
<span class="py-prompt">>>> </span><span class="py-keyword">if</span> key.verify(h,sig):
<span class="py-prompt">>>> </span> <span class="py-keyword">print</span> <span class="py-string">"OK"</span>
<span class="py-prompt">>>> </span><span class="py-keyword">else</span>:
<span class="py-prompt">>>> </span> <span class="py-keyword">print</span> <span class="py-string">"Incorrect signature"</span></pre>
</blockquote>
</div>
<!-- ==================== CLASSES ==================== -->
<a name="section-Classes"></a>
<table class="summary" border="1" cellpadding="3"
cellspacing="0" width="100%" bgcolor="white">
<tr bgcolor="#70b0f0" class="table-header">
<td align="left" colspan="2" class="table-header">
<span class="table-header">Classes</span></td>
</tr>
<tr>
<td width="15%" align="right" valign="top" class="summary">
<span class="summary-type"> </span>
</td><td class="summary">
<a href="Crypto.PublicKey.ElGamal.error-class.html" class="summary-name">error</a>
</td>
</tr>
<tr>
<td width="15%" align="right" valign="top" class="summary">
<span class="summary-type"> </span>
</td><td class="summary">
<a href="Crypto.PublicKey.ElGamal.ElGamalobj-class.html" class="summary-name">ElGamalobj</a><br />
Class defining an ElGamal key.
</td>
</tr>
</table>
<!-- ==================== FUNCTIONS ==================== -->
<a name="section-Functions"></a>
<table class="summary" border="1" cellpadding="3"
cellspacing="0" width="100%" bgcolor="white">
<tr bgcolor="#70b0f0" class="table-header">
<td align="left" colspan="2" class="table-header">
<span class="table-header">Functions</span></td>
</tr>
<tr>
<td width="15%" align="right" valign="top" class="summary">
<span class="summary-type"> </span>
</td><td class="summary">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td><span class="summary-sig"><a href="Crypto.PublicKey.ElGamal-module.html#generate" class="summary-sig-name">generate</a>(<span class="summary-sig-arg">bits</span>,
<span class="summary-sig-arg">randfunc</span>,
<span class="summary-sig-arg">progress_func</span>=<span class="summary-sig-default">None</span>)</span><br />
Randomly generate a fresh, new ElGamal key.</td>
<td align="right" valign="top">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="15%" align="right" valign="top" class="summary">
<span class="summary-type"> </span>
</td><td class="summary">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td><span class="summary-sig"><a href="Crypto.PublicKey.ElGamal-module.html#construct" class="summary-sig-name">construct</a>(<span class="summary-sig-arg">tup</span>)</span><br />
Construct an ElGamal key from a tuple of valid ElGamal components.</td>
<td align="right" valign="top">
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- ==================== FUNCTION DETAILS ==================== -->
<a name="section-FunctionDetails"></a>
<table class="details" border="1" cellpadding="3"
cellspacing="0" width="100%" bgcolor="white">
<tr bgcolor="#70b0f0" class="table-header">
<td align="left" colspan="2" class="table-header">
<span class="table-header">Function Details</span></td>
</tr>
</table>
<a name="generate"></a>
<div>
<table class="details" border="1" cellpadding="3"
cellspacing="0" width="100%" bgcolor="white">
<tr><td>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr valign="top"><td>
<h3 class="epydoc"><span class="sig"><span class="sig-name">generate</span>(<span class="sig-arg">bits</span>,
<span class="sig-arg">randfunc</span>,
<span class="sig-arg">progress_func</span>=<span class="sig-default">None</span>)</span>
</h3>
</td><td align="right" valign="top"
>
</td>
</tr></table>
<p>Randomly generate a fresh, new ElGamal key.</p>
<p>The key will be safe for use for both encryption and signature
(although it should be used for <strong>only one</strong> purpose).</p>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
<li><strong class="pname"><code>bits</code></strong> (int) - Key length, or size (in bits) of the modulus <em>p</em>.
Recommended value is 2048.</li>
<li><strong class="pname"><code>randfunc</code></strong> (callable) - Random number generation function; it should accept
a single integer N and return a string of random data
N bytes long.</li>
<li><strong class="pname"><code>progress_func</code></strong> (callable) - Optional function that will be called with a short string
containing the key parameter currently being generated;
it's useful for interactive applications where a user is
waiting for a key to be generated.</li>
</ul></dd>
<dt>Returns:</dt>
<dd>An ElGamal key object (<a href="Crypto.PublicKey.ElGamal.ElGamalobj-class.html" class="link">ElGamalobj</a>).</dd>
</dl>
<div class="fields"> <p><strong>Attention:</strong>
You should always use a cryptographically secure random number generator,
such as the one defined in the <tt class="rst-docutils literal">Crypto.Random</tt> module; <strong>don't</strong> just use the
current time and the <tt class="rst-docutils literal">random</tt> module.
</p>
</div></td></tr></table>
</div>
<a name="construct"></a>
<div>
<table class="details" border="1" cellpadding="3"
cellspacing="0" width="100%" bgcolor="white">
<tr><td>
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr valign="top"><td>
<h3 class="epydoc"><span class="sig"><span class="sig-name">construct</span>(<span class="sig-arg">tup</span>)</span>
</h3>
</td><td align="right" valign="top"
>
</td>
</tr></table>
<p>Construct an ElGamal key from a tuple of valid ElGamal components.</p>
<p>The modulus <em>p</em> must be a prime.</p>
<p>The following conditions must apply:</p>
<ul class="rst-simple">
<li>1 < g < p-1</li>
<li>g^{p-1} = 1 mod p</li>
<li>1 < x < p-1</li>
<li>g^x = y mod p</li>
</ul>
<dl class="fields">
<dt>Parameters:</dt>
<dd><ul class="nomargin-top">
<li><p><strong class="pname"><code>tup</code></strong> (tuple) - A tuple of long integers, with 3 or 4 items
in the following order:</p>
<ol class="rst-arabic simple">
<li>Modulus (<em>p</em>).</li>
<li>Generator (<em>g</em>).</li>
<li>Public key (<em>y</em>).</li>
<li>Private key (<em>x</em>). Optional.</li>
</ol></li>
</ul></dd>
<dt>Returns:</dt>
<dd>An ElGamal key object (<a href="Crypto.PublicKey.ElGamal.ElGamalobj-class.html" class="link">ElGamalobj</a>).</dd>
</dl>
</td></tr></table>
</div>
<br />
<!-- ==================== NAVIGATION BAR ==================== -->
<table class="navbar" border="0" width="100%" cellpadding="0"
bgcolor="#a0c0ff" cellspacing="0">
<tr valign="middle">
<!-- Home link -->
<th> <a
href="Crypto-module.html">Home</a> </th>
<!-- Tree link -->
<th> <a
href="module-tree.html">Trees</a> </th>
<!-- Index link -->
<th> <a
href="identifier-index.html">Indices</a> </th>
<!-- Help link -->
<th> <a
href="help.html">Help</a> </th>
<!-- Project homepage -->
<th class="navbar" align="right" width="100%">
<table border="0" cellpadding="0" cellspacing="0">
<tr><th class="navbar" align="center"
><a href="http://www.pycrypto.org/">PyCrypto.org</a></th>
</tr></table></th>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%%">
<tr>
<td align="left" class="footer">
Generated by Epydoc 3.0.1 on Fri Mar 30 15:40:57 2018
</td>
<td align="right" class="footer">
<a target="mainFrame" href="http://epydoc.sourceforge.net"
>http://epydoc.sourceforge.net</a>
</td>
</tr>
</table>
<script type="text/javascript">
<!--
// Private objects are initially displayed (because if
// javascript is turned off then we want them to be
// visible); but by default, we want to hide them. So hide
// them unless we have a cookie that says to show them.
checkCookie();
// -->
</script>
</body>
</html>
|