rabin_8cpp-source.html

来自「Crypto++是一个非常强大的密码学库,主要是功能全」· HTML 代码 · 共 226 行 · 第 1/2 页

HTML
226
字号
00107 00108                 ++t;00109         }00110 00111         m_n = m_p * m_q;00112         m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p);00113 }00114 00115 <span class="keywordtype">void</span> InvertibleRabinFunction::BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00116 {00117         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00118         m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00119         m_r.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00120         m_s.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00121         m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00122         m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00123         m_u.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00124         seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00125 }00126 00127 <span class="keywordtype">void</span> InvertibleRabinFunction::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00128 <span class="keyword"></span>{00129         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00130         m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00131         m_r.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00132         m_s.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00133         m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00134         m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00135         m_u.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00136         seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00137 }00138 00139 <a class="code" href="class_integer.html">Integer</a> InvertibleRabinFunction::CalculateInverse(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;in)<span class="keyword"> const</span>00140 <span class="keyword"></span>{00141         DoQuickSanityCheck();00142 00143         <a class="code" href="class_integer.html">Integer</a> cp=in%m_p, cq=in%m_q;00144 00145         <span class="keywordtype">int</span> jp = Jacobi(cp, m_p);00146         <span class="keywordtype">int</span> jq = Jacobi(cq, m_q);00147 00148         <span class="keywordflow">if</span> (jq==-1)00149         {00150                 cp = cp*EuclideanMultiplicativeInverse(m_r, m_p)%m_p;00151                 cq = cq*EuclideanMultiplicativeInverse(m_r, m_q)%m_q;00152         }00153 00154         <span class="keywordflow">if</span> (jp==-1)00155         {00156                 cp = cp*EuclideanMultiplicativeInverse(m_s, m_p)%m_p;00157                 cq = cq*EuclideanMultiplicativeInverse(m_s, m_q)%m_q;00158         }00159 00160         cp = ModularSquareRoot(cp, m_p);00161         cq = ModularSquareRoot(cq, m_q);00162 00163         <span class="keywordflow">if</span> (jp==-1)00164                 cp = m_p-cp;00165 00166         <a class="code" href="class_integer.html">Integer</a> out = CRT(cq, m_q, cp, m_p, m_u);00167 00168         <span class="keywordflow">if</span> ((jq==-1 &amp;&amp; out.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>()) || (jq==1 &amp;&amp; out.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>()))00169                 out = m_n-out;00170 00171         <span class="keywordflow">return</span> out;00172 }00173 <a name="l00174"></a><a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona5">00174</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona5">InvertibleRabinFunction::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>00175 <span class="keyword"></span>{00176         <span class="keywordtype">bool</span> pass = <a class="code" href="class_rabin_function.html#_rabin_functiona6">RabinFunction::Validate</a>(rng, level);00177         pass = pass &amp;&amp; m_p &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_p%4 == 3 &amp;&amp; m_p &lt; m_n;00178         pass = pass &amp;&amp; m_q &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_q%4 == 3 &amp;&amp; m_q &lt; m_n;00179         pass = pass &amp;&amp; m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() &amp;&amp; m_u &lt; m_p;00180         <span class="keywordflow">if</span> (level &gt;= 1)00181         {00182                 pass = pass &amp;&amp; m_p * m_q == m_n;00183                 pass = pass &amp;&amp; m_u * m_q % m_p == 1;00184                 pass = pass &amp;&amp; Jacobi(m_r, m_p) == 1;00185                 pass = pass &amp;&amp; Jacobi(m_r, m_q) == -1;00186                 pass = pass &amp;&amp; Jacobi(m_s, m_p) == -1;00187                 pass = pass &amp;&amp; Jacobi(m_s, m_q) == 1;00188         }00189         <span class="keywordflow">if</span> (level &gt;= 2)00190                 pass = pass &amp;&amp; VerifyPrime(rng, m_p, level-2) &amp;&amp; VerifyPrime(rng, m_q, level-2);00191         <span class="keywordflow">return</span> pass;00192 }00193 <a name="l00194"></a><a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona6">00194</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona6">InvertibleRabinFunction::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>00195 <span class="keyword"></span>{00196         <span class="keywordflow">return</span> GetValueHelper&lt;RabinFunction&gt;(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00197                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00198                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00199                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00200                 ;00201 }00202 <a name="l00203"></a><a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona7">00203</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_rabin_function.html#_invertible_rabin_functiona7">InvertibleRabinFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;source)00204 {00205         AssignFromHelper&lt;RabinFunction&gt;(<span class="keyword">this</span>, source)00206                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00207                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00208                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00209                 ;00210 }00211 00212 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:23 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 + =
减小字号Ctrl + -
显示快捷键?