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

📄 mars_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 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&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &gt;&gt; 1)) &amp; 0x7fffffff;00029         m &amp;= (m &gt;&gt; 1) &amp; (m &gt;&gt; 2); m &amp;= (m &gt;&gt; 3) &amp; (m &gt;&gt; 6); 00030 00031         <span class="keywordflow">if</span>(!m)00032                 <span class="keywordflow">return</span> 0;00033 00034         m &lt;&lt;= 1; m |= (m &lt;&lt; 1); m |= (m &lt;&lt; 2); m |= (m &lt;&lt; 4);00035         m |= (m &lt;&lt; 1) &amp; ~x &amp; 0x80000000;00036 00037         <span class="keywordflow">return</span> m &amp; 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&lt;word32, 15&gt; 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&lt;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&lt;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&lt;4; k++)00059                         <span class="keywordflow">for</span> (i=0; i&lt;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&lt;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 &lt; 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] &amp; 3)], EK[i-1]) &amp; 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 &amp; 255];                             \</span>00081 <span class="preprocessor">                b += Sbox[(r &amp; 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 &amp; 255];                             \</span>00085 <span class="preprocessor">                d ^= Sbox[(a &amp; 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 &amp; 255) + 256];             \</span>00090 <span class="preprocessor">                c -= Sbox[r &amp; 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 &amp; 255) + 256];             \</span>00094 <span class="preprocessor">                d ^= Sbox[a &amp; 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 &amp; 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 &amp; 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&lt;word32, LittleEndian&gt; 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 &lt; 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 &lt; 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 &lt; 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 &lt; 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 + -