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

📄 rsa_8cpp-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="l00146"></a>00146 }<a name="l00147"></a>00147 <a name="l00148"></a><a class="code" href="class_invertible_r_s_a_function.html#82875d7b47505dc036005186c45dbde7">00148</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#1d400269a0d1305e93623299d8184e29">InvertibleRSAFunction::Initialize</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;n, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;e, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;d)<a name="l00149"></a>00149 {<a name="l00150"></a>00150         <span class="keywordflow">if</span> (n.<a class="code" href="class_integer.html#fedf9af097a3417d8bd3742ec53f9593">IsEven</a>() || e.<a class="code" href="class_integer.html#fedf9af097a3417d8bd3742ec53f9593">IsEven</a>() | d.<a class="code" href="class_integer.html#fedf9af097a3417d8bd3742ec53f9593">IsEven</a>())<a name="l00151"></a>00151                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: input is not a valid RSA private key"</span>);<a name="l00152"></a>00152 <a name="l00153"></a>00153         <a class="code" href="class_r_s_a_function.html#b2e89822414861cb312d52d8c7ac3017">m_n</a> = n;<a name="l00154"></a>00154         <a class="code" href="class_r_s_a_function.html#f6d15cdabeb084e9cdc7efb1bbdea783">m_e</a> = e;<a name="l00155"></a>00155         <a class="code" href="class_invertible_r_s_a_function.html#e6ebef334123434c80fd0d87dddea8c7">m_d</a> = d;<a name="l00156"></a>00156 <a name="l00157"></a>00157         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> r = --(d*e);<a name="l00158"></a>00158         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> s = 0;<a name="l00159"></a>00159         <span class="keywordflow">while</span> (r.<a class="code" href="class_integer.html#fedf9af097a3417d8bd3742ec53f9593">IsEven</a>())<a name="l00160"></a>00160         {<a name="l00161"></a>00161                 r &gt;&gt;= 1;<a name="l00162"></a>00162                 s++;<a name="l00163"></a>00163         }<a name="l00164"></a>00164 <a name="l00165"></a>00165         <a class="code" href="class_modular_arithmetic.html" title="ring of congruence classes modulo n">ModularArithmetic</a> modn(n);<a name="l00166"></a>00166         <span class="keywordflow">for</span> (<a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> i = 2; ; ++i)<a name="l00167"></a>00167         {<a name="l00168"></a>00168                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> a = modn.<a class="code" href="class_abstract_ring.html#0f011366054a4edb80be92f968083538">Exponentiate</a>(i, r);<a name="l00169"></a>00169                 <span class="keywordflow">if</span> (a == 1)<a name="l00170"></a>00170                         <span class="keywordflow">continue</span>;<a name="l00171"></a>00171                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> b;<a name="l00172"></a>00172                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j = 0;<a name="l00173"></a>00173                 <span class="keywordflow">while</span> (a != n-1)<a name="l00174"></a>00174                 {<a name="l00175"></a>00175                         b = modn.<a class="code" href="class_modular_arithmetic.html#c378a2527fe2107d3379bc35d7cd0487">Square</a>(a);<a name="l00176"></a>00176                         <span class="keywordflow">if</span> (b == 1)<a name="l00177"></a>00177                         {<a name="l00178"></a>00178                                 <a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a> = GCD(a-1, n);<a name="l00179"></a>00179                                 <a class="code" href="class_invertible_r_s_a_function.html#48b1e3c5cf1ba5ba83952d46708afaee">m_q</a> = n/<a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a>;<a name="l00180"></a>00180                                 <a class="code" href="class_invertible_r_s_a_function.html#665927266b9a38963099529f720246ac">m_dp</a> = <a class="code" href="class_invertible_r_s_a_function.html#e6ebef334123434c80fd0d87dddea8c7">m_d</a> % (<a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a>-1);<a name="l00181"></a>00181                                 <a class="code" href="class_invertible_r_s_a_function.html#3702d3ea62a2edce11be04493e18a5a9">m_dq</a> = <a class="code" href="class_invertible_r_s_a_function.html#e6ebef334123434c80fd0d87dddea8c7">m_d</a> % (<a class="code" href="class_invertible_r_s_a_function.html#48b1e3c5cf1ba5ba83952d46708afaee">m_q</a>-1);<a name="l00182"></a>00182                                 <a class="code" href="class_invertible_r_s_a_function.html#6b7b378c8be194a47faf824844ed6c7b">m_u</a> = <a class="code" href="class_invertible_r_s_a_function.html#48b1e3c5cf1ba5ba83952d46708afaee">m_q</a>.<a class="code" href="class_integer.html#881f9c714ee42f35718725a43d4d7db3" title="calculate multiplicative inverse of *this mod n">InverseMod</a>(<a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a>);<a name="l00183"></a>00183                                 <span class="keywordflow">return</span>;<a name="l00184"></a>00184                         }<a name="l00185"></a>00185                         <span class="keywordflow">if</span> (++j == s)<a name="l00186"></a>00186                                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: input is not a valid RSA private key"</span>);<a name="l00187"></a>00187                         a = b;<a name="l00188"></a>00188                 }<a name="l00189"></a>00189         }<a name="l00190"></a>00190 }<a name="l00191"></a>00191 <a name="l00192"></a><a class="code" href="class_invertible_r_s_a_function.html#ec98bbad739fc4536151f2ab5eedf78c">00192</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#ec98bbad739fc4536151f2ab5eedf78c" title="decode privateKey part of privateKeyInfo, without the OCTET STRING header">InvertibleRSAFunction::BERDecodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt, <span class="keywordtype">bool</span>, <span class="keywordtype">size_t</span>)<a name="l00193"></a>00193 {<a name="l00194"></a>00194         <a class="code" href="class_b_e_r_sequence_decoder.html" title="BER Sequence Decoder.">BERSequenceDecoder</a> privateKey(bt);<a name="l00195"></a>00195                 word32 version;<a name="l00196"></a>00196                 BERDecodeUnsigned&lt;word32&gt;(privateKey, version, INTEGER, 0, 0);  <span class="comment">// check version</span><a name="l00197"></a>00197                 <a class="code" href="class_r_s_a_function.html#b2e89822414861cb312d52d8c7ac3017">m_n</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00198"></a>00198                 <a class="code" href="class_r_s_a_function.html#f6d15cdabeb084e9cdc7efb1bbdea783">m_e</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00199"></a>00199                 <a class="code" href="class_invertible_r_s_a_function.html#e6ebef334123434c80fd0d87dddea8c7">m_d</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00200"></a>00200                 <a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00201"></a>00201                 <a class="code" href="class_invertible_r_s_a_function.html#48b1e3c5cf1ba5ba83952d46708afaee">m_q</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00202"></a>00202                 <a class="code" href="class_invertible_r_s_a_function.html#665927266b9a38963099529f720246ac">m_dp</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00203"></a>00203                 <a class="code" href="class_invertible_r_s_a_function.html#3702d3ea62a2edce11be04493e18a5a9">m_dq</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00204"></a>00204                 <a class="code" href="class_invertible_r_s_a_function.html#6b7b378c8be194a47faf824844ed6c7b">m_u</a>.<a class="code" href="class_integer.html#810fc0382f8928893fe192ab79b1972c">BERDecode</a>(privateKey);<a name="l00205"></a>00205         privateKey.MessageEnd();<a name="l00206"></a>00206 }<a name="l00207"></a>00207 <a name="l00208"></a><a class="code" href="class_invertible_r_s_a_function.html#0fd9c43c688c787d1bc686c254c577ef">00208</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#0fd9c43c688c787d1bc686c254c577ef" title="encode privateKey part of privateKeyInfo, without the OCTET STRING header">InvertibleRSAFunction::DEREncodePrivateKey</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span><a name="l00209"></a>00209 <span class="keyword"></span>{<a name="l00210"></a>00210         <a class="code" href="class_d_e_r_sequence_encoder.html" title="DER Sequence Encoder.">DERSequenceEncoder</a> privateKey(bt);<a name="l00211"></a>00211                 DEREncodeUnsigned&lt;word32&gt;(privateKey, 0);       <span class="comment">// version</span><a name="l00212"></a>00212                 <a class="code" href="class_r_s_a_function.html#b2e89822414861cb312d52d8c7ac3017">m_n</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00213"></a>00213                 <a class="code" href="class_r_s_a_function.html#f6d15cdabeb084e9cdc7efb1bbdea783">m_e</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00214"></a>00214                 <a class="code" href="class_invertible_r_s_a_function.html#e6ebef334123434c80fd0d87dddea8c7">m_d</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00215"></a>00215                 <a class="code" href="class_invertible_r_s_a_function.html#0061793214f56717f67956444c935cf9">m_p</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00216"></a>00216                 <a class="code" href="class_invertible_r_s_a_function.html#48b1e3c5cf1ba5ba83952d46708afaee">m_q</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00217"></a>00217                 <a class="code" href="class_invertible_r_s_a_function.html#665927266b9a38963099529f720246ac">m_dp</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00218"></a>00218                 <a class="code" href="class_invertible_r_s_a_function.html#3702d3ea62a2edce11be04493e18a5a9">m_dq</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00219"></a>00219                 <a class="code" href="class_invertible_r_s_a_function.html#6b7b378c8be194a47faf824844ed6c7b">m_u</a>.<a class="code" href="class_integer.html#6ab51a05bee88cfa690179611e8a084e" title="encode using Distinguished Encoding Rules, put result into a BufferedTransformation...">DEREncode</a>(privateKey);<a name="l00220"></a>00220         privateKey.MessageEnd();<a name="l00221"></a>00221 }<a name="l00222"></a>00222 <a name="l00223"></a><a class="code" href="class_invertible_r_s_a_function.html#929a48a3b7942c57223c0ca8baa194d3">00223</a> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> <a class="code" href="class_invertible_r_s_a_function.html#929a48a3b7942c57223c0ca8baa194d3">InvertibleRSAFunction::CalculateInverse</a>(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &amp;x)<span class="keyword"> const </span><a name="l00224"></a>00224 <span class="keyword"></span>{<a name="l00225"></a>00225         <a class="code" href="class_crypto_material.html#a1da44802c5cf00946043922cb9e7e6e">DoQuickSanityCheck</a>();<a name="l00226"></a>00226         <a class="code" href="class_modular_arithmetic.html" title="ring of congruence classes modulo n">ModularArithmetic</a> modn(<a class="code" href="class_r_s_a_function.html#b2e89822414861cb312d52d8c7ac3017">m_n</a>);<a name="l00227"></a>00227         <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> r, rInv;<a name="l00228"></a>00228         <span class="keywordflow">do</span> {    <span class="comment">// do this in a loop for people using small numbers for testing</span>

⌨️ 快捷键说明

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