📄 rsa_8cpp-source.html
字号:
00130 {00131 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Signer signer(*<span class="keyword">this</span>);00132 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Verifier verifier(signer);00133 SignaturePairwiseConsistencyTest(signer, verifier);00134 00135 <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::Decryptor decryptor(*<span class="keyword">this</span>);00136 <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::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> &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> &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> &bt)00147 {00148 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> privateKey(bt);00149 word32 version;00150 BERDecodeUnsigned<word32>(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> &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<word32>(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> &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> &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 && m_p > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_p.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_p < m_n;00205 pass = pass && m_q > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_q.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_q < m_n;00206 pass = pass && m_d > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_d.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_d < m_n;00207 pass = pass && m_dp > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_dp.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_dp < m_p;00208 pass = pass && m_dq > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_dq.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_dq < m_q;00209 pass = pass && m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() && m_u < m_p;00210 <span class="keywordflow">if</span> (level >= 1)00211 {00212 pass = pass && m_p * m_q == m_n;00213 pass = pass && m_e*m_d % LCM(m_p-1, m_q-1) == 1;00214 pass = pass && m_dp == m_d%(m_p-1) && m_dq == m_d%(m_q-1);00215 pass = pass && m_u * m_q % m_p == 1;00216 }00217 <span class="keywordflow">if</span> (level >= 2)00218 pass = pass && VerifyPrime(rng, m_p, level-2) && 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 &valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>00223 <span class="keyword"></span>{00224 <span class="keywordflow">return</span> GetValueHelper<RSAFunction>(<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> &source)00235 {00236 AssignFromHelper<RSAFunction>(<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 &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 && m_n > Integer::One() && m_n.IsOdd();</span>00253 <span class="comment"> pass = pass && m_d > Integer::One() && m_d.IsOdd() && m_d < 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 + -