📄 luc_8cpp-source.html
字号:
00106 };00107 <a name="l00108"></a><a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona8">00108</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona8">InvertibleLUCFunction::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)00109 {00110 <span class="keywordtype">int</span> modulusSize = 2048;00111 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);00112 00113 <span class="keywordflow">if</span> (modulusSize < 16)00114 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleLUCFunction: specified modulus size is too small"</span>);00115 00116 m_e = alg.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha40">GetValueWithDefault</a>(<span class="stringliteral">"PublicExponent"</span>, <a class="code" href="class_integer.html">Integer</a>(17));00117 00118 <span class="keywordflow">if</span> (m_e < 5 || m_e.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>())00119 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleLUCFunction: invalid public exponent"</span>);00120 00121 LUCPrimeSelector selector(m_e);00122 <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize)00123 (<span class="stringliteral">"PointerToPrimeSelector"</span>, selector.GetSelectorPointer());00124 m_p.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam);00125 m_q.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam);00126 00127 m_n = m_p * m_q;00128 m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p);00129 }00130 00131 <span class="keywordtype">void</span> InvertibleLUCFunction::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)00132 {00133 <a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona8">GenerateRandom</a>(rng, MakeParameters(<span class="stringliteral">"ModulusSize"</span>, (<span class="keywordtype">int</span>)keybits)(<span class="stringliteral">"PublicExponent"</span>, e));00134 }00135 00136 <span class="keywordtype">void</span> InvertibleLUCFunction::BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)00137 {00138 <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00139 00140 <a class="code" href="class_integer.html">Integer</a> version(seq);00141 <span class="keywordflow">if</span> (!!version) <span class="comment">// make sure version is 0</span>00142 BERDecodeError();00143 00144 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00145 m_e.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00146 m_p.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00147 m_q.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00148 m_u.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00149 seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00150 }00151 00152 <span class="keywordtype">void</span> InvertibleLUCFunction::DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span>00153 <span class="keyword"></span>{00154 <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00155 00156 <span class="keyword">const</span> byte version[] = {INTEGER, 1, 0};00157 seq.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(version, <span class="keyword">sizeof</span>(version));00158 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00159 m_e.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00160 m_p.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00161 m_q.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00162 m_u.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00163 seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00164 }00165 00166 <a class="code" href="class_integer.html">Integer</a> InvertibleLUCFunction::CalculateInverse(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &x)<span class="keyword"> const</span>00167 <span class="keyword"></span>{00168 DoQuickSanityCheck();00169 <span class="keywordflow">return</span> InverseLucas(m_e, x, m_q, m_p, m_u);00170 }00171 <a name="l00172"></a><a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona5">00172</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona5">InvertibleLUCFunction::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>00173 <span class="keyword"></span>{00174 <span class="keywordtype">bool</span> pass = <a class="code" href="class_l_u_c_function.html#_l_u_c_functiona6">LUCFunction::Validate</a>(rng, level);00175 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;00176 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;00177 pass = pass && m_u.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>() && m_u < m_p;00178 <span class="keywordflow">if</span> (level >= 1)00179 {00180 pass = pass && m_p * m_q == m_n;00181 pass = pass && RelativelyPrime(m_e, m_p+1);00182 pass = pass && RelativelyPrime(m_e, m_p-1);00183 pass = pass && RelativelyPrime(m_e, m_q+1);00184 pass = pass && RelativelyPrime(m_e, m_q-1);00185 pass = pass && m_u * m_q % m_p == 1;00186 }00187 <span class="keywordflow">if</span> (level >= 2)00188 pass = pass && VerifyPrime(rng, m_p, level-2) && VerifyPrime(rng, m_q, level-2);00189 <span class="keywordflow">return</span> pass;00190 }00191 <a name="l00192"></a><a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona6">00192</a> <span class="keywordtype">bool</span> <a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona6">InvertibleLUCFunction::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>00193 <span class="keyword"></span>{00194 <span class="keywordflow">return</span> GetValueHelper<LUCFunction>(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00195 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00196 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00197 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00198 ;00199 }00200 <a name="l00201"></a><a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona7">00201</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_l_u_c_function.html#_invertible_l_u_c_functiona7">InvertibleLUCFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &source)00202 {00203 AssignFromHelper<LUCFunction>(<span class="keyword">this</span>, source)00204 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a24">Prime1</a>)00205 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a25">Prime2</a>)00206 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a28">MultiplicativeInverseOfPrime2ModPrime1</a>)00207 ;00208 }00209 00210 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:19 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 + -