📄 rw_8cpp-source.html
字号:
00123 <span class="keyword">template</span> <word r><a name="l00124"></a><a class="code" href="class_r_w_function.html#_r_w_functiona7">00124</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_w_function.html#_r_w_functiona7">RWFunction<r>::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>00125 <span class="keyword"></span>{00126 <span class="keywordflow">return</span> GetValueHelper(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00127 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00128 ;00129 }00130 00131 <span class="keyword">template</span> <word r><a name="l00132"></a><a class="code" href="class_r_w_function.html#_r_w_functiona8">00132</a> <span class="keywordtype">void</span> <a class="code" href="class_r_w_function.html#_r_w_functiona8">RWFunction<r>::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00133 {00134 AssignFromHelper(<span class="keyword">this</span>, source)00135 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00136 ;00137 }00138 00139 <span class="comment">// *****************************************************************************</span>00140 <span class="comment">// private key operations:</span>00141 00142 <span class="comment">// generate a random private key</span>00143 <span class="keyword">template</span> <word r><a name="l00144"></a><a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona8">00144</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona8">InvertibleRWFunction<r>::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &alg)00145 {00146 <span class="keywordtype">int</span> modulusSize = 2048;00147 alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"ModulusSize"</span>, modulusSize) || alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha42">GetIntValue</a>(<span class="stringliteral">"KeySize"</span>, modulusSize);00148 00149 <span class="keywordflow">if</span> (modulusSize < 16)00150 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRWFunction: specified modulus length is too small"</span>);00151 00152 <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize);00153 m_p.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, CombinedNameValuePairs(primeParam, MakeParameters(<span class="stringliteral">"EquivalentTo"</span>, 3)(<span class="stringliteral">"Mod"</span>, 8)));00154 m_q.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, CombinedNameValuePairs(primeParam, MakeParameters(<span class="stringliteral">"EquivalentTo"</span>, 7)(<span class="stringliteral">"Mod"</span>, 8)));00155 00156 m_n = m_p * m_q;00157 m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p);00158 }00159 00160 <span class="keyword">template</span> <word r>00161 <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_w_function.html">InvertibleRWFunction<r>::BERDecode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00162 {00163 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00164 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00165 m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00166 m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00167 m_u.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00168 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00169 }00170 00171 <span class="keyword">template</span> <word r>00172 <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_w_function.html">InvertibleRWFunction<r>::DEREncode</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00173 <span class="keyword"></span>{00174 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00175 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00176 m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00177 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00178 m_u.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00179 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00180 }00181 00182 <span class="keyword">template</span> <word r>00183 <a class="code" href="class_integer.html">Integer</a> <a class="code" href="class_invertible_r_w_function.html">InvertibleRWFunction<r>::CalculateInverse</a>(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &in)<span class="keyword"> const</span>00184 <span class="keyword"></span>{00185 DoQuickSanityCheck();00186 00187 <a class="code" href="class_integer.html">Integer</a> cp=in%m_p, cq=in%m_q;00188 00189 <span class="keywordflow">if</span> (Jacobi(cp, m_p) * Jacobi(cq, m_q) != 1)00190 {00191 cp = cp%2 ? (cp+m_p) >> 1 : cp >> 1;00192 cq = cq%2 ? (cq+m_q) >> 1 : cq >> 1;00193 }00194 00195 cp = ModularSquareRoot(cp, m_p);00196 cq = ModularSquareRoot(cq, m_q);00197 00198 <a class="code" href="class_integer.html">Integer</a> out = CRT(cq, m_q, cp, m_p, m_u);00199 00200 <span class="keywordflow">return</span> STDMIN(out, m_n-out);00201 }00202 00203 <span class="keyword">template</span> <word r><a name="l00204"></a><a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona5">00204</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona5">InvertibleRWFunction<r>::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>00205 <span class="keyword"></span>{00206 <span class="keywordtype">bool</span> pass = <a class="code" href="class_r_w_function.html#_r_w_functiona6">RWFunction<r>::Validate</a>(rng, level);00207 pass = pass && m_p > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_p%8 == 3 && m_p < m_n;00208 pass = pass && m_q > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_q%8 == 7 && m_q < m_n;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_u * m_q % m_p == 1;00214 }00215 <span class="keywordflow">if</span> (level >= 2)00216 pass = pass && VerifyPrime(rng, m_p, level-2) && VerifyPrime(rng, m_q, level-2);00217 <span class="keywordflow">return</span> pass;00218 }00219 00220 <span class="keyword">template</span> <word r><a name="l00221"></a><a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona6">00221</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona6">InvertibleRWFunction<r>::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>00222 <span class="keyword"></span>{00223 <span class="keywordflow">return</span> GetValueHelper<RWFunction<r> >(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00224 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00225 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00226 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00227 ;00228 }00229 00230 <span class="keyword">template</span> <word r><a name="l00231"></a><a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona7">00231</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_w_function.html#_invertible_r_w_functiona7">InvertibleRWFunction<r>::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00232 {00233 AssignFromHelper<RWFunction<r> >(<span class="keyword">this</span>, source)00234 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00235 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00236 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00237 ;00238 }00239 00240 <span class="keyword">template</span> <span class="keyword">class </span><a class="code" href="class_r_w_function.html">RWFunction<IFSSA_R></a>;00241 <span class="keyword">template</span> <span class="keyword">class </span><a class="code" href="class_invertible_r_w_function.html">InvertibleRWFunction<IFSSA_R></a>;00242 00243 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 + -