📄 gfpcrypt_8h-source.html
字号:
<a name="l00122"></a>00122 <span class="comment">// DL_GroupParameters</span><a name="l00123"></a><a class="code" href="class_d_l___group_parameters___g_f_p.html#6bb3dbd327a516a47aa2407cbce10d55">00123</a> <span class="keywordtype">bool</span> IsIdentity(<span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &element)<span class="keyword"> const </span>{<span class="keywordflow">return</span> element == <a class="code" href="class_integer.html#8c070592581bf6c2f928c72bfa1c1638" title="avoid calling constructors for these frequently used integers">Integer::One</a>();}<a name="l00124"></a>00124 <span class="keywordtype">void</span> SimultaneousExponentiate(Element *results, <span class="keyword">const</span> Element &base, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> *exponents, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> exponentsCount) <span class="keyword">const</span>;<a name="l00125"></a>00125 <a name="l00126"></a>00126 <span class="comment">// NameValuePairs interface</span><a name="l00127"></a><a class="code" href="class_d_l___group_parameters___g_f_p.html#02a6a339e6fb0458ef4cea824dfa965d">00127</a> <span class="keywordtype">bool</span> <a class="code" href="class_d_l___group_parameters___integer_based_impl.html#a017775352184937c5f064a4776d587e" title="to be implemented by derived classes, users should use one of the above functions...">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><a name="l00128"></a>00128 <span class="keyword"> </span>{<a name="l00129"></a>00129 <span class="keywordflow">return</span> GetValueHelper<DL_GroupParameters_IntegerBased>(<span class="keyword">this</span>, name, valueType, pValue).Assignable();<a name="l00130"></a>00130 }<a name="l00131"></a>00131 <a name="l00132"></a>00132 <span class="comment">// used by MQV</span><a name="l00133"></a>00133 Element MultiplyElements(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &b) <span class="keyword">const</span>;<a name="l00134"></a>00134 Element CascadeExponentiate(<span class="keyword">const</span> Element &element1, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &exponent1, <span class="keyword">const</span> Element &element2, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &exponent2) <span class="keyword">const</span>;<a name="l00135"></a>00135 <a name="l00136"></a>00136 <span class="keyword">protected</span>:<a name="l00137"></a><a class="code" href="class_d_l___group_parameters___g_f_p.html#aa7bb277d7446553ad243eec87da6efc">00137</a> <span class="keywordtype">int</span> GetFieldType()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 1;}<a name="l00138"></a>00138 };<a name="l00139"></a>00139 <span class="comment"></span><a name="l00140"></a>00140 <span class="comment">//! GF(p) group parameters that default to same primes</span><a name="l00141"></a><a class="code" href="class_d_l___group_parameters___g_f_p___default_safe_prime.html">00141</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL DL_GroupParameters_GFP_DefaultSafePrime : <span class="keyword">public</span> <a class="code" href="class_d_l___group_parameters___g_f_p.html" title="GF(p) group parameters.">DL_GroupParameters_GFP</a><a name="l00142"></a>00142 {<a name="l00143"></a>00143 <span class="keyword">public</span>:<a name="l00144"></a><a class="code" href="class_d_l___group_parameters___g_f_p___default_safe_prime.html#293711b516f4d541ae51ba701b26fb34">00144</a> <span class="keyword">typedef</span> <a class="code" href="struct_enum_to_type.html">NoCofactorMultiplication</a> <a class="code" href="struct_enum_to_type.html">DefaultCofactorOption</a>;<a name="l00145"></a>00145 <a name="l00146"></a>00146 <span class="keyword">protected</span>:<a name="l00147"></a><a class="code" href="class_d_l___group_parameters___g_f_p___default_safe_prime.html#dec422717a7665d12b9a351727147ebe">00147</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_d_l___group_parameters___integer_based.html#91dcd7ec2cad65152b863522144351bd">GetDefaultSubgroupOrderSize</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> modulusSize)<span class="keyword"> const </span>{<span class="keywordflow">return</span> modulusSize-1;}<a name="l00148"></a>00148 };<a name="l00149"></a>00149 <span class="comment"></span><a name="l00150"></a>00150 <span class="comment">//! GDSA algorithm</span><a name="l00151"></a>00151 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00152"></a><a class="code" href="class_d_l___algorithm___g_d_s_a.html">00152</a> <span class="keyword">class </span><a class="code" href="class_d_l___algorithm___g_d_s_a.html" title="GDSA algorithm.">DL_Algorithm_GDSA</a> : <span class="keyword">public</span> <a class="code" href="class_d_l___elgamal_like_signature_algorithm.html" title="interface for Elgamal-like signature algorithms">DL_ElgamalLikeSignatureAlgorithm</a><T><a name="l00153"></a>00153 {<a name="l00154"></a>00154 <span class="keyword">public</span>:<a name="l00155"></a><a class="code" href="class_d_l___algorithm___g_d_s_a.html#4e705e6b3b600407f49131294abe08f0">00155</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * CRYPTOPP_API <a class="code" href="class_d_l___algorithm___g_d_s_a.html#4e705e6b3b600407f49131294abe08f0">StaticAlgorithmName</a>() {<span class="keywordflow">return</span> <span class="stringliteral">"DSA-1363"</span>;}<a name="l00156"></a>00156 <a name="l00157"></a><a class="code" href="class_d_l___algorithm___g_d_s_a.html#8a60aa64a15eced1c26686f8eac089d9">00157</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___algorithm___g_d_s_a.html#8a60aa64a15eced1c26686f8eac089d9">Sign</a>(<span class="keyword">const</span> <a class="code" href="class_d_l___group_parameters.html" title="interface for DL group parameters">DL_GroupParameters<T></a> &params, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &x, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &k, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &e, <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &r, <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &s)<span class="keyword"> const</span><a name="l00158"></a>00158 <span class="keyword"> </span>{<a name="l00159"></a>00159 <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &q = params.<a class="code" href="class_d_l___group_parameters.html#3555cec872358c0f314a375f56119c99">GetSubgroupOrder</a>();<a name="l00160"></a>00160 r %= q;<a name="l00161"></a>00161 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> kInv = k.<a class="code" href="class_integer.html#881f9c714ee42f35718725a43d4d7db3" title="calculate multiplicative inverse of *this mod n">InverseMod</a>(q);<a name="l00162"></a>00162 s = (kInv * (x*r + e)) % q;<a name="l00163"></a>00163 assert(!!r && !!s);<a name="l00164"></a>00164 }<a name="l00165"></a>00165 <a name="l00166"></a><a class="code" href="class_d_l___algorithm___g_d_s_a.html#a88f8827bab1adc8d61a2ba4f87941e7">00166</a> <span class="keywordtype">bool</span> <a class="code" href="class_d_l___algorithm___g_d_s_a.html#a88f8827bab1adc8d61a2ba4f87941e7">Verify</a>(<span class="keyword">const</span> <a class="code" href="class_d_l___group_parameters.html" title="interface for DL group parameters">DL_GroupParameters<T></a> &params, <span class="keyword">const</span> <a class="code" href="class_d_l___public_key.html" title="interface for DL public keys">DL_PublicKey<T></a> &publicKey, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &e, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &r, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &s)<span class="keyword"> const</span><a name="l00167"></a>00167 <span class="keyword"> </span>{<a name="l00168"></a>00168 <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &q = params.<a class="code" href="class_d_l___group_parameters.html#3555cec872358c0f314a375f56119c99">GetSubgroupOrder</a>();<a name="l00169"></a>00169 <span class="keywordflow">if</span> (r>=q || r<1 || s>=q || s<1)<a name="l00170"></a>00170 <span class="keywordflow">return</span> <span class="keyword">false</span>;<a name="l00171"></a>00171 <a name="l00172"></a>00172 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> w = s.<a class="code" href="class_integer.html#881f9c714ee42f35718725a43d4d7db3" title="calculate multiplicative inverse of *this mod n">InverseMod</a>(q);<a name="l00173"></a>00173 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> u1 = (e * w) % q;<a name="l00174"></a>00174 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> u2 = (r * w) % q;<a name="l00175"></a>00175 <span class="comment">// verify r == (g^u1 * y^u2 mod p) mod q</span><a name="l00176"></a>00176 <span class="keywordflow">return</span> r == params.<a class="code" href="class_d_l___group_parameters.html#fb36d983bb45fe3b8acb1767c0060700">ConvertElementToInteger</a>(publicKey.<a class="code" href="class_d_l___public_key.html#63d54207437aeb69fcccdd1fbbde12e8">CascadeExponentiateBaseAndPublicElement</a>(u1, u2)) % q;<a name="l00177"></a>00177 }<a name="l00178"></a>00178 };<a name="l00179"></a>00179 <a name="l00180"></a>00180 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_d_l___algorithm___g_d_s_a.html" title="GDSA algorithm.">DL_Algorithm_GDSA<Integer></a>;<a name="l00181"></a>00181 <span class="comment"></span><a name="l00182"></a>00182 <span class="comment">//! NR algorithm</span><a name="l00183"></a>00183 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00184"></a><a class="code" href="class_d_l___algorithm___n_r.html">00184</a> <span class="keyword">class </span><a class="code" href="class_d_l___algorithm___n_r.html" title="NR algorithm.">DL_Algorithm_NR</a> : <span class="keyword">public</span> <a class="code" href="class_d_l___elgamal_like_signature_algorithm.html" title="interface for Elgamal-like signature algorithms">DL_ElgamalLikeSignatureAlgorithm</a><T><a name="l00185"></a>00185 {<a name="l00186"></a>00186 <span class="keyword">public</span>:<a name="l00187"></a><a class="code" href="class_d_l___algorithm___n_r.html#0479a4788e3805606b34eaa426567ada">00187</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * CRYPTOPP_API <a class="code" href="class_d_l___algorithm___n_r.html#0479a4788e3805606b34eaa426567ada">StaticAlgorithmName</a>() {<span class="keywordflow">return</span> <span class="stringliteral">"NR"</span>;}<a name="l00188"></a>00188 <a name="l00189"></a><a class="code" href="class_d_l___algorithm___n_r.html#1bec206f59857977ceca6fd1c94130b9">00189</a> <span class="keywordtype">void</span> <a class="code" href="class_d_l___algorithm___n_r.html#1bec206f59857977ceca6fd1c94130b9">Sign</a>(<span class="keyword">const</span> <a class="code" href="class_d_l___group_parameters.html" title="interface for DL group parameters">DL_GroupParameters<T></a> &params, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &x, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &k, <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &e, <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &r, <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &s)<span class="keyword"> const</span><a name="l00190"></a>00190 <span class="keyword"> </span>{<a name="l00191"></a>00191 <span class="keyword">const</span> <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> &q = params.<a class="code" href="class_d_l___group_parameters.html#3555cec872358c0f314a375f56119c99">GetSubgroupOrder</a>();<a name="l00192"></a>00192 r = (r + e) % q;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -