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> &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> &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> &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 && out.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>()) || (jq==1 && 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> &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 && m_p > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_p%4 == 3 && m_p < m_n;00178 pass = pass && m_q > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_q%4 == 3 && m_q < m_n;00179 pass = pass && m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() && m_u < m_p;00180 <span class="keywordflow">if</span> (level >= 1)00181 {00182 pass = pass && m_p * m_q == m_n;00183 pass = pass && m_u * m_q % m_p == 1;00184 pass = pass && Jacobi(m_r, m_p) == 1;00185 pass = pass && Jacobi(m_r, m_q) == -1;00186 pass = pass && Jacobi(m_s, m_p) == -1;00187 pass = pass && Jacobi(m_s, m_q) == 1;00188 }00189 <span class="keywordflow">if</span> (level >= 2)00190 pass = pass && VerifyPrime(rng, m_p, level-2) && 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 &valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>00195 <span class="keyword"></span>{00196 <span class="keywordflow">return</span> GetValueHelper<RabinFunction>(<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> &source)00204 {00205 AssignFromHelper<RabinFunction>(<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 + -
显示快捷键?