📄 mars_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++: mars.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>mars.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// mars.cpp - modified by Sean Woods from Brian Gladman's mars6.c for Crypto++</span>00002 <span class="comment">// key setup updated by Wei Dai to reflect IBM's "tweak" proposed in August 1999</span>00003 00004 <span class="comment">/* This is an independent implementation of the MARS encryption */</span>00005 <span class="comment">/* algorithm designed by a team at IBM as a candidate for the US */</span>00006 <span class="comment">/* NIST Advanced Encryption Standard (AES) effort. The algorithm */</span>00007 <span class="comment">/* is subject to Patent action by IBM, who intend to offer royalty */</span>00008 <span class="comment">/* free use if a Patent is granted. */</span>00009 <span class="comment">/* */</span>00010 <span class="comment">/* Copyright in this implementation is held by Dr B R Gladman but */</span>00011 <span class="comment">/* I hereby give permission for its free direct or derivative use */</span>00012 <span class="comment">/* subject to acknowledgment of its origin and compliance with any */</span>00013 <span class="comment">/* constraints that IBM place on the use of the MARS algorithm. */</span>00014 <span class="comment">/* */</span>00015 <span class="comment">/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 4th October 1998 */</span>00016 00017 <span class="preprocessor">#include "pch.h"</span>00018 <span class="preprocessor">#include "<a class="code" href="mars_8h.html">mars.h</a>"</span>00019 <span class="preprocessor">#include "misc.h"</span>00020 00021 NAMESPACE_BEGIN(CryptoPP)00022 00023 ANONYMOUS_NAMESPACE_BEGIN00024 <span class="keyword">static</span> word32 gen_mask(word32 x)00025 {00026 word32 m;00027 00028 m = (~x ^ (x >> 1)) & 0x7fffffff;00029 m &= (m >> 1) & (m >> 2); m &= (m >> 3) & (m >> 6); 00030 00031 <span class="keywordflow">if</span>(!m)00032 <span class="keywordflow">return</span> 0;00033 00034 m <<= 1; m |= (m << 1); m |= (m << 2); m |= (m << 4);00035 m |= (m << 1) & ~x & 0x80000000;00036 00037 <span class="keywordflow">return</span> m & 0xfffffffc;00038 };00039 NAMESPACE_END00040 00041 <span class="keywordtype">void</span> MARS::Base::UncheckedSetKey(CipherDir direction, <span class="keyword">const</span> byte *userKey, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00042 {00043 AssertValidKeyLength(length);00044 00045 <span class="comment">// Initialize T[] with the key data</span>00046 FixedSizeSecBlock<word32, 15> T;00047 GetUserKey(LITTLE_ENDIAN_ORDER, T.begin(), 15, userKey, length);00048 T[length/4] = length/4;00049 00050 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j=0; j<4; j++) <span class="comment">// compute 10 words of K[] in each iteration</span>00051 {00052 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00053 <span class="comment">// Do linear transformation</span>00054 <span class="keywordflow">for</span> (i=0; i<15; i++)00055 T[i] = T[i] ^ rotlFixed(T[(i+8)%15] ^ T[(i+13)%15], 3) ^ (4*i+j);00056 00057 <span class="comment">// Do four rounds of stirring</span>00058 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> k=0; k<4; k++)00059 <span class="keywordflow">for</span> (i=0; i<15; i++)00060 T[i] = rotlFixed(T[i] + Sbox[T[(i+14)%15]%512], 9);00061 00062 <span class="comment">// Store next 10 key words into K[]</span>00063 <span class="keywordflow">for</span> (i=0; i<10; i++)00064 EK[10*j+i] = T[4*i%15];00065 }00066 00067 <span class="comment">// Modify multiplication key-words</span>00068 <span class="keywordflow">for</span>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 5; i < 37; i += 2)00069 {00070 word32 w = EK[i] | 3;00071 word32 m = gen_mask(w);00072 <span class="keywordflow">if</span>(m)00073 w ^= (rotlMod(Sbox[265 + (EK[i] & 3)], EK[i-1]) & m);00074 EK[i] = w;00075 }00076 }00077 00078 <span class="preprocessor">#define f_mix(a,b,c,d) \</span>00079 <span class="preprocessor"> r = rotrFixed(a, 8); \</span>00080 <span class="preprocessor"> b ^= Sbox[a & 255]; \</span>00081 <span class="preprocessor"> b += Sbox[(r & 255) + 256]; \</span>00082 <span class="preprocessor"> r = rotrFixed(a, 16); \</span>00083 <span class="preprocessor"> a = rotrFixed(a, 24); \</span>00084 <span class="preprocessor"> c += Sbox[r & 255]; \</span>00085 <span class="preprocessor"> d ^= Sbox[(a & 255) + 256]</span>00086 <span class="preprocessor"></span>00087 <span class="preprocessor">#define b_mix(a,b,c,d) \</span>00088 <span class="preprocessor"> r = rotlFixed(a, 8); \</span>00089 <span class="preprocessor"> b ^= Sbox[(a & 255) + 256]; \</span>00090 <span class="preprocessor"> c -= Sbox[r & 255]; \</span>00091 <span class="preprocessor"> r = rotlFixed(a, 16); \</span>00092 <span class="preprocessor"> a = rotlFixed(a, 24); \</span>00093 <span class="preprocessor"> d -= Sbox[(r & 255) + 256]; \</span>00094 <span class="preprocessor"> d ^= Sbox[a & 255]</span>00095 <span class="preprocessor"></span>00096 <span class="preprocessor">#define f_ktr(a,b,c,d,i) \</span>00097 <span class="preprocessor"> m = a + EK[i]; \</span>00098 <span class="preprocessor"> a = rotlFixed(a, 13); \</span>00099 <span class="preprocessor"> r = a * EK[i + 1]; \</span>00100 <span class="preprocessor"> l = Sbox[m & 511]; \</span>00101 <span class="preprocessor"> r = rotlFixed(r, 5); \</span>00102 <span class="preprocessor"> l ^= r; \</span>00103 <span class="preprocessor"> c += rotlMod(m, r); \</span>00104 <span class="preprocessor"> r = rotlFixed(r, 5); \</span>00105 <span class="preprocessor"> l ^= r; \</span>00106 <span class="preprocessor"> d ^= r; \</span>00107 <span class="preprocessor"> b += rotlMod(l, r)</span>00108 <span class="preprocessor"></span>00109 <span class="preprocessor">#define r_ktr(a,b,c,d,i) \</span>00110 <span class="preprocessor"> r = a * EK[i + 1]; \</span>00111 <span class="preprocessor"> a = rotrFixed(a, 13); \</span>00112 <span class="preprocessor"> m = a + EK[i]; \</span>00113 <span class="preprocessor"> l = Sbox[m & 511]; \</span>00114 <span class="preprocessor"> r = rotlFixed(r, 5); \</span>00115 <span class="preprocessor"> l ^= r; \</span>00116 <span class="preprocessor"> c -= rotlMod(m, r); \</span>00117 <span class="preprocessor"> r = rotlFixed(r, 5); \</span>00118 <span class="preprocessor"> l ^= r; \</span>00119 <span class="preprocessor"> d ^= r; \</span>00120 <span class="preprocessor"> b -= rotlMod(l, r)</span>00121 <span class="preprocessor"></span>00122 <span class="keyword">typedef</span> BlockGetAndPut<word32, LittleEndian> Block;00123 00124 <span class="keywordtype">void</span> MARS::Enc::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>00125 <span class="keyword"></span>{00126 word32 a, b, c, d, l, m, r;00127 00128 Block::Get(inBlock)(a)(b)(c)(d);00129 00130 a += EK[0];00131 b += EK[1];00132 c += EK[2];00133 d += EK[3];00134 00135 <span class="keywordtype">int</span> i;00136 <span class="keywordflow">for</span> (i = 0; i < 2; i++) {00137 f_mix(a,b,c,d);00138 a += d;00139 f_mix(b,c,d,a);00140 b += c;00141 f_mix(c,d,a,b);00142 f_mix(d,a,b,c);00143 }00144 00145 f_ktr(a,b,c,d, 4); f_ktr(b,c,d,a, 6); f_ktr(c,d,a,b, 8); f_ktr(d,a,b,c,10); 00146 f_ktr(a,b,c,d,12); f_ktr(b,c,d,a,14); f_ktr(c,d,a,b,16); f_ktr(d,a,b,c,18); 00147 f_ktr(a,d,c,b,20); f_ktr(b,a,d,c,22); f_ktr(c,b,a,d,24); f_ktr(d,c,b,a,26); 00148 f_ktr(a,d,c,b,28); f_ktr(b,a,d,c,30); f_ktr(c,b,a,d,32); f_ktr(d,c,b,a,34); 00149 00150 <span class="keywordflow">for</span> (i = 0; i < 2; i++) {00151 b_mix(a,b,c,d);00152 b_mix(b,c,d,a);00153 c -= b;00154 b_mix(c,d,a,b);00155 d -= a;00156 b_mix(d,a,b,c);00157 }00158 00159 a -= EK[36];00160 b -= EK[37];00161 c -= EK[38];00162 d -= EK[39];00163 00164 Block::Put(xorBlock, outBlock)(a)(b)(c)(d);00165 }00166 00167 <span class="keywordtype">void</span> MARS::Dec::ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock)<span class="keyword"> const</span>00168 <span class="keyword"></span>{00169 word32 a, b, c, d, l, m, r;00170 00171 Block::Get(inBlock)(d)(c)(b)(a);00172 00173 d += EK[36];00174 c += EK[37];00175 b += EK[38];00176 a += EK[39];00177 00178 <span class="keywordtype">int</span> i;00179 <span class="keywordflow">for</span> (i = 0; i < 2; i++) {00180 f_mix(a,b,c,d);00181 a += d;00182 f_mix(b,c,d,a);00183 b += c;00184 f_mix(c,d,a,b);00185 f_mix(d,a,b,c);00186 }00187 00188 r_ktr(a,b,c,d,34); r_ktr(b,c,d,a,32); r_ktr(c,d,a,b,30); r_ktr(d,a,b,c,28);00189 r_ktr(a,b,c,d,26); r_ktr(b,c,d,a,24); r_ktr(c,d,a,b,22); r_ktr(d,a,b,c,20);00190 r_ktr(a,d,c,b,18); r_ktr(b,a,d,c,16); r_ktr(c,b,a,d,14); r_ktr(d,c,b,a,12);00191 r_ktr(a,d,c,b,10); r_ktr(b,a,d,c, 8); r_ktr(c,b,a,d, 6); r_ktr(d,c,b,a, 4);00192 00193 <span class="keywordflow">for</span> (i = 0; i < 2; i++) {00194 b_mix(a,b,c,d);00195 b_mix(b,c,d,a);00196 c -= b;00197 b_mix(c,d,a,b);00198 d -= a;00199 b_mix(d,a,b,c);00200 }00201 00202 d -= EK[0];00203 c -= EK[1];00204 b -= EK[2];00205 a -= EK[3];00206 00207 Block::Put(xorBlock, outBlock)(d)(c)(b)(a);00208 }00209 00210 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:19 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 + -