<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>langui.sh &#187; python</title>
	<atom:link href="http://langui.sh/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://langui.sh</link>
	<description>Fun hacks, WP plugins, photography, and PKI junk.  Languishing since 2008.</description>
	<lastBuildDate>Tue, 17 Jan 2012 20:23:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Generating (Very) Large Primes</title>
		<link>http://langui.sh/2009/03/07/generating-very-large-primes/</link>
		<comments>http://langui.sh/2009/03/07/generating-very-large-primes/#comments</comments>
		<pubDate>Sun, 08 Mar 2009 01:02:09 +0000</pubDate>
		<dc:creator>Paul Kehrer</dc:creator>
				<category><![CDATA[Posts]]></category>
		<category><![CDATA[crypto]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ssl]]></category>

		<guid isPermaLink="false">http://langui.sh/?p=167</guid>
		<description><![CDATA[<a href="http://langui.sh/2009/03/07/generating-very-large-primes/" title="Generating (Very) Large Primes"></a>Have you ever wondered how big the &#8220;large primes&#8221; that RSA encryption is based on really are? What exactly does a &#8220;1024-bit&#8221; key mean anyway? And if the difficulty of RSA is partially based on factoring large numbers, how do &#8230;<p class="read-more"><a href="http://langui.sh/2009/03/07/generating-very-large-primes/">Read more &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<a href="http://langui.sh/2009/03/07/generating-very-large-primes/" title="Generating (Very) Large Primes"></a><p>Have you ever wondered how big the &#8220;large primes&#8221; that RSA encryption is based on really are?  What exactly does a &#8220;1024-bit&#8221; key mean anyway?  And if the difficulty of RSA is partially based on <a href="http://en.wikipedia.org/wiki/Integer_factorization" target="_blank">factoring large numbers</a>, how do we create these large primes without determining primality via factorization?</p>
<p>The easiest way to demonstrate these concepts is with a simple script, so let&#8217;s take a look at a large random number generator I wrote<sup class='footnote'><a href='#fn-167-1' id='fnref-167-1'>1</a></sup> using Python.  As is typical for this blog, you&#8217;ll note that the random numbers are not cryptographically secure.  To make these examples simple I don&#8217;t want to introduce external dependencies, but please keep that issue in mind for any serious applications of the code presented here.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> rabinMiller<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:
     s = n-<span style="color: #ff4500;">1</span>
     t = <span style="color: #ff4500;">0</span>
     <span style="color: #ff7700;font-weight:bold;">while</span> s<span style="color: #66cc66;">&amp;</span><span style="color: #ff4500;">1</span> == <span style="color: #ff4500;">0</span>:
         s = s/<span style="color: #ff4500;">2</span>
         t +=<span style="color: #ff4500;">1</span>
     k = <span style="color: #ff4500;">0</span>
     <span style="color: #ff7700;font-weight:bold;">while</span> k<span style="color: #66cc66;">&lt;</span><span style="color: #ff4500;">128</span>:
         a = <span style="color: #dc143c;">random</span>.<span style="color: black;">randrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>,n-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
         <span style="color: #808080; font-style: italic;">#a^s is computationally infeasible.  we need a more intelligent approach</span>
         <span style="color: #808080; font-style: italic;">#v = (a**s)%n</span>
         <span style="color: #808080; font-style: italic;">#python's core math module can do modular exponentiation</span>
         v = <span style="color: #008000;">pow</span><span style="color: black;">&#40;</span>a,s,n<span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#where values are (num,exp,mod)</span>
         <span style="color: #ff7700;font-weight:bold;">if</span> v <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">1</span>:
             i=<span style="color: #ff4500;">0</span>
             <span style="color: #ff7700;font-weight:bold;">while</span> v <span style="color: #66cc66;">!</span>= <span style="color: black;">&#40;</span>n-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
                 <span style="color: #ff7700;font-weight:bold;">if</span> i == t-<span style="color: #ff4500;">1</span>:
                     <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
                 <span style="color: #ff7700;font-weight:bold;">else</span>:
                     i = i+<span style="color: #ff4500;">1</span>
                     v = <span style="color: black;">&#40;</span>v<span style="color: #66cc66;">**</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">%</span>n
         k+=<span style="color: #ff4500;">2</span>
     <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> isPrime<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>:
     <span style="color: #808080; font-style: italic;">#lowPrimes is all primes (sans 2, which is covered by the bitwise and operator) </span>
     <span style="color: #808080; font-style: italic;">#under 1000. taking n modulo each lowPrime allows us to remove a huge chunk </span>
     <span style="color: #808080; font-style: italic;">#of composite numbers from our potential pool without resorting to Rabin-Miller</span>
     lowPrimes =   <span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span>,<span style="color: #ff4500;">5</span>,<span style="color: #ff4500;">7</span>,<span style="color: #ff4500;">11</span>,<span style="color: #ff4500;">13</span>,<span style="color: #ff4500;">17</span>,<span style="color: #ff4500;">19</span>,<span style="color: #ff4500;">23</span>,<span style="color: #ff4500;">29</span>,<span style="color: #ff4500;">31</span>,<span style="color: #ff4500;">37</span>,<span style="color: #ff4500;">41</span>,<span style="color: #ff4500;">43</span>,<span style="color: #ff4500;">47</span>,<span style="color: #ff4500;">53</span>,<span style="color: #ff4500;">59</span>,<span style="color: #ff4500;">61</span>,<span style="color: #ff4500;">67</span>,<span style="color: #ff4500;">71</span>,<span style="color: #ff4500;">73</span>,<span style="color: #ff4500;">79</span>,<span style="color: #ff4500;">83</span>,<span style="color: #ff4500;">89</span>,<span style="color: #ff4500;">97</span>
                   ,<span style="color: #ff4500;">101</span>,<span style="color: #ff4500;">103</span>,<span style="color: #ff4500;">107</span>,<span style="color: #ff4500;">109</span>,<span style="color: #ff4500;">113</span>,<span style="color: #ff4500;">127</span>,<span style="color: #ff4500;">131</span>,<span style="color: #ff4500;">137</span>,<span style="color: #ff4500;">139</span>,<span style="color: #ff4500;">149</span>,<span style="color: #ff4500;">151</span>,<span style="color: #ff4500;">157</span>,<span style="color: #ff4500;">163</span>,<span style="color: #ff4500;">167</span>,<span style="color: #ff4500;">173</span>,<span style="color: #ff4500;">179</span>
                   ,<span style="color: #ff4500;">181</span>,<span style="color: #ff4500;">191</span>,<span style="color: #ff4500;">193</span>,<span style="color: #ff4500;">197</span>,<span style="color: #ff4500;">199</span>,<span style="color: #ff4500;">211</span>,<span style="color: #ff4500;">223</span>,<span style="color: #ff4500;">227</span>,<span style="color: #ff4500;">229</span>,<span style="color: #ff4500;">233</span>,<span style="color: #ff4500;">239</span>,<span style="color: #ff4500;">241</span>,<span style="color: #ff4500;">251</span>,<span style="color: #ff4500;">257</span>,<span style="color: #ff4500;">263</span>,<span style="color: #ff4500;">269</span>
                   ,<span style="color: #ff4500;">271</span>,<span style="color: #ff4500;">277</span>,<span style="color: #ff4500;">281</span>,<span style="color: #ff4500;">283</span>,<span style="color: #ff4500;">293</span>,<span style="color: #ff4500;">307</span>,<span style="color: #ff4500;">311</span>,<span style="color: #ff4500;">313</span>,<span style="color: #ff4500;">317</span>,<span style="color: #ff4500;">331</span>,<span style="color: #ff4500;">337</span>,<span style="color: #ff4500;">347</span>,<span style="color: #ff4500;">349</span>,<span style="color: #ff4500;">353</span>,<span style="color: #ff4500;">359</span>,<span style="color: #ff4500;">367</span>
                   ,<span style="color: #ff4500;">373</span>,<span style="color: #ff4500;">379</span>,<span style="color: #ff4500;">383</span>,<span style="color: #ff4500;">389</span>,<span style="color: #ff4500;">397</span>,<span style="color: #ff4500;">401</span>,<span style="color: #ff4500;">409</span>,<span style="color: #ff4500;">419</span>,<span style="color: #ff4500;">421</span>,<span style="color: #ff4500;">431</span>,<span style="color: #ff4500;">433</span>,<span style="color: #ff4500;">439</span>,<span style="color: #ff4500;">443</span>,<span style="color: #ff4500;">449</span>,<span style="color: #ff4500;">457</span>,<span style="color: #ff4500;">461</span>
                   ,<span style="color: #ff4500;">463</span>,<span style="color: #ff4500;">467</span>,<span style="color: #ff4500;">479</span>,<span style="color: #ff4500;">487</span>,<span style="color: #ff4500;">491</span>,<span style="color: #ff4500;">499</span>,<span style="color: #ff4500;">503</span>,<span style="color: #ff4500;">509</span>,<span style="color: #ff4500;">521</span>,<span style="color: #ff4500;">523</span>,<span style="color: #ff4500;">541</span>,<span style="color: #ff4500;">547</span>,<span style="color: #ff4500;">557</span>,<span style="color: #ff4500;">563</span>,<span style="color: #ff4500;">569</span>,<span style="color: #ff4500;">571</span>
                   ,<span style="color: #ff4500;">577</span>,<span style="color: #ff4500;">587</span>,<span style="color: #ff4500;">593</span>,<span style="color: #ff4500;">599</span>,<span style="color: #ff4500;">601</span>,<span style="color: #ff4500;">607</span>,<span style="color: #ff4500;">613</span>,<span style="color: #ff4500;">617</span>,<span style="color: #ff4500;">619</span>,<span style="color: #ff4500;">631</span>,<span style="color: #ff4500;">641</span>,<span style="color: #ff4500;">643</span>,<span style="color: #ff4500;">647</span>,<span style="color: #ff4500;">653</span>,<span style="color: #ff4500;">659</span>,<span style="color: #ff4500;">661</span>
                   ,<span style="color: #ff4500;">673</span>,<span style="color: #ff4500;">677</span>,<span style="color: #ff4500;">683</span>,<span style="color: #ff4500;">691</span>,<span style="color: #ff4500;">701</span>,<span style="color: #ff4500;">709</span>,<span style="color: #ff4500;">719</span>,<span style="color: #ff4500;">727</span>,<span style="color: #ff4500;">733</span>,<span style="color: #ff4500;">739</span>,<span style="color: #ff4500;">743</span>,<span style="color: #ff4500;">751</span>,<span style="color: #ff4500;">757</span>,<span style="color: #ff4500;">761</span>,<span style="color: #ff4500;">769</span>,<span style="color: #ff4500;">773</span>
                   ,<span style="color: #ff4500;">787</span>,<span style="color: #ff4500;">797</span>,<span style="color: #ff4500;">809</span>,<span style="color: #ff4500;">811</span>,<span style="color: #ff4500;">821</span>,<span style="color: #ff4500;">823</span>,<span style="color: #ff4500;">827</span>,<span style="color: #ff4500;">829</span>,<span style="color: #ff4500;">839</span>,<span style="color: #ff4500;">853</span>,<span style="color: #ff4500;">857</span>,<span style="color: #ff4500;">859</span>,<span style="color: #ff4500;">863</span>,<span style="color: #ff4500;">877</span>,<span style="color: #ff4500;">881</span>,<span style="color: #ff4500;">883</span>
                   ,<span style="color: #ff4500;">887</span>,<span style="color: #ff4500;">907</span>,<span style="color: #ff4500;">911</span>,<span style="color: #ff4500;">919</span>,<span style="color: #ff4500;">929</span>,<span style="color: #ff4500;">937</span>,<span style="color: #ff4500;">941</span>,<span style="color: #ff4500;">947</span>,<span style="color: #ff4500;">953</span>,<span style="color: #ff4500;">967</span>,<span style="color: #ff4500;">971</span>,<span style="color: #ff4500;">977</span>,<span style="color: #ff4500;">983</span>,<span style="color: #ff4500;">991</span>,<span style="color: #ff4500;">997</span><span style="color: black;">&#93;</span>
     <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>n <span style="color: #66cc66;">&gt;</span>= <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
         <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>n<span style="color: #66cc66;">&amp;</span><span style="color: #ff4500;">1</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
             <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> lowPrimes:
                 <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>n <span style="color: #66cc66;">%</span> p == <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
                     <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
             <span style="color: #ff7700;font-weight:bold;">return</span> rabinMiller<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span>
     <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> generateLargePrime<span style="color: black;">&#40;</span>k<span style="color: black;">&#41;</span>:
     <span style="color: #808080; font-style: italic;">#k is the desired bit length</span>
     r=<span style="color: #ff4500;">100</span><span style="color: #66cc66;">*</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">log</span><span style="color: black;">&#40;</span>k,<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>+<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;">#number of attempts max</span>
     r_ = r
     <span style="color: #ff7700;font-weight:bold;">while</span> r<span style="color: #66cc66;">&gt;</span><span style="color: #ff4500;">0</span>:
        <span style="color: #808080; font-style: italic;">#randrange is mersenne twister and is completely deterministic</span>
        <span style="color: #808080; font-style: italic;">#unusable for serious crypto purposes</span>
         n = <span style="color: #dc143c;">random</span>.<span style="color: black;">randrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: #66cc66;">**</span><span style="color: black;">&#40;</span>k-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>,<span style="color: #ff4500;">2</span><span style="color: #66cc66;">**</span><span style="color: black;">&#40;</span>k<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
         r-=<span style="color: #ff4500;">1</span>
         <span style="color: #ff7700;font-weight:bold;">if</span> isPrime<span style="color: black;">&#40;</span>n<span style="color: black;">&#41;</span> == <span style="color: #008000;">True</span>:
             <span style="color: #ff7700;font-weight:bold;">return</span> n
     <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;Failure after &quot;</span>+<span style="color: #66cc66;">`</span>r_<span style="color: #66cc66;">`</span> + <span style="color: #483d8b;">&quot; tries.&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> generateLargePrime<span style="color: black;">&#40;</span><span style="color: #ff4500;">1024</span><span style="color: black;">&#41;</span></pre></div></div>

<p>This code is very slow, but does not represent an entirely naïve approach.<sup class='footnote'><a href='#fn-167-2' id='fnref-167-2'>2</a></sup>  To generate a prime we first create a random integer in the range (2<sup>k-1</sup>,2<sup>k</sup>), then the following rules are applied:</p>
<ol>
<li>The number (n) must be &gt;=3.  While 2 is a prime number, for our purposes we have no interest in numbers less than 3.</li>
<li>Do a bitwise and (n&amp;1).  If the result is not 0 then we know the number is even and can throw it out.</li>
<li>Check that n%p is 0 (in other words, that n is not divisible evenly by p) for all primes &lt;1000.  This check will eliminate a large quantity of composite numbers and prevent the expense of the next test.</li>
<li>Finally we reach the core test: <a href="http://en.wikipedia.org/wiki/Miller–Rabin_primality_test">Rabin-Miller</a>.  This algorithm, if it returns true, states that there is a 75% chance that the number is prime (for the randomly chosen basis a).  To obtain a 2<sup>-128</sup> chance that the number is not prime, we must repeatedly run the Rabin-Miller test choosing different number bases.  Since each iteration of the test increases our probability by a power of 2 we must iterate 64 times to reach this confidence level.</li>
</ol>
<p> <br />
If the number passes all these tests it is returned as a valid prime number.  Of course, if you don&#8217;t trust the output from this script you can always check it with openssl&#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">openssl prime <span style="color: #000000;">7337488745629403488410174275830423641502142554560856136484326749638755396267050319392266204256751706077766067020335998122952792559058552724477442839630133</span>
8C18E5DC98684E2A15B84535635A95C4A192B73B40A780AB4CB0C58BDB9C31EF970C3AC6D804712B830FB6F1B140693A251E989F89B687EBA62781AD031D5135 is prime</pre></div></div>

<p> <a href="http://cdn.langui.sh/2009/03/8192_prime.txt" target="_blank">Click</a> for an example of an 8192-bit prime created with the generateLargePrime() function.  You can also check out a <a href="http://cdn.langui.sh/2009/03/1024_prime.txt" target="_blank">1024-bit prime</a> as well.  1024-bit keys are the minimum size recommended for end entity certificates using RSA (SSL certificates) at this time.<sup class='footnote'><a href='#fn-167-3' id='fnref-167-3'>3</a></sup></p>
<p>Of course, a large prime is nice, but it isn&#8217;t necessarily an RSA prime.  Look for another entry soon explaining the additional restrictions imposed by RSA.</p>
<div class='footnotes'>
<div class='footnotedivider'></div>
<ol>
<li id='fn-167-1'>This code is based on the pseudocode provided in <a href="http://www.amazon.com/Practical-Cryptography-Niels-Ferguson/dp/0471223573/ref=pd_bbs_sr_4?ie=UTF8&#038;s=books&#038;qid=1236471581&#038;sr=8-4" target="_blank">Practical Cryptography</a>. <span class='footnotereverse'><a href='#fnref-167-1'>&#8617;</a></span></li>
<li id='fn-167-2'>Generation of a 1024-bit prime using this script takes 5-10 seconds, whereas OpenSSL takes 0.1-0.2 seconds. <span class='footnotereverse'><a href='#fnref-167-2'>&#8617;</a></span></li>
<li id='fn-167-3'>NIST guidelines suggest migration to 2048-bit keys by 31 Dec 2010) <span class='footnotereverse'><a href='#fnref-167-3'>&#8617;</a></span></li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://langui.sh/2009/03/07/generating-very-large-primes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Database Caching 4/14 queries in 0.004 seconds using memcached
Object Caching 412/426 objects using memcached

Served from: langui.sh @ 2012-02-07 06:23:41 -->
