📄 strciphr_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++: strciphr.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>strciphr.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// strciphr.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "<a class="code" href="strciphr_8h.html">strciphr.h</a>"</span>00008 00009 NAMESPACE_BEGIN(CryptoPP)00010 00011 <span class="keyword">template</span> <<span class="keyword">class</span> S>00012 byte AdditiveCipherTemplate<S>::GenerateByte()00013 {00014 PolicyInterface &policy = AccessPolicy();00015 00016 <span class="keywordflow">if</span> (m_leftOver == 0)00017 {00018 policy.WriteKeystream(m_buffer, policy.GetIterationsToBuffer());00019 m_leftOver = policy.GetBytesPerIteration();00020 }00021 00022 <span class="keywordflow">return</span> KeystreamBufferEnd()[-m_leftOver--];00023 }00024 00025 <span class="keyword">template</span> <<span class="keyword">class</span> S>00026 <span class="keyword">inline</span> <span class="keywordtype">void</span> AdditiveCipherTemplate<S>::ProcessData(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00027 {00028 <span class="keywordflow">if</span> (m_leftOver > 0)00029 {00030 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = STDMIN(m_leftOver, length);00031 xorbuf(outString, inString, KeystreamBufferEnd()-m_leftOver, len);00032 length -= len;00033 m_leftOver -= len;00034 inString += len;00035 outString += len;00036 }00037 00038 <span class="keywordflow">if</span> (!length)00039 <span class="keywordflow">return</span>;00040 00041 assert(m_leftOver == 0);00042 00043 PolicyInterface &policy = AccessPolicy();00044 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bytesPerIteration = policy.GetBytesPerIteration();00045 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alignment = policy.GetAlignment();00046 00047 <span class="keywordflow">if</span> (policy.CanOperateKeystream() && length >= bytesPerIteration && IsAlignedOn(outString, alignment))00048 {00049 <span class="keywordflow">if</span> (IsAlignedOn(inString, alignment))00050 policy.OperateKeystream(XOR_KEYSTREAM, outString, inString, length / bytesPerIteration);00051 <span class="keywordflow">else</span>00052 {00053 memcpy(outString, inString, length);00054 policy.OperateKeystream(XOR_KEYSTREAM_INPLACE, outString, outString, length / bytesPerIteration);00055 }00056 inString += length - length % bytesPerIteration;00057 outString += length - length % bytesPerIteration;00058 length %= bytesPerIteration;00059 00060 <span class="keywordflow">if</span> (!length)00061 <span class="keywordflow">return</span>;00062 }00063 00064 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferByteSize = GetBufferByteSize(policy);00065 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bufferIterations = policy.GetIterationsToBuffer();00066 00067 <span class="keywordflow">while</span> (length >= bufferByteSize)00068 {00069 policy.WriteKeystream(m_buffer, bufferIterations);00070 xorbuf(outString, inString, KeystreamBufferBegin(), bufferByteSize);00071 length -= bufferByteSize;00072 inString += bufferByteSize;00073 outString += bufferByteSize;00074 }00075 00076 <span class="keywordflow">if</span> (length > 0)00077 {00078 policy.WriteKeystream(m_buffer, bufferIterations);00079 xorbuf(outString, inString, KeystreamBufferBegin(), length);00080 m_leftOver = bytesPerIteration - length;00081 }00082 }00083 00084 <span class="keyword">template</span> <<span class="keyword">class</span> S>00085 <span class="keywordtype">void</span> AdditiveCipherTemplate<S>::Resynchronize(<span class="keyword">const</span> byte *iv)00086 {00087 PolicyInterface &policy = AccessPolicy();00088 m_leftOver = 0;00089 m_buffer.New(GetBufferByteSize(policy));00090 policy.CipherResynchronize(m_buffer, iv);00091 }00092 00093 <span class="keyword">template</span> <<span class="keyword">class</span> BASE>00094 <span class="keywordtype">void</span> AdditiveCipherTemplate<BASE>::Seek(dword position)00095 {00096 PolicyInterface &policy = AccessPolicy();00097 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bytesPerIteration = policy.GetBytesPerIteration();00098 00099 policy.SeekToIteration(position / bytesPerIteration);00100 position %= bytesPerIteration;00101 00102 <span class="keywordflow">if</span> (position > 0)00103 {00104 policy.WriteKeystream(m_buffer, 1);00105 m_leftOver = bytesPerIteration - position;00106 }00107 <span class="keywordflow">else</span>00108 m_leftOver = 0;00109 }00110 00111 <span class="keyword">template</span> <<span class="keyword">class</span> BASE>00112 <span class="keywordtype">void</span> CFB_CipherTemplate<BASE>::Resynchronize(<span class="keyword">const</span> byte *iv)00113 {00114 PolicyInterface &policy = AccessPolicy();00115 policy.CipherResynchronize(iv);00116 m_leftOver = policy.GetBytesPerIteration();00117 }00118 00119 <span class="keyword">template</span> <<span class="keyword">class</span> BASE>00120 <span class="keywordtype">void</span> CFB_CipherTemplate<BASE>::ProcessData(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00121 {00122 PolicyInterface &policy = AccessPolicy();00123 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bytesPerIteration = policy.GetBytesPerIteration();00124 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> alignment = policy.GetAlignment();00125 byte *reg = policy.GetRegisterBegin();00126 00127 <span class="keywordflow">if</span> (m_leftOver)00128 {00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = STDMIN(m_leftOver, length);00130 CombineMessageAndShiftRegister(outString, reg + bytesPerIteration - m_leftOver, inString, len);00131 m_leftOver -= len;00132 length -= len;00133 inString += len;00134 outString += len;00135 }00136 00137 <span class="keywordflow">if</span> (!length)00138 <span class="keywordflow">return</span>;00139 00140 assert(m_leftOver == 0);00141 00142 <span class="keywordflow">if</span> (policy.CanIterate() && length >= bytesPerIteration && IsAlignedOn(outString, alignment))00143 {00144 <span class="keywordflow">if</span> (IsAlignedOn(inString, alignment))00145 policy.Iterate(outString, inString, GetCipherDir(*<span class="keyword">this</span>), length / bytesPerIteration);00146 <span class="keywordflow">else</span>00147 {00148 memcpy(outString, inString, length);00149 policy.Iterate(outString, outString, GetCipherDir(*<span class="keyword">this</span>), length / bytesPerIteration);00150 }00151 inString += length - length % bytesPerIteration;00152 outString += length - length % bytesPerIteration;00153 length %= bytesPerIteration;00154 }00155 00156 <span class="keywordflow">while</span> (length >= bytesPerIteration)00157 {00158 policy.TransformRegister();00159 CombineMessageAndShiftRegister(outString, reg, inString, bytesPerIteration);00160 length -= bytesPerIteration;00161 inString += bytesPerIteration;00162 outString += bytesPerIteration;00163 }00164 00165 <span class="keywordflow">if</span> (length > 0)00166 {00167 policy.TransformRegister();00168 CombineMessageAndShiftRegister(outString, reg, inString, length);00169 m_leftOver = bytesPerIteration - length;00170 }00171 }00172 00173 <span class="keyword">template</span> <<span class="keyword">class</span> BASE>00174 <span class="keywordtype">void</span> CFB_EncryptionTemplate<BASE>::CombineMessageAndShiftRegister(byte *output, byte *reg, <span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00175 {00176 xorbuf(reg, message, length);00177 memcpy(output, reg, length);00178 }00179 00180 <span class="keyword">template</span> <<span class="keyword">class</span> BASE>00181 <span class="keywordtype">void</span> CFB_DecryptionTemplate<BASE>::CombineMessageAndShiftRegister(byte *output, byte *reg, <span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00182 {00183 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<length; i++)00184 {00185 byte b = message[i];00186 output[i] = reg[i] ^ b;00187 reg[i] = b;00188 }00189 }00190 00191 NAMESPACE_END00192 00193 <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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -