strciphr_8h-source.html

来自「Crypto++是一个非常强大的密码学库,主要是功能全」· HTML 代码 · 共 312 行 · 第 1/2 页

HTML
312
字号
00150 CRYPTOPP_DLL_TEMPLATE_CLASS AdditiveCipherTemplate&lt;&gt;;00151 00152 <span class="keyword">class </span>CRYPTOPP_DLL CFB_CipherAbstractPolicy00153 {00154 <span class="keyword">public</span>:00155         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment() <span class="keyword">const</span> =0;00156         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetBytesPerIteration() <span class="keyword">const</span> =0;00157         <span class="keyword">virtual</span> byte * GetRegisterBegin() =0;00158         <span class="keyword">virtual</span> <span class="keywordtype">void</span> TransformRegister() =0;00159         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CanIterate()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}00160         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Iterate(byte *output, <span class="keyword">const</span> byte *input, CipherDir dir, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterationCount) {assert(<span class="keyword">false</span>);}00161         <span class="keyword">virtual</span> <span class="keywordtype">void</span> CipherSetKey(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length) =0;00162         <span class="keyword">virtual</span> <span class="keywordtype">void</span> CipherResynchronize(<span class="keyword">const</span> byte *iv) {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html">NotImplemented</a>(<span class="stringliteral">"StreamTransformation: this object doesn't support resynchronization"</span>);}00163 };00164 00165 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> WT, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> W, <span class="keyword">class</span> BASE = CFB_CipherAbstractPolicy&gt;00166 <span class="keyword">struct </span>CFB_CipherConcretePolicy : <span class="keyword">public</span> BASE00167 {00168         <span class="keyword">typedef</span> WT WordType;00169 00170         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAlignment()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">sizeof</span>(WordType);}00171         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetBytesPerIteration()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">sizeof</span>(WordType) * W;}00172         <span class="keywordtype">bool</span> CanIterate()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}00173         <span class="keywordtype">void</span> TransformRegister() {Iterate(NULL, NULL, ENCRYPTION, 1);}00174 00175         <span class="keyword">template</span> &lt;<span class="keyword">class</span> B&gt;00176         <span class="keyword">struct </span>RegisterOutput00177         {00178                 RegisterOutput(byte *output, <span class="keyword">const</span> byte *input, CipherDir dir)00179                         : m_output(output), m_input(input), m_dir(dir) {}00180 00181                 <span class="keyword">inline</span> RegisterOutput&amp; operator()(WordType &amp;registerWord)00182                 {00183                         assert(IsAligned&lt;WordType&gt;(m_output));00184                         assert(IsAligned&lt;WordType&gt;(m_input));00185 00186                         <span class="keywordflow">if</span> (!NativeByteOrderIs(B::ToEnum()))00187                                 registerWord = ByteReverse(registerWord);00188 00189                         <span class="keywordflow">if</span> (m_dir == ENCRYPTION)00190                         {00191                                 WordType ct = *(<span class="keyword">const</span> WordType *)m_input ^ registerWord;00192                                 registerWord = ct;00193                                 *(WordType*)m_output = ct;00194                                 m_input += <span class="keyword">sizeof</span>(WordType);00195                                 m_output += <span class="keyword">sizeof</span>(WordType);00196                         }00197                         <span class="keywordflow">else</span>00198                         {00199                                 WordType ct = *(<span class="keyword">const</span> WordType *)m_input;00200                                 *(WordType*)m_output = registerWord ^ ct;00201                                 registerWord = ct;00202                                 m_input += <span class="keyword">sizeof</span>(WordType);00203                                 m_output += <span class="keyword">sizeof</span>(WordType);00204                         }00205 00206                         <span class="comment">// registerWord is left unreversed so it can be xor-ed with further input</span>00207 00208                         <span class="keywordflow">return</span> *<span class="keyword">this</span>;00209                 }00210 00211                 byte *m_output;00212                 <span class="keyword">const</span> byte *m_input;00213                 <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> m_dir;00214         };00215 };00216 00217 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE&gt;00218 <span class="keyword">class </span>CFB_CipherTemplate : <span class="keyword">public</span> BASE00219 {00220 <span class="keyword">public</span>:00221         <span class="keywordtype">void</span> ProcessData(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00222         <span class="keywordtype">void</span> Resynchronize(<span class="keyword">const</span> byte *iv);00223         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetPolicy().GetBytesPerIteration();}00224         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetOptimalNextBlockSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_leftOver;}00225         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalDataAlignment()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetPolicy().GetAlignment();}00226         <span class="keywordtype">bool</span> IsRandomAccess()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}00227         <span class="keywordtype">bool</span> IsSelfInverting()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}00228 00229         <span class="keyword">typedef</span> <span class="keyword">typename</span> BASE::PolicyInterface PolicyInterface;00230 00231 <span class="keyword">protected</span>:00232         <span class="keyword">virtual</span> <span class="keywordtype">void</span> CombineMessageAndShiftRegister(byte *output, byte *reg, <span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length) =0;00233 00234         <span class="keywordtype">void</span> UncheckedSetKey(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00235 00236         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_leftOver;00237 };00238 00239 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE = AbstractPolicyHolder&lt;CFB_CipherAbstractPolicy, SymmetricCipher&gt; &gt;00240 <span class="keyword">class </span>CFB_EncryptionTemplate : <span class="keyword">public</span> CFB_CipherTemplate&lt;BASE&gt;00241 {00242         <span class="keywordtype">bool</span> IsForwardTransformation()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}00243         <span class="keywordtype">void</span> CombineMessageAndShiftRegister(byte *output, byte *reg, <span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00244 };00245 00246 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE = AbstractPolicyHolder&lt;CFB_CipherAbstractPolicy, SymmetricCipher&gt; &gt;00247 <span class="keyword">class </span>CFB_DecryptionTemplate : <span class="keyword">public</span> CFB_CipherTemplate&lt;BASE&gt;00248 {00249         <span class="keywordtype">bool</span> IsForwardTransformation()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}00250         <span class="keywordtype">void</span> CombineMessageAndShiftRegister(byte *output, byte *reg, <span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);00251 };00252 00253 CRYPTOPP_DLL_TEMPLATE_CLASS AbstractPolicyHolder&lt;CFB_CipherAbstractPolicy, SymmetricCipher&gt;;00254 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_CipherTemplate&lt;AbstractPolicyHolder&lt;CFB_CipherAbstractPolicy, SymmetricCipher&gt; &gt;;00255 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_EncryptionTemplate&lt;&gt;;00256 CRYPTOPP_DLL_TEMPLATE_CLASS CFB_DecryptionTemplate&lt;&gt;;00257 00258 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE, <span class="keyword">class</span> INFO = BASE&gt;00259 <span class="keyword">class </span>SymmetricCipherFinalTemplate : <span class="keyword">public</span> AlgorithmImpl&lt;SimpleKeyingInterfaceImpl&lt;BASE, INFO&gt;, INFO&gt;00260 {00261 <span class="keyword">public</span>:00262         SymmetricCipherFinalTemplate() {}00263         SymmetricCipherFinalTemplate(<span class="keyword">const</span> byte *key)00264                 {SetKey(key, DEFAULT_KEYLENGTH);}00265         SymmetricCipherFinalTemplate(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00266                 {SetKey(key, length);}00267         SymmetricCipherFinalTemplate(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keyword">const</span> byte *iv)00268                 {SetKey(key, length); Resynchronize(iv);}00269 00270         <span class="keywordtype">void</span> SetKey(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params = g_nullNameValuePairs)00271         {00272                 ThrowIfInvalidKeyLength(length);00273                 UncheckedSetKey(params, key, length);00274         }00275 00276         <a class="code" href="class_clonable.html">Clonable</a> * Clone() {<span class="keywordflow">return</span> <span class="keyword">new</span> SymmetricCipherFinalTemplate&lt;BASE, INFO&gt;(*this);}00277 };00278 00279 <span class="keyword">template</span> &lt;<span class="keyword">class</span> S&gt;00280 <span class="keywordtype">void</span> AdditiveCipherTemplate&lt;S&gt;::UncheckedSetKey(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00281 {00282         PolicyInterface &amp;policy = AccessPolicy();00283         policy.CipherSetKey(params, key, length);00284         m_buffer.New(GetBufferByteSize(policy));00285         m_leftOver = 0;00286 }00287 00288 <span class="keyword">template</span> &lt;<span class="keyword">class</span> BASE&gt;00289 <span class="keywordtype">void</span> CFB_CipherTemplate&lt;BASE&gt;::UncheckedSetKey(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;params, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00290 {00291         PolicyInterface &amp;policy = AccessPolicy();00292         policy.CipherSetKey(params, key, length);00293         m_leftOver = policy.GetBytesPerIteration();00294 }00295 00296 NAMESPACE_END00297 00298 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:26 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 + =
减小字号Ctrl + -
显示快捷键?