⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsa_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: rsa.cpp Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>rsa.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// rsa.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 <span class="preprocessor">#include "<a class="code" href="rsa_8h.html">rsa.h</a>"</span>00005 <span class="preprocessor">#include "asn.h"</span>00006 <span class="preprocessor">#include "oids.h"</span>00007 <span class="preprocessor">#include "modarith.h"</span>00008 <span class="preprocessor">#include "nbtheory.h"</span>00009 <span class="preprocessor">#include "sha.h"</span>00010 <span class="preprocessor">#include "algparam.h"</span>00011 <span class="preprocessor">#include "<a class="code" href="fips140_8h.html">fips140.h</a>"</span>00012 <span class="preprocessor">#include "randpool.h"</span>00013 00014 NAMESPACE_BEGIN(CryptoPP)00015 00016 byte OAEP_P_DEFAULT[1];00017 00018 <span class="preprocessor">#ifndef NDEBUG</span>00019 <span class="preprocessor"></span><span class="keywordtype">void</span> RSA_TestInstantiations()00020 {00021         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Verifier x1(1, 1);00022         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Signer x2(NullRNG(), 1);00023         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Verifier x3(x2);00024         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Verifier x4(x2.GetKey());00025         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Verifier x5(x3);00026         <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA&lt;PKCS1v15, SHA&gt;</a>::Signer x6 = x2;00027         <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;PKCS1v15&gt;</a>::Encryptor x7(x2);00028         <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;PKCS1v15&gt;</a>::Encryptor x8(x3);00029         <a class="code" href="struct_r_s_a_e_s.html">RSAES&lt;OAEP&lt;SHA&gt;</a> &gt;::Encryptor x9(x2);00030 00031         x6 = x2;00032 <span class="preprocessor">#ifndef __MWERKS__</span>00033 <span class="preprocessor"></span>        x3 = x2;00034 <span class="preprocessor">#endif</span>00035 <span class="preprocessor"></span>        x4 = x2.GetKey();00036 }00037 <span class="preprocessor">#endif</span>00038 <span class="preprocessor"></span>00039 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00040 <span class="preprocessor"></span>00041 <a class="code" href="class_o_i_d.html">OID</a> RSAFunction::GetAlgorithmID()<span class="keyword"> const</span>00042 <span class="keyword"></span>{00043         <span class="keywordflow">return</span> ASN1::rsaEncryption();00044 }00045 00046 <span class="keywordtype">void</span> RSAFunction::BERDecodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)00047 {00048         <a class="code" href="class_b_e_r_sequence_decoder.html">BERSequenceDecoder</a> seq(bt);00049                 m_n.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00050                 m_e.<a class="code" href="class_integer.html#_integerz39_9">BERDecode</a>(seq);00051         seq.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00052 }00053 00054 <span class="keywordtype">void</span> RSAFunction::DEREncodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>00055 <span class="keyword"></span>{00056         <a class="code" href="class_d_e_r_sequence_encoder.html">DERSequenceEncoder</a> seq(bt);00057                 m_n.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00058                 m_e.<a class="code" href="class_integer.html#_integerz39_3">DEREncode</a>(seq);00059         seq.<a class="code" href="class_d_e_r_general_encoder.html#_d_e_r_set_encodera2">MessageEnd</a>();00060 }00061 00062 <a class="code" href="class_integer.html">Integer</a> RSAFunction::ApplyFunction(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;x)<span class="keyword"> const</span>00063 <span class="keyword"></span>{00064         DoQuickSanityCheck();00065         <span class="keywordflow">return</span> a_exp_b_mod_c(x, m_e, m_n);00066 }00067 <a name="l00068"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona4">00068</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona4">RSAFunction::Validate</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>00069 <span class="keyword"></span>{00070         <span class="keywordtype">bool</span> pass = <span class="keyword">true</span>;00071         pass = pass &amp;&amp; m_n &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_n.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();00072         pass = pass &amp;&amp; m_e &gt; <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() &amp;&amp; m_e.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() &amp;&amp; m_e &lt; m_n;00073         <span class="keywordflow">return</span> pass;00074 }00075 <a name="l00076"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona5">00076</a> <span class="keywordtype">bool</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona5">RSAFunction::GetVoidValue</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const</span>00077 <span class="keyword"></span>{00078         <span class="keywordflow">return</span> GetValueHelper(<span class="keyword">this</span>, name, valueType, pValue).Assignable()00079                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00080                 CRYPTOPP_GET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a16">PublicExponent</a>)00081                 ;00082 }00083 <a name="l00084"></a><a class="code" href="class_r_s_a_function.html#_r_s_a_functiona6">00084</a> <span class="keywordtype">void</span> <a class="code" href="class_r_s_a_function.html#_r_s_a_functiona6">RSAFunction::AssignFrom</a>(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;source)00085 {00086         AssignFromHelper(<span class="keyword">this</span>, source)00087                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a15">Modulus</a>)00088                 CRYPTOPP_SET_FUNCTION_ENTRY(<a class="code" href="namespace_name.html#a16">PublicExponent</a>)00089                 ;00090 }00091 00092 <span class="comment">// *****************************************************************************</span>00093 00094 <span class="keyword">class </span>RSAPrimeSelector : <span class="keyword">public</span> PrimeSelector00095 {00096 <span class="keyword">public</span>:00097         RSAPrimeSelector(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;e) : m_e(e) {}00098         <span class="keywordtype">bool</span> IsAcceptable(<span class="keyword">const</span> <a class="code" href="class_integer.html">Integer</a> &amp;candidate)<span class="keyword"> const </span>{<span class="keywordflow">return</span> RelativelyPrime(m_e, candidate-Integer::One());}00099         <a class="code" href="class_integer.html">Integer</a> m_e;00100 };00101 <a name="l00102"></a><a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona8">00102</a> <span class="keywordtype">void</span> <a class="code" href="class_invertible_r_s_a_function.html#_invertible_r_s_a_functiona8">InvertibleRSAFunction::GenerateRandom</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;alg)00103 {00104         <span class="keywordtype">int</span> modulusSize = 2048;00105         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);00106 00107         <span class="keywordflow">if</span> (modulusSize &lt; 16)00108                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: specified modulus size is too small"</span>);00109 00110         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));00111 00112         <span class="keywordflow">if</span> (m_e &lt; 3 || m_e.<a class="code" href="class_integer.html#_integerz41_14">IsEven</a>())00113                 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"InvertibleRSAFunction: invalid public exponent"</span>);00114 00115         RSAPrimeSelector selector(m_e);00116         <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;primeParam = MakeParametersForTwoPrimesOfEqualSize(modulusSize)00117                 (<span class="stringliteral">"PointerToPrimeSelector"</span>, selector.GetSelectorPointer());00118         m_p.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam);00119         m_q.<a class="code" href="class_integer.html#_integerz43_14">GenerateRandom</a>(rng, primeParam);00120 00121         m_d = EuclideanMultiplicativeInverse(m_e, LCM(m_p-1, m_q-1));00122         assert(m_d.<a class="code" href="class_integer.html#_integerz41_12">IsPositive</a>());00123 00124         m_dp = m_d % (m_p-1);00125         m_dq = m_d % (m_q-1);00126         m_n = m_p * m_q;00127         m_u = m_q.<a class="code" href="class_integer.html#_integerz49_7">InverseMod</a>(m_p);00128 00129         <span class="keywordflow">if</span> (FIPS_140_2_ComplianceEnabled())

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -