📄 rsa_8cpp-source.html
字号:
<!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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File 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<PKCS1v15, SHA></a>::Verifier x1(1, 1);00022 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Signer x2(NullRNG(), 1);00023 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Verifier x3(x2);00024 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Verifier x4(x2.GetKey());00025 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Verifier x5(x3);00026 <a class="code" href="struct_r_s_a_s_s_a.html">RSASSA<PKCS1v15, SHA></a>::Signer x6 = x2;00027 <a class="code" href="struct_r_s_a_e_s.html">RSAES<PKCS1v15></a>::Encryptor x7(x2);00028 <a class="code" href="struct_r_s_a_e_s.html">RSAES<PKCS1v15></a>::Encryptor x8(x3);00029 <a class="code" href="struct_r_s_a_e_s.html">RSAES<OAEP<SHA></a> >::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> &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> &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> &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> &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 && m_n > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_n.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>();00072 pass = pass && m_e > <a class="code" href="class_integer.html#_integerz37_11">Integer::One</a>() && m_e.<a class="code" href="class_integer.html#_integerz41_15">IsOdd</a>() && m_e < 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 &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> &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> &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> &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> &rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &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 < 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 < 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> &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 + -