📄 blumshub_8cpp-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>Crypto++: blumshub.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.5.2 --><div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="namespaces.html"><span>Namespaces</span></a></li> <li><a href="classes.html"><span>Classes</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> </ul></div><div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>File Members</span></a></li> </ul></div><h1>blumshub.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// blumshub.cpp - written and placed in the public domain by Wei Dai</span><a name="l00002"></a>00002 <a name="l00003"></a>00003 <span class="preprocessor">#include "pch.h"</span><a name="l00004"></a>00004 <span class="preprocessor">#include "blumshub.h"</span><a name="l00005"></a>00005 <a name="l00006"></a>00006 NAMESPACE_BEGIN(CryptoPP)<a name="l00007"></a>00007 <a name="l00008"></a><a class="code" href="class_public_blum_blum_shub.html#24c3820f9c8b8c041dd2cac44bbefae5">00008</a> <a class="code" href="class_public_blum_blum_shub.html" title="BlumBlumShub without factorization of the modulus.">PublicBlumBlumShub</a>::<a class="code" href="class_public_blum_blum_shub.html" title="BlumBlumShub without factorization of the modulus.">PublicBlumBlumShub</a>(const <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &n, const <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &seed)<a name="l00009"></a>00009 : modn(n),<a name="l00010"></a>00010 maxBits(BitPrecision(n.BitCount())-1)<a name="l00011"></a>00011 {<a name="l00012"></a>00012 current = modn.Square(modn.Square(seed));<a name="l00013"></a>00013 bitsLeft = maxBits;<a name="l00014"></a>00014 }<a name="l00015"></a>00015 <a name="l00016"></a><a class="code" href="class_public_blum_blum_shub.html#6871d5e2ba162f32574d6b43e2473286">00016</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_public_blum_blum_shub.html#6871d5e2ba162f32574d6b43e2473286" title="generate new random bit and return it">PublicBlumBlumShub::GenerateBit</a>()<a name="l00017"></a>00017 {<a name="l00018"></a>00018 <span class="keywordflow">if</span> (<a class="code" href="class_public_blum_blum_shub.html#910cdec6f2473f08a1a7d06ec41c12af">bitsLeft</a>==0)<a name="l00019"></a>00019 {<a name="l00020"></a>00020 <a class="code" href="class_public_blum_blum_shub.html#060f64661986ffee95b4ec13107cb363">current</a> = <a class="code" href="class_public_blum_blum_shub.html#60712ac102ff230738ea09fe7e141d89">modn</a>.<a class="code" href="class_modular_arithmetic.html#c378a2527fe2107d3379bc35d7cd0487">Square</a>(<a class="code" href="class_public_blum_blum_shub.html#060f64661986ffee95b4ec13107cb363">current</a>);<a name="l00021"></a>00021 <a class="code" href="class_public_blum_blum_shub.html#910cdec6f2473f08a1a7d06ec41c12af">bitsLeft</a> = <a class="code" href="class_public_blum_blum_shub.html#45e5b885b73eef60d42220504e151701">maxBits</a>;<a name="l00022"></a>00022 }<a name="l00023"></a>00023 <a name="l00024"></a>00024 <span class="keywordflow">return</span> <a class="code" href="class_public_blum_blum_shub.html#060f64661986ffee95b4ec13107cb363">current</a>.<a class="code" href="class_integer.html#0e377d23bde55fc7dc6ea2208c587d19" title="return the i-th bit, i=0 being the least significant bit">GetBit</a>(--<a class="code" href="class_public_blum_blum_shub.html#910cdec6f2473f08a1a7d06ec41c12af">bitsLeft</a>);<a name="l00025"></a>00025 }<a name="l00026"></a>00026 <a name="l00027"></a><a class="code" href="class_public_blum_blum_shub.html#aeb3ba6a07fe0a67d35c4fb84bfc71cf">00027</a> byte <a class="code" href="class_public_blum_blum_shub.html#aeb3ba6a07fe0a67d35c4fb84bfc71cf" title="generate new random byte and return it">PublicBlumBlumShub::GenerateByte</a>()<a name="l00028"></a>00028 {<a name="l00029"></a>00029 byte b=0;<a name="l00030"></a>00030 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=0; i<8; i++)<a name="l00031"></a>00031 b = (b << 1) | <a class="code" href="class_public_blum_blum_shub.html#6871d5e2ba162f32574d6b43e2473286" title="generate new random bit and return it">PublicBlumBlumShub::GenerateBit</a>();<a name="l00032"></a>00032 <span class="keywordflow">return</span> b;<a name="l00033"></a>00033 }<a name="l00034"></a>00034 <a name="l00035"></a><a class="code" href="class_public_blum_blum_shub.html#8301fb046b5954854ec9635ae16f615b">00035</a> <span class="keywordtype">void</span> <a class="code" href="class_public_blum_blum_shub.html#8301fb046b5954854ec9635ae16f615b" title="generate random array of bytes">PublicBlumBlumShub::GenerateBlock</a>(byte *output, <span class="keywordtype">size_t</span> size)<a name="l00036"></a>00036 {<a name="l00037"></a>00037 <span class="keywordflow">while</span> (size--)<a name="l00038"></a>00038 *output++ = <a class="code" href="class_public_blum_blum_shub.html#aeb3ba6a07fe0a67d35c4fb84bfc71cf" title="generate new random byte and return it">PublicBlumBlumShub::GenerateByte</a>();<a name="l00039"></a>00039 }<a name="l00040"></a>00040 <a name="l00041"></a><a class="code" href="class_public_blum_blum_shub.html#fb03a58653cb83c9a9013f3a57105bfc">00041</a> <span class="keywordtype">void</span> <a class="code" href="class_public_blum_blum_shub.html#fb03a58653cb83c9a9013f3a57105bfc" title="encrypt or decrypt an array of bytes of specified length">PublicBlumBlumShub::ProcessData</a>(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length)<a name="l00042"></a>00042 {<a name="l00043"></a>00043 <span class="keywordflow">while</span> (length--)<a name="l00044"></a>00044 *outString++ = *inString++ ^ <a class="code" href="class_public_blum_blum_shub.html#aeb3ba6a07fe0a67d35c4fb84bfc71cf" title="generate new random byte and return it">PublicBlumBlumShub::GenerateByte</a>();<a name="l00045"></a>00045 }<a name="l00046"></a>00046 <a name="l00047"></a><a class="code" href="class_blum_blum_shub.html#b53b99f246235429694719d41e00b658">00047</a> <a class="code" href="class_blum_blum_shub.html#b53b99f246235429694719d41e00b658">BlumBlumShub::BlumBlumShub</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &p, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &q, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &seed)<a name="l00048"></a>00048 : <a class="code" href="class_public_blum_blum_shub.html" title="BlumBlumShub without factorization of the modulus.">PublicBlumBlumShub</a>(p*q, seed),<a name="l00049"></a>00049 p(p), q(q),<a name="l00050"></a>00050 x0(<a class="code" href="class_public_blum_blum_shub.html#60712ac102ff230738ea09fe7e141d89">modn</a>.<a class="code" href="class_square.html" title="Square">Square</a>(seed))<a name="l00051"></a>00051 {<a name="l00052"></a>00052 }<a name="l00053"></a>00053 <a name="l00054"></a><a class="code" href="class_blum_blum_shub.html#e29af38d625e72bc5e503db157a84c5f">00054</a> <span class="keywordtype">void</span> <a class="code" href="class_blum_blum_shub.html#e29af38d625e72bc5e503db157a84c5f" title="for random access ciphers, seek to an absolute position">BlumBlumShub::Seek</a>(lword index)<a name="l00055"></a>00055 {<a name="l00056"></a>00056 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> i(<a class="code" href="class_integer.html#e0d4d9975fb6ab7667aab6f7ab8612d2d10299fe0b190d3de927db776b8dc42d">Integer::POSITIVE</a>, index);<a name="l00057"></a>00057 i *= 8;<a name="l00058"></a>00058 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> e = a_exp_b_mod_c (2, i / <a class="code" href="class_public_blum_blum_shub.html#45e5b885b73eef60d42220504e151701">maxBits</a> + 1, (<a class="code" href="class_blum_blum_shub.html#ea41f47a0b2fc6c05a80b3a59857e70b">p</a>-1)*(<a class="code" href="class_blum_blum_shub.html#ec0407cb51a5edac638ad7acc8380577">q</a>-1));<a name="l00059"></a>00059 <a class="code" href="class_public_blum_blum_shub.html#060f64661986ffee95b4ec13107cb363">current</a> = <a class="code" href="class_public_blum_blum_shub.html#60712ac102ff230738ea09fe7e141d89">modn</a>.<a class="code" href="class_abstract_ring.html#0f011366054a4edb80be92f968083538">Exponentiate</a>(<a class="code" href="class_blum_blum_shub.html#3a402876633f8a93a59eb862a6e1f6ee">x0</a>, e);<a name="l00060"></a>00060 <a class="code" href="class_public_blum_blum_shub.html#910cdec6f2473f08a1a7d06ec41c12af">bitsLeft</a> = <a class="code" href="class_public_blum_blum_shub.html#45e5b885b73eef60d42220504e151701">maxBits</a> - i % <a class="code" href="class_public_blum_blum_shub.html#45e5b885b73eef60d42220504e151701">maxBits</a>;<a name="l00061"></a>00061 }<a name="l00062"></a>00062 <a name="l00063"></a>00063 NAMESPACE_END</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:19 2007 for Crypto++ by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -