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

📄 pwdbased_8h-source.html

📁 著名的密码库Crypto++的文档 C++语言的杰作。程序员必备。
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<a name="l00100"></a>00100                 hmac.<a class="code" href="class_h_m_a_c___base.html#efb8a1fb43ef8c9390ee89bbb41c83af" title="process more input">Update</a>(salt, saltLen);<a name="l00101"></a>00101                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j;<a name="l00102"></a>00102                 <span class="keywordflow">for</span> (j=0; j&lt;4; j++)<a name="l00103"></a>00103                 {<a name="l00104"></a>00104                         byte b = byte(i &gt;&gt; ((3-j)*8));<a name="l00105"></a>00105                         hmac.<a class="code" href="class_h_m_a_c___base.html#efb8a1fb43ef8c9390ee89bbb41c83af" title="process more input">Update</a>(&amp;b, 1);<a name="l00106"></a>00106                 }<a name="l00107"></a>00107                 hmac.<a class="code" href="class_hash_transformation.html#a0b8c7a110d8968268fd02ec32b9a8e8" title="compute hash for current message, then restart for a new message">Final</a>(buffer);<a name="l00108"></a>00108 <a name="l00109"></a>00109                 <span class="keywordtype">size_t</span> segmentLen = STDMIN(derivedLen, buffer.size());<a name="l00110"></a>00110                 memcpy(derived, buffer, segmentLen);<a name="l00111"></a>00111 <a name="l00112"></a>00112                 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00113"></a>00113                 {<a name="l00114"></a>00114                         timeInSeconds = timeInSeconds / ((derivedLen + buffer.size() - 1) / buffer.size());<a name="l00115"></a>00115                         timer.StartTimer();<a name="l00116"></a>00116                 }<a name="l00117"></a>00117 <a name="l00118"></a>00118                 <span class="keywordflow">for</span> (j=1; j&lt;iterations || (timeInSeconds &amp;&amp; (j%128!=0 || timer.ElapsedTimeAsDouble() &lt; timeInSeconds)); j++)<a name="l00119"></a>00119                 {<a name="l00120"></a>00120                         hmac.<a class="code" href="class_hash_transformation.html#f8124c4fca23b74bbdc43660bdae692c" title="use this if your input is in one piece and you don't want to call Update() and Final()...">CalculateDigest</a>(buffer, buffer, buffer.size());<a name="l00121"></a>00121                         xorbuf(derived, buffer, segmentLen);<a name="l00122"></a>00122                 }<a name="l00123"></a>00123 <a name="l00124"></a>00124                 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00125"></a>00125                 {<a name="l00126"></a>00126                         iterations = j;<a name="l00127"></a>00127                         timeInSeconds = 0;<a name="l00128"></a>00128                 }<a name="l00129"></a>00129 <a name="l00130"></a>00130                 derived += segmentLen;<a name="l00131"></a>00131                 derivedLen -= segmentLen;<a name="l00132"></a>00132                 i++;<a name="l00133"></a>00133         }<a name="l00134"></a>00134 <a name="l00135"></a>00135         <span class="keywordflow">return</span> iterations;<a name="l00136"></a>00136 }<a name="l00137"></a>00137 <span class="comment"></span><a name="l00138"></a>00138 <span class="comment">//! PBKDF from PKCS #12, appendix B, T should be a HashTransformation class</span><a name="l00139"></a>00139 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;<a name="l00140"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html">00140</a> <span class="keyword">class </span><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html" title="PBKDF from PKCS #12, appendix B, T should be a HashTransformation class.">PKCS12_PBKDF</a> : <span class="keyword">public</span> <a class="code" href="class_password_based_key_derivation_function.html" title="abstract base class for password based key derivation function">PasswordBasedKeyDerivationFunction</a><a name="l00141"></a>00141 {<a name="l00142"></a>00142 <span class="keyword">public</span>:<a name="l00143"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#242a0896a4894b5439c1532e7efb570b">00143</a>         <span class="keywordtype">size_t</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#28431120ba04fedfcf0b8fb53e826854">MaxDerivedKeyLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size_t(0)-1;}<a name="l00144"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#f57267aa37bf40969f3af917ca09eb9d">00144</a>         <span class="keywordtype">bool</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#8e823e1fd1287aaab5d0f1519f94df45">UsesPurposeByte</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}<a name="l00145"></a>00145         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#570d711d2a840cdcca4b574b6c20f368" title="derive key from password">DeriveKey</a>(byte *derived, <span class="keywordtype">size_t</span> derivedLen, byte purpose, <span class="keyword">const</span> byte *password, <span class="keywordtype">size_t</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">size_t</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations, <span class="keywordtype">double</span> timeInSeconds) <span class="keyword">const</span>;<a name="l00146"></a>00146 };<a name="l00147"></a>00147 <a name="l00148"></a>00148 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;<a name="l00149"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#2e252ab8024d3aab6f8bb6f239ce1ce0">00149</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#2e252ab8024d3aab6f8bb6f239ce1ce0" title="derive key from password">PKCS12_PBKDF&lt;T&gt;::DeriveKey</a>(byte *derived, <span class="keywordtype">size_t</span> derivedLen, byte purpose, <span class="keyword">const</span> byte *password, <span class="keywordtype">size_t</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">size_t</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations, <span class="keywordtype">double</span> timeInSeconds)<span class="keyword"> const</span><a name="l00150"></a>00150 <span class="keyword"></span>{<a name="l00151"></a>00151         assert(derivedLen &lt;= <a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#242a0896a4894b5439c1532e7efb570b">MaxDerivedKeyLength</a>());<a name="l00152"></a>00152         assert(iterations &gt; 0 || timeInSeconds &gt; 0);<a name="l00153"></a>00153 <a name="l00154"></a>00154         <span class="keywordflow">if</span> (!iterations)<a name="l00155"></a>00155                 iterations = 1;<a name="l00156"></a>00156 <a name="l00157"></a>00157         <span class="keyword">const</span> <span class="keywordtype">size_t</span> v = T::BLOCKSIZE;  <span class="comment">// v is in bytes rather than bits as in PKCS #12</span><a name="l00158"></a>00158         <span class="keyword">const</span> <span class="keywordtype">size_t</span> DLen = v, SLen = RoundUpToMultipleOf(saltLen, v);<a name="l00159"></a>00159         <span class="keyword">const</span> <span class="keywordtype">size_t</span> PLen = RoundUpToMultipleOf(passwordLen, v), ILen = SLen + PLen;<a name="l00160"></a>00160         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> buffer(DLen + SLen + PLen);<a name="l00161"></a>00161         byte *D = buffer, *S = buffer+DLen, *P = buffer+DLen+SLen, *I = S;<a name="l00162"></a>00162 <a name="l00163"></a>00163         memset(D, purpose, DLen);<a name="l00164"></a>00164         <span class="keywordtype">size_t</span> i;<a name="l00165"></a>00165         <span class="keywordflow">for</span> (i=0; i&lt;SLen; i++)<a name="l00166"></a>00166                 S[i] = salt[i % saltLen];<a name="l00167"></a>00167         <span class="keywordflow">for</span> (i=0; i&lt;PLen; i++)<a name="l00168"></a>00168                 P[i] = password[i % passwordLen];<a name="l00169"></a>00169 <a name="l00170"></a>00170 <a name="l00171"></a>00171         T hash;<a name="l00172"></a>00172         <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> Ai(T::DIGESTSIZE), B(v);<a name="l00173"></a>00173         <a class="code" href="class_thread_user_timer.html" title="measure CPU time spent executing instructions of this thread (if supported by OS)...">ThreadUserTimer</a> timer;<a name="l00174"></a>00174 <a name="l00175"></a>00175         <span class="keywordflow">while</span> (derivedLen &gt; 0)<a name="l00176"></a>00176         {<a name="l00177"></a>00177                 hash.CalculateDigest(Ai, buffer, buffer.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00178"></a>00178 <a name="l00179"></a>00179                 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00180"></a>00180                 {<a name="l00181"></a>00181                         timeInSeconds = timeInSeconds / ((derivedLen + Ai.size() - 1) / Ai.size());<a name="l00182"></a>00182                         timer.<a class="code" href="class_timer_base.html#50804b61c4254f7289c6c67515d5d46d">StartTimer</a>();<a name="l00183"></a>00183                 }<a name="l00184"></a>00184 <a name="l00185"></a>00185                 <span class="keywordflow">for</span> (i=1; i&lt;iterations || (timeInSeconds &amp;&amp; (i%128!=0 || timer.<a class="code" href="class_timer_base.html#3262a9d0815f1899701ee83c3ef8cf43">ElapsedTimeAsDouble</a>() &lt; timeInSeconds)); i++)<a name="l00186"></a>00186                         hash.CalculateDigest(Ai, Ai, Ai.size());<a name="l00187"></a>00187 <a name="l00188"></a>00188                 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00189"></a>00189                 {<a name="l00190"></a>00190                         iterations = (<span class="keywordtype">unsigned</span> int)i;<a name="l00191"></a>00191                         timeInSeconds = 0;<a name="l00192"></a>00192                 }<a name="l00193"></a>00193 <a name="l00194"></a>00194                 <span class="keywordflow">for</span> (i=0; i&lt;B.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(); i++)<a name="l00195"></a>00195                         B[i] = Ai[i % Ai.size()];<a name="l00196"></a>00196 <a name="l00197"></a>00197                 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> B1(B, B.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00198"></a>00198                 ++B1;<a name="l00199"></a>00199                 <span class="keywordflow">for</span> (i=0; i&lt;ILen; i+=v)<a name="l00200"></a>00200                         (<a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>(I+i, v) + B1).Encode(I+i, v);<a name="l00201"></a>00201 <a name="l00202"></a>00202                 <span class="keywordtype">size_t</span> segmentLen = STDMIN(derivedLen, Ai.size());<a name="l00203"></a>00203                 memcpy(derived, Ai, segmentLen);<a name="l00204"></a>00204                 derived += segmentLen;<a name="l00205"></a>00205                 derivedLen -= segmentLen;<a name="l00206"></a>00206         }<a name="l00207"></a>00207 <a name="l00208"></a>00208         <span class="keywordflow">return</span> iterations;<a name="l00209"></a>00209 }<a name="l00210"></a>00210 <a name="l00211"></a>00211 NAMESPACE_END<a name="l00212"></a>00212 <a name="l00213"></a>00213 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:23 2007 for Crypto++ by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>

⌨️ 快捷键说明

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