⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
00130         {00131                 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Signer signer(*<span class="keyword">this</span>);00132                 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Verifier verifier(signer);00133                 SignaturePairwiseConsistencyTest(signer, verifier);00134 00135                 <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;OAEP&lt;SHA&gt;</a> &gt;::Decryptor decryptor(*<span class="keyword">this</span>);00136                 <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;OAEP&lt;SHA&gt;</a> &gt;::Encryptor encryptor(decryptor);00137                 EncryptionPairwiseConsistencyTest(encryptor, decryptor);00138         }00139 }00140 00141 <span class="keywordtype">void</span> InvertibleRSAFunction::Initialize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keybits, <span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;e)00142 {00143         <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona8">GenerateRandom</a>(rng, MakeParameters(<span class="stringliteral">"ModulusSize"</span>, (<span class="keywordtype">int</span>)keybits)(<span class="stringliteral">"PublicExponent"</span>, e+e.IsEven()));00144 }00145 00146 <span class="keywordtype">void</span> InvertibleRSAFunction::BERDecodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00147 {00148         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> privateKey(bt);00149                 word32 version;00150                 BERDecodeUnsigned&lt;word32&gt;(privateKey, version, INTEGER, 0, 0);  <span class="comment">// check version</span>00151                 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00152                 m_e.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00153                 m_d.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00154                 m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00155                 m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00156                 m_dp.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00157                 m_dq.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00158                 m_u.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(privateKey);00159         privateKey.MessageEnd();00160 }00161 00162 <span class="keywordtype">void</span> InvertibleRSAFunction::DEREncodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00163 <span class="keyword"></span>{00164         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> privateKey(bt);00165                 DEREncodeUnsigned&lt;word32&gt;(privateKey, 0);       <span class="comment">// version</span>00166                 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00167                 m_e.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00168                 m_d.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00169                 m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00170                 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00171                 m_dp.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00172                 m_dq.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00173                 m_u.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(privateKey);00174         privateKey.MessageEnd();00175 }00176 00177 <a class="code" href="class_integer.html">Integer</a> InvertibleRSAFunction::CalculateInverse(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;x)<span class="keyword"> const </span>00178 <span class="keyword"></span>{00179         DoQuickSanityCheck();00180         <a class="code" href="class_modular_arithmetic.html">ModularArithmetic</a> modn(m_n);00181         <a class="code" href="class_integer.html">Integer</a> r, rInv;00182         <span class="comment">// seed rng with private key and ciphertext</span>00183         <a class="code" href="class_random_pool.html">RandomPool</a> rng;00184         m_d.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(rng);00185         x.DEREncode(rng);00186         <span class="keywordflow">do</span> {    <span class="comment">// do this loop for people using small numbers for testing</span>00187                 r.<a class="code" href="class_integer.html#_integerz43_10">Randomize</a>(rng, Integer::One(), m_n - Integer::One());00188                 rInv = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica25">MultiplicativeInverse</a>(r);00189         } <span class="keywordflow">while</span> (rInv.<a class="code" href="class_integer.html#_integerz41_8">IsZero</a>());00190         <a class="code" href="class_integer.html">Integer</a> re = modn.<a class="code" href="class_abstract_ring.html#_euclidean_domain_ofa18">Exponentiate</a>(r, m_e);00191         re = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica22">Multiply</a>(re, x);                      <span class="comment">// blind</span>00192         <span class="comment">// here we follow the notation of PKCS #1 and let u=q inverse mod p</span>00193         <span class="comment">// but in ModRoot, u=p inverse mod q, so we reverse the order of p and q</span>00194         <a class="code" href="class_integer.html">Integer</a> y = ModularRoot(re, m_dq, m_dp, m_q, m_p, m_u);00195         y = modn.<a class="code" href="class_modular_arithmetic.html#_modular_arithmetica22">Multiply</a>(y, rInv);                             <span class="comment">// unblind</span>00196         <span class="keywordflow">if</span> (modn.<a class="code" href="class_abstract_ring.html#_euclidean_domain_ofa18">Exponentiate</a>(y, m_e) != x)             <span class="comment">// check</span>00197                 <span class="keywordflow">throw</span> <a class="code" href="class_exception.html">Exception</a>(Exception::OTHER_ERROR, <span class="stringliteral">"InvertibleRSAFunction: computational error during private key operation"</span>);00198         <span class="keywordflow">return</span> y;00199 }00200 <a name="l00201"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona7">00201</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona7">InvertibleRSAFunction::Validate</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>00202 <span class="keyword"></span>{00203         <span class="keywordtype">bool</span> pass = <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona4">RSAFunction::Validate</a>(rng, level);00204         pass = pass &amp;&amp; m_p &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_p &lt; m_n;00205         pass = pass &amp;&amp; m_q &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_q &lt; m_n;00206         pass = pass &amp;&amp; m_d &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_d.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_d &lt; m_n;00207         pass = pass &amp;&amp; m_dp &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_dp.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_dp &lt; m_p;00208         pass = pass &amp;&amp; m_dq &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_dq.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_dq &lt; m_q;00209         pass = pass &amp;&amp; m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() &amp;&amp; m_u &lt; m_p;00210         <span class="keywordflow">if</span> (level &gt;= 1)00211         {00212                 pass = pass &amp;&amp; m_p * m_q == m_n;00213                 pass = pass &amp;&amp; m_e*m_d % LCM(m_p-1, m_q-1) == 1;00214                 pass = pass &amp;&amp; m_dp == m_d%(m_p-1) &amp;&amp; m_dq == m_d%(m_q-1);00215                 pass = pass &amp;&amp; m_u * m_q % m_p == 1;00216         }00217         <span class="keywordflow">if</span> (level &gt;= 2)00218                 pass = pass &amp;&amp; VerifyPrime(rng, m_p, level-2) &amp;&amp; VerifyPrime(rng, m_q, level-2);00219         <span class="keywordflow">return</span> pass;00220 }00221 <a name="l00222"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona9">00222</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona9">InvertibleRSAFunction::GetVoidValue</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>00223 <span class="keyword"></span>{00224         <span class="keywordflow">return</span> GetValueHelper&lt;RSAFunction&gt;(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00225                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00226                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00227                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a17">PrivateExponent</a>)00228                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a26">ModPrime1PrivateExponent</a>)00229                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a27">ModPrime2PrivateExponent</a>)00230                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00231                 ;00232 }00233 <a name="l00234"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona10">00234</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona10">InvertibleRSAFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;source)00235 {00236         AssignFromHelper&lt;RSAFunction&gt;(<span class="keyword">this</span>, source)00237                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00238                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00239                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a17">PrivateExponent</a>)00240                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a26">ModPrime1PrivateExponent</a>)00241                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a27">ModPrime2PrivateExponent</a>)00242                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00243                 ;00244 }00245 00246 <span class="preprocessor">#endif</span>00247 <span class="preprocessor"></span>00248 <span class="comment">/*</span>00249 <span class="comment">bool RSAFunctionInverse_NonCRT::Validate(RandomNumberGenerator &amp;rng, unsigned int level) const</span>00250 <span class="comment">{</span>00251 <span class="comment">        bool pass = true;</span>00252 <span class="comment">        pass = pass &amp;&amp; m_n &gt; Integer::One() &amp;&amp; m_n.IsOdd();</span>00253 <span class="comment">        pass = pass &amp;&amp; m_d &gt; Integer::One() &amp;&amp; m_d.IsOdd() &amp;&amp; m_d &lt; m_n;</span>00254 <span class="comment">        return pass;</span>00255 <span class="comment">}</span>00256 <span class="comment">*/</span>00257 00258 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:24 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -