天天看點

AES加密算法詳解$$ \begin{bmatrix} b_{0,0} & b_{0,1} & b_{0,2} & b_{0,3} \ b_{1,0} & b_{1,1} & b_{1,2} & b_{1,3} \ b_{2,0} & b_{2,1} & b_{2,2} & b_{2,3} \ b_{3,0} & b_{3,1} & b_{3,2} & b_{3,3} \ \end{bmatrix}

前言

AES算法是目前最流行的對稱加密算法,也是一種分組加密算法,分組密碼就是把明文分為固定長度的一組一組,每次加密一組資料,直到加密完整個明文資料。AES算法根據分組長度可以分為AES128, AES192,AES256,其所要求的秘鑰長度和加密輪數也各不相同。鑒于這三種模式的算法在本質上沒有差別,是以本文主要介紹AES-128(資料分組為16位元組,秘鑰長度為16位元組,加密輪數為10輪),并給出C語言實作。

确切的說分組密碼隻是規定了怎麼加密一組明文,如果明文資料比較長,其他的組需要怎麼進行加密取決于使用何種分組密碼工作模式。對于AES-128而言,每次隻加密16位元組長度的資料,如果明文長度為32位元組話,我們很容易想到第2組16位元組可以仿照第1組16位元組資料進行處理,這就是最簡單的分組密碼工作模式ECB(電子密碼本)模式,本文主要講述AES算法實作,對于長資料也是使用這種最簡單的ECB分組處理方式,更多其他分組密碼工作模式,請參考另一篇文章圖解分組密碼五大工作模式。

前面讨論的資料長度都是16位元組,或者其整倍數長度的加密算法實作,對于資料長度不是分組長度整倍數的情形,通常需要對資料進行填充,使其長度達到分組長度的整倍數再來進行加密。對于資料長度不足分組長度整倍數使用何種格式進行資料填充有多種不同的填充标準,比如在資料後面填充二進制的0x0,直到達到要求的長度,這就是ZeroPadding方式;比如資料缺少幾位就填充二進制的幾,例如缺少4位填充0x04 0x04 0x04 0x04,這就是PKCS7/PKCS5填充方式。本文提供的實作不涉及資料填充,假定明文資料都是16位元組的整倍數長度。

AES算法流程

AES算法主要可以分為秘鑰擴充、位元組替換、行移位、列混合和輪秘鑰加這5個步驟。

  • 秘鑰擴充(KeyExpansions:給定的初始秘鑰一般比較短,比如16位元組,而算法如果進行10輪運算的話就需要16x(10+1)位元組長度的秘鑰,需要對原始秘鑰進行秘鑰擴充。
  • 位元組替換(SubBytes):一個非線性的替換步驟,根據查表把一個位元組替換為另一個位元組。
  • 行移位(ShiftRows):将資料矩陣的每一行循環移位一定長度。
  • 列混合(MixColumns):将資料矩陣乘以一個固定的矩陣,增加混淆程度。
  • 輪秘鑰加(AddRoundKey):将資料矩陣與秘鑰矩陣進行異或操作。

AES加密

AES-128加密流程可以使用如下僞代碼表示:

AES-128加密(uint8 in[16], uint8 out[16], uint8 key[16]){
  uint8 state[4,4] = in;
  uint32 w[44] = KeyExpansions(key[16]);
           

addRoundKey(state, w[0-3]);

for (int j = 1; j < 10; ++j) {

subBytes(state);

shiftRows(state);

mixColumns(state);

addRoundKey(state, w); //w[4-7],w[8-11]…w[37-40]

}

subBytes(state);

shiftRows(state);

addRoundKey(state, w[41-44]);

out = state;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

AES解密

AES-128解密流程可以使用如下僞代碼表示:

AES-128解密(uint8 in[16], uint8 out[16], uint8 key[16]){
  uint8 state[4,4] = in;
  uint32 w[44] = KeyExpansions(key[16]);
  //此時使用的秘鑰是加密時使用的秘鑰的倒序
  addRoundKey(state, w[41-44]);
           

for (int j = 1; j < 10; ++j) {

inverse-subBytes(state);

inverse-shiftRows(state);

inverse-mixColumns(state);

addRoundKey(state, w); //w[37-40], … w[8-11],w[4-7],…

}

inverse-subBytes(state);

inverse-shiftRows(state);

addRoundKey(state, w[0-3]);

out = state;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

AES算法步驟

前提

AES運算都是以下4x4位元組表示的二維數組矩陣

uint8_t state[4][4]

為一個機關,把一個連續的序列"1234567890abcdef"放在矩陣中,對應的順序為下圖所示。一定要注意 排列的順序是豎排的,不是橫排的!

AES加密算法詳解$$ \begin{bmatrix} b_{0,0} &amp; b_{0,1} &amp; b_{0,2} &amp; b_{0,3} \ b_{1,0} &amp; b_{1,1} &amp; b_{1,2} &amp; b_{1,3} \ b_{2,0} &amp; b_{2,1} &amp; b_{2,2} &amp; b_{2,3} \ b_{3,0} &amp; b_{3,1} &amp; b_{3,2} &amp; b_{3,3} \ \end{bmatrix}

秘鑰擴充 KeyExpansion

示例秘鑰key = “abcdefghijklmnop”={0x61, 0x62,…,0x6F,0x70}。

AES128中原始秘鑰key為16位元組,運算中需要11個矩陣大小的秘鑰,每一列所包含的32位記為一個

uint32_t W

,是以秘鑰擴充一共需要生産44個列

W

,即

uint32_t W[44]

AES加密算法詳解$$ \begin{bmatrix} b_{0,0} &amp; b_{0,1} &amp; b_{0,2} &amp; b_{0,3} \ b_{1,0} &amp; b_{1,1} &amp; b_{1,2} &amp; b_{1,3} \ b_{2,0} &amp; b_{2,1} &amp; b_{2,2} &amp; b_{2,3} \ b_{3,0} &amp; b_{3,1} &amp; b_{3,2} &amp; b_{3,3} \ \end{bmatrix}

W[0-3]為直接複制的原始秘鑰。

  • W[0] = 0x61626364.
  • W[1] = 0x65666768.
  • W[2] = 0x696A6B6C.
  • W[3] = 0x6D6E6F70.

W[4-43]為擴充的秘鑰。

W[n]
    
    
     =
    
    
     
      {
     
     
      
       
        
         
          
           W[n-4]
          
          
           ⊕
          
          
           W[n-1]
          
          
           ,
          
         
        
       
       
        
         
          
           if&nbsp;n&nbsp;!=&nbsp;4的倍數
          
          
           .
          
         
        
       
      
      
       
        
         
          
           W[n-4]
          
          
           ⊕
          
          
           Mix(W[n-1])
          
          
           ⊕
          
          
           rcon[(n/4)&nbsp;-&nbsp;1]
          
          
           ,
          
         
        
       
       
        
         
          
           if&nbsp;n&nbsp;==&nbsp;4的倍數
          
          
           .
          
         
        
       
      
     
    
   
   
     \text {W[n]}= <span class="MathJax_Preview" style="color: inherit; display: none;"></span><div class="MathJax_Display"><span class="MathJax MathJax_FullWidth" id="MathJax-Element-1-Frame" tabindex="0" style="position: relative;" data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;><mrow><mo>{</mo><mtable columnalign=&quot;left left&quot; rowspacing=&quot;1.06em 0.2em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;false&quot;><mtr><mtd><mtext>W[n-4]</mtext><mo>&amp;#x2295;</mo><mtext>W[n-1]</mtext><mo>,</mo></mtd><mtd><mi>a</mi><mi>m</mi><mi>p</mi><mo>;</mo><mtext>if n != 4&amp;#x7684;&amp;#x500D;&amp;#x6570;</mtext><mo>.</mo></mtd></mtr><mtr><mtd><mtext>W[n-4]</mtext><mo>&amp;#x2295;</mo><mtext>Mix(W[n-1])</mtext><mo>&amp;#x2295;</mo><mtext>rcon[(n/4) - 1]</mtext><mo>,</mo></mtd><mtd><mi>a</mi><mi>m</mi><mi>p</mi><mo>;</mo><mtext>if n == 4&amp;#x7684;&amp;#x500D;&amp;#x6570;</mtext><mo>.</mo></mtd></mtr></mtable><mo fence=&quot;true&quot; stretchy=&quot;true&quot; symmetric=&quot;true&quot;></mo></mrow></math>" role="presentation"><nobr aria-hidden="true"><span class="math" id="MathJax-Span-1" style="width: 100%; display: inline-block; min-width: 27.97em;"><span style="display: inline-block; position: relative; width: 100%; height: 0px; font-size: 102%;"><span style="position: absolute; clip: rect(2.181em, 1027.41em, 5.626em, -999.997em); top: -4.152em; left: 0em; width: 100%;"><span class="mrow" id="MathJax-Span-2"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(2.181em, 1027.41em, 5.626em, -999.997em); top: -4.152em; left: 50%; margin-left: -13.677em;"><span class="mrow" id="MathJax-Span-3"><span class="mo" id="MathJax-Span-4" style="vertical-align: 0em;"><span style="font-family: MathJax_Size4;">{</span></span><span class="mtable" id="MathJax-Span-5" style="padding-right: 0.155em; padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 26.298em; height: 0px;"><span style="position: absolute; clip: rect(2.181em, 1017.13em, 5.576em, -999.997em); top: -4.101em; left: 0em;"><span style="display: inline-block; position: relative; width: 17.229em; height: 0px;"><span style="position: absolute; width: 100%; clip: rect(3.093em, 1007.35em, 4.41em, -999.997em); top: -5.013em; left: 0em;"><span class="mtd" id="MathJax-Span-6"><span class="mrow" id="MathJax-Span-7"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1007.35em, 4.41em, -999.997em); top: -4em; left: 50%; margin-left: -3.696em;"><span class="mtext" id="MathJax-Span-8" style="font-family: MathJax_Main;">W[n-4]</span><span class="mo" id="MathJax-Span-9" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mtext" id="MathJax-Span-10" style="font-family: MathJax_Main; padding-left: 0.205em;">W[n-1]</span><span class="mo" id="MathJax-Span-11" style="font-family: MathJax_Main;">,</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1017.13em, 4.41em, -999.997em); top: -2.936em; left: 0em;"><span class="mtd" id="MathJax-Span-20"><span class="mrow" id="MathJax-Span-21"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1017.13em, 4.41em, -999.997em); top: -4em; left: 50%; margin-left: -8.611em;"><span class="mtext" id="MathJax-Span-22" style="font-family: MathJax_Main;">W[n-4]</span><span class="mo" id="MathJax-Span-23" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mtext" id="MathJax-Span-24" style="font-family: MathJax_Main; padding-left: 0.205em;">Mix(W[n-1])</span><span class="mo" id="MathJax-Span-25" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mtext" id="MathJax-Span-26" style="font-family: MathJax_Main; padding-left: 0.205em;">rcon[(n/4) - 1]</span><span class="mo" id="MathJax-Span-27" style="font-family: MathJax_Main;">,</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span><span style="display: inline-block; width: 0px; height: 4.107em;"></span></span><span style="position: absolute; clip: rect(2.131em, 1008.01em, 5.525em, -999.997em); top: -4.101em; left: 18.242em;"><span style="display: inline-block; position: relative; width: 8.058em; height: 0px;"><span style="position: absolute; width: 100%; clip: rect(3.043em, 1007.5em, 4.36em, -999.997em); top: -5.013em; left: 0em;"><span class="mtd" id="MathJax-Span-12"><span class="mrow" id="MathJax-Span-13"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.043em, 1007.5em, 4.36em, -999.997em); top: -4em; left: 50%; margin-left: -3.797em;"><span class="mi" id="MathJax-Span-14" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-15" style="font-family: MathJax_Math-italic;">m</span><span class="mi" id="MathJax-Span-16" style="font-family: MathJax_Math-italic;">p</span><span class="mo" id="MathJax-Span-17" style="font-family: MathJax_Main;">;</span><span class="mtext" id="MathJax-Span-18" style="font-family: MathJax_Main; padding-left: 0.155em;">if n != 4<span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">的</span><span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">倍</span><span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">數</span></span><span class="mo" id="MathJax-Span-19" style="font-family: MathJax_Main;">.</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.043em, 1008.01em, 4.36em, -999.997em); top: -2.936em; left: 0em;"><span class="mtd" id="MathJax-Span-28"><span class="mrow" id="MathJax-Span-29"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.043em, 1008.01em, 4.36em, -999.997em); top: -4em; left: 50%; margin-left: -4.051em;"><span class="mi" id="MathJax-Span-30" style="font-family: MathJax_Math-italic;">a</span><span class="mi" id="MathJax-Span-31" style="font-family: MathJax_Math-italic;">m</span><span class="mi" id="MathJax-Span-32" style="font-family: MathJax_Math-italic;">p</span><span class="mo" id="MathJax-Span-33" style="font-family: MathJax_Main;">;</span><span class="mtext" id="MathJax-Span-34" style="font-family: MathJax_Main; padding-left: 0.155em;">if n == 4<span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">的</span><span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">倍</span><span style="font-family: STIXGeneral, &quot;Arial Unicode MS&quot;, serif; font-size: 98%; font-style: normal; font-weight: normal;">數</span></span><span class="mo" id="MathJax-Span-35" style="font-family: MathJax_Main;">.</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span><span style="display: inline-block; width: 0px; height: 4.107em;"></span></span></span></span><span class="mo" id="MathJax-Span-36"></span></span><span style="display: inline-block; width: 0px; height: 4.157em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.157em;"></span></span></span><span style="display: inline-block; overflow: hidden; vertical-align: -1.393em; border-left: 0px solid; width: 0px; height: 3.31em;"></span></span></nobr><span class="MJX_Assistive_MathML MJX_Assistive_MathML_Block" role="presentation"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow><mo>{</mo><mtable columnalign="left left" rowspacing="1.06em 0.2em" columnspacing="1em" displaystyle="false"><mtr><mtd><mtext>W[n-4]</mtext><mo>⊕</mo><mtext>W[n-1]</mtext><mo>,</mo></mtd><mtd><mi>a</mi><mi>m</mi><mi>p</mi><mo>;</mo><mtext>if n != 4的倍數</mtext><mo>.</mo></mtd></mtr><mtr><mtd><mtext>W[n-4]</mtext><mo>⊕</mo><mtext>Mix(W[n-1])</mtext><mo>⊕</mo><mtext>rcon[(n/4) - 1]</mtext><mo>,</mo></mtd><mtd><mi>a</mi><mi>m</mi><mi>p</mi><mo>;</mo><mtext>if n == 4的倍數</mtext><mo>.</mo></mtd></mtr></mtable><mo fence="true" stretchy="true" symmetric="true"></mo></mrow></math></span></span></div><script type="math/tex; mode=display" id="MathJax-Element-1">\begin{cases} \text {W[n-4]} \oplus \text {W[n-1]}, &amp; \text {if n != 4的倍數}. \\[2ex] \text {W[n-4]} \oplus \text {Mix(W[n-1])} \oplus \text {rcon[(n/4) - 1]}, &amp; \text {if n == 4的倍數} . \end{cases}</script> 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord text"><span class="mord">W[n]</span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 3.742em; vertical-align: -1.621em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 2.05002em;"><span class="" style="top: -2.49999em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎩</span></span></span><span class="" style="top: -3.15001em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎨</span></span></span><span class="" style="top: -4.30002em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 1.55002em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 2.121em;"><span class="" style="top: -4.121em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">W[n-4]</span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord text"><span class="mord">W[n-1]</span></span><span class="mpunct">,</span></span></span><span class="" style="top: -1.819em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">W[n-4]</span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord text"><span class="mord">Mix(W[n-1])</span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord text"><span class="mord">rcon[(n/4)&nbsp;-&nbsp;1]</span></span><span class="mpunct">,</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 1.621em;"><span class=""></span></span></span></span></span><span class="arraycolsep" style="width: 1em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 2.121em;"><span class="" style="top: -4.121em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">if&nbsp;n&nbsp;!=&nbsp;4</span><span class="mord cjk_fallback">的倍數</span></span><span class="mord">.</span></span></span><span class="" style="top: -1.819em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">if&nbsp;n&nbsp;==&nbsp;4</span><span class="mord cjk_fallback">的倍數</span></span><span class="mord">.</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 1.621em;"><span class=""></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p> 
           
Mix
   
   
    (
   
   
    x
   
   
    )
   
   
    =
   
   
    SubWord
   
   
    (
   
   
    RotWord
   
   
    (
   
   
    x
   
   
    )
   
   
    )
   
  
  
   \text {Mix}(x) = \text {SubWord}(\text{RotWord}(x))
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord text"><span class="mord">Mix</span></span><span class="mopen">(</span><span class="mord mathit">x</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord text"><span class="mord">SubWord</span></span><span class="mopen">(</span><span class="mord text"><span class="mord">RotWord</span></span><span class="mopen">(</span><span class="mord mathit">x</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p> 
           

RotWord()為循環左移一位,如輸入0x12345678,輸出0x34567812。

SubWord()為位元組替換,可以參考位元組替換。

rcon為輪常量異或,常量數組為:

static const uint32_t rcon[10] = {
        0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL, 0x10000000UL,
        0x20000000UL, 0x40000000UL, 0x80000000UL, 0x1B000000UL, 0x36000000UL
};
           
  • 1
  • 2
  • 3
  • 4

秘鑰key = “abcdefghijklmnop”,秘鑰擴充後生成的擴充秘鑰uint32_t W[44]為:

W[ 0-3 ] 61626364 65666768 696A6B6C 6D6E6F70   
W[ 4-7 ] FFCA3258 9AAC5530 F3C63E5C 9EA8512C   
W[ 8-11] 3F1B4353 A5B71663 5671283F C8D97913   
W[12-15] 0EAD3EBB AB1A28D8 FD6B00E7 35B279F4   
W[16-19] 311B812D 9A01A9F5 676AA912 52D8D0E6   
W[20-23] 406B0F2D DA6AA6D8 BD000FCA EFD8DF2C   
W[24-27] 01F57EF2 DB9FD82A 669FD7E0 894708CC   
W[28-31] E1C53555 3A5AED7F 5CC53A9F D5823253   
W[32-35] 72E6D856 48BC3529 14790FB6 C1FB3DE5   
W[36-39] 66C1012E 2E7D3407 3A043BB1 FBFF0654   
W[40-43] 46AE2121 68D31526 52D72E97 A92828C3   
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

位元組替換 SubBytes

位元組替換就是簡單的查表操作,AES定義了加密用的S盒和解密用的逆S盒來進行位元組替換。

S盒為256個元素的數組,即1個位元組(0x00~0xff)可以表示的數量,是以進行位元組替換時可以直接把該位元組的值作為S盒數組的下标來進行替換。比如0x03位元組替換結果為S[0x03]=0x7B,逆S盒同理。圖示中

b
    
    
     
      2
     
     
      ,
     
     
      2
     
    
   
   
    =
   
   
    S
   
   
    [
   
   
    
     a
    
    
     
      2
     
     
      ,
     
     
      2
     
    
   
   
    ]
   
  
  
   b_{2,2} = S[a _{2,2}]
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.980548em; vertical-align: -0.286108em;"></span><span class="mord"><span class="mord mathit">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1.03611em; vertical-align: -0.286108em;"></span><span class="mord mathit" style="margin-right: 0.05764em;">S</span><span class="mopen">[</span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.301108em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">]</span></span></span></span></span>。</p> 
           
看到有的地方把S盒定義為16x16二維數組S[16][16],位元組替換時取該位元組的高4位作為行下标,低4位作為列下标。這種方式因為還得對需要替換位元組分别取高低位,得到結果再合并高低位,無疑把位元組替換操作複雜化了。采用S[256]一維數組完全可以省去這些不必要的操作。
AES加密算法詳解$$ \begin{bmatrix} b_{0,0} &amp; b_{0,1} &amp; b_{0,2} &amp; b_{0,3} \ b_{1,0} &amp; b_{1,1} &amp; b_{1,2} &amp; b_{1,3} \ b_{2,0} &amp; b_{2,1} &amp; b_{2,2} &amp; b_{2,3} \ b_{3,0} &amp; b_{3,1} &amp; b_{3,2} &amp; b_{3,3} \ \end{bmatrix}

S盒為

unsigned char S[256] = {
0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
};
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

解密時逆位元組替換就是使用逆S盒進行位元組替換,逆S盒為:

unsigned char inv_S[256] = {
0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
};
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

行移位 ShiftRows

前面已經說過,AES運算都是基于4x4二維數組進行的。行移位操作為:第0行不移動,第1行循環左移1位元組,第2行循環左移2位元組,第3行循環左移3位元組。

AES加密算法詳解$$ \begin{bmatrix} b_{0,0} &amp; b_{0,1} &amp; b_{0,2} &amp; b_{0,3} \ b_{1,0} &amp; b_{1,1} &amp; b_{1,2} &amp; b_{1,3} \ b_{2,0} &amp; b_{2,1} &amp; b_{2,2} &amp; b_{2,3} \ b_{3,0} &amp; b_{3,1} &amp; b_{3,2} &amp; b_{3,3} \ \end{bmatrix}

解密時逆行移位操作為:第0行不移動,第1行循環右移1位元組,第2行循環右移2位元組,第3行循環右移3位元組。

列混合 MixColumns

列混合通過矩陣相乘來實作,經過移位後的矩陣左乘一個固定的矩陣,得到混淆後的矩陣,如下公式所示

$$

\begin{bmatrix}

b_{0,0} & b_{0,1} & b_{0,2} & b_{0,3} \

b_{1,0} & b_{1,1} & b_{1,2} & b_{1,3} \

b_{2,0} & b_{2,1} & b_{2,2} & b_{2,3} \

b_{3,0} & b_{3,1} & b_{3,2} & b_{3,3} \

\end{bmatrix}

[2311 1231 1123 3112 ][2311 1231 1123 3112 ]

$$

上述矩陣相乘可以化簡為如下表達式:

{
    
    
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          (
         
         
          2
         
         
          ∗
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          (
         
         
          3
         
         
          ∗
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          (
         
         
          2
         
         
          ∗
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          (
         
         
          3
         
         
          ∗
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          (
         
         
          2
         
         
          ∗
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          (
         
         
          3
         
         
          ∗
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          (
         
         
          3
         
         
          ∗
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ⊕
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          ⊕
         
         
          (
         
         
          2
         
         
          ∗
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
    
   
   
     <span class="MathJax_Preview" style="color: inherit; display: none;"></span><div class="MathJax_Display"><span class="MathJax MathJax_FullWidth" id="MathJax-Element-4-Frame" tabindex="0" style="position: relative;" data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;><mrow><mo>{</mo><mtable columnalign=&quot;left left&quot; rowspacing=&quot;.2em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;false&quot;><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>&amp;#x2295;</mo><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>&amp;#x2217;</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr></mtable><mo fence=&quot;true&quot; stretchy=&quot;true&quot; symmetric=&quot;true&quot;></mo></mrow></math>" role="presentation"><nobr aria-hidden="true"><span class="math" id="MathJax-Span-237" style="width: 100%; display: inline-block; min-width: 17.938em;"><span style="display: inline-block; position: relative; width: 100%; height: 0px; font-size: 102%;"><span style="position: absolute; clip: rect(3.093em, 1017.58em, 8.362em, -999.997em); top: -5.976em; left: 0em; width: 100%;"><span class="mrow" id="MathJax-Span-238"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1017.58em, 8.362em, -999.997em); top: -5.976em; left: 50%; margin-left: -8.763em;"><span class="mrow" id="MathJax-Span-239"><span class="mo" id="MathJax-Span-240" style="vertical-align: 2.739em;"><span style="display: inline-block; position: relative; width: 0.915em; height: 0px;"><span style="position: absolute; font-family: MathJax_Size4; top: -3.088em; left: 0em;">⎧<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; font-family: MathJax_Size4; top: 0.053em; left: 0em;">⎩<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; font-family: MathJax_Size4; top: -1.264em; left: 0em;">⎨<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.835em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.581em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.379em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -0.352em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -0.099em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: 0.155em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mtable" id="MathJax-Span-241" style="padding-right: 0.155em; padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 16.368em; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1016.37em, 8.312em, -999.997em); top: -5.925em; left: 0em;"><span style="display: inline-block; position: relative; width: 16.368em; height: 0px;"><span style="position: absolute; width: 100%; clip: rect(3.093em, 1016.37em, 4.461em, -999.997em); top: -5.925em; left: 0em;"><span class="mtd" id="MathJax-Span-242"><span class="mrow" id="MathJax-Span-243"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1016.37em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -8.155em;"><span class="msubsup" id="MathJax-Span-244"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-245" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-246"><span class="mrow" id="MathJax-Span-247"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-248" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-249" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-250" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-251" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mo" id="MathJax-Span-252" style="font-family: MathJax_Main; padding-left: 0.256em;">(</span><span class="mn" id="MathJax-Span-253" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-254" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-255" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-256" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-257"><span class="mrow" id="MathJax-Span-258"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-259" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-260" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-261" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-262" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-263" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-264" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-265" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-266" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-267" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-268" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-269"><span class="mrow" id="MathJax-Span-270"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-271" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-272" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-273" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-274" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-275" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-276" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-277" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-278"><span class="mrow" id="MathJax-Span-279"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-280" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-281" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-282" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-283" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-284" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-285" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-286"><span class="mrow" id="MathJax-Span-287"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-288" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-289" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-290" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1016.37em, 4.461em, -999.997em); top: -4.659em; left: 0em;"><span class="mtd" id="MathJax-Span-291"><span class="mrow" id="MathJax-Span-292"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1016.37em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -8.155em;"><span class="msubsup" id="MathJax-Span-293"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-294" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-295"><span class="mrow" id="MathJax-Span-296"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-297" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-298" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-299" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-300" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="msubsup" id="MathJax-Span-301" style="padding-left: 0.256em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-302" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-303"><span class="mrow" id="MathJax-Span-304"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-305" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-306" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-307" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-308" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-309" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-310" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-311" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-312" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-313" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-314"><span class="mrow" id="MathJax-Span-315"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-316" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-317" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-318" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-319" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-320" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-321" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-322" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-323" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-324" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-325" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-326"><span class="mrow" id="MathJax-Span-327"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-328" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-329" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-330" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-331" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-332" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-333" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-334" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-335"><span class="mrow" id="MathJax-Span-336"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-337" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-338" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-339" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1016.27em, 4.461em, -999.997em); top: -3.341em; left: 0em;"><span class="mtd" id="MathJax-Span-340"><span class="mrow" id="MathJax-Span-341"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1016.27em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -8.155em;"><span class="msubsup" id="MathJax-Span-342"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-343" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-344"><span class="mrow" id="MathJax-Span-345"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-346" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-347" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-348" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-349" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="msubsup" id="MathJax-Span-350" style="padding-left: 0.256em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-351" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-352"><span class="mrow" id="MathJax-Span-353"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-354" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-355" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-356" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-357" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-358" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-359" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-360"><span class="mrow" id="MathJax-Span-361"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-362" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-363" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-364" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-365" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-366" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-367" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-368" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-369" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-370" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-371"><span class="mrow" id="MathJax-Span-372"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-373" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-374" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-375" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-376" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-377" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-378" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-379" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-380" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-381" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-382" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-383"><span class="mrow" id="MathJax-Span-384"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-385" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-386" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-387" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-388" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1016.27em, 4.461em, -999.997em); top: -2.075em; left: 0em;"><span class="mtd" id="MathJax-Span-389"><span class="mrow" id="MathJax-Span-390"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1016.27em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -8.155em;"><span class="msubsup" id="MathJax-Span-391"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-392" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-393"><span class="mrow" id="MathJax-Span-394"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-395" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-396" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-397" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-398" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mo" id="MathJax-Span-399" style="font-family: MathJax_Main; padding-left: 0.256em;">(</span><span class="mn" id="MathJax-Span-400" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-401" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-402" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-403" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-404"><span class="mrow" id="MathJax-Span-405"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-406" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-407" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-408" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-409" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-410" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-411" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-412" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-413"><span class="mrow" id="MathJax-Span-414"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-415" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-416" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-417" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-418" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="msubsup" id="MathJax-Span-419" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-420" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-421"><span class="mrow" id="MathJax-Span-422"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-423" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-424" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-425" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-426" style="font-family: MathJax_Main; padding-left: 0.205em;">⊕</span><span class="mo" id="MathJax-Span-427" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="mn" id="MathJax-Span-428" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-429" style="font-family: MathJax_Main; padding-left: 0.205em;">∗</span><span class="msubsup" id="MathJax-Span-430" style="padding-left: 0.205em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-431" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-432"><span class="mrow" id="MathJax-Span-433"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-434" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-435" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-436" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-437" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span><span style="display: inline-block; width: 0px; height: 5.93em;"></span></span></span></span><span class="mo" id="MathJax-Span-438"></span></span><span style="display: inline-block; width: 0px; height: 5.981em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 5.981em;"></span></span></span><span style="display: inline-block; overflow: hidden; vertical-align: -2.323em; border-left: 0px solid; width: 0px; height: 5.171em;"></span></span></nobr><span class="MJX_Assistive_MathML MJX_Assistive_MathML_Block" role="presentation"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow><mo>{</mo><mtable columnalign="left left" rowspacing=".2em" columnspacing="1em" displaystyle="false"><mtr><mtd><msub><mi>b</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy="false">(</mo><mn>2</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><mo stretchy="false">(</mo><mn>3</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><mo stretchy="false">(</mo><mn>2</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><mo stretchy="false">(</mo><mn>3</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><mo stretchy="false">(</mo><mn>2</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><mo stretchy="false">(</mo><mn>3</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy="false">(</mo><mn>3</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>⊕</mo><mo stretchy="false">(</mo><mn>2</mn><mo>∗</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo></mtd></mtr></mtable><mo fence="true" stretchy="true" symmetric="true"></mo></mrow></math></span></span></div><script type="math/tex; mode=display" id="MathJax-Element-4">\begin{cases} b_{0,j}=(2*a_{0,j}) \oplus (3*a_{1,j}) \oplus a_{2,j} \oplus a_{3,j} \\ b_{0,j}=a_{0,j} \oplus (2*a_{1,j}) \oplus (3*a_{2,j}) \oplus a_{3,j} \\ b_{0,j}=a_{0,j} \oplus a_{1,j} \oplus (2*a_{2,j}) \oplus (3*a_{3,j}) \\ b_{0,j}=(3*a_{0,j}) \oplus a_{1,j} \oplus a_{2,j} \oplus (2*a_{3,j}) \\ \end{cases}</script> 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 5.76em; vertical-align: -2.63em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 2.95002em;"><span class="" style="top: -1.59999em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎩</span></span></span><span class="" style="top: -1.59999em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -1.89999em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -2.19999em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -3.15001em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎨</span></span></span><span class="" style="top: -4.30001em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -4.60001em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -4.90001em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎪</span></span></span><span class="" style="top: -5.20002em;"><span class="pstrut" style="height: 3.15em;"></span><span class="delimsizinginner delim-size4"><span class="">⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 2.45002em;"><span class=""></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 3.13em;"><span class="" style="top: -5.13em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathit">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span></span></span><span class="" style="top: -3.69em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathit">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span></span></span><span class="" style="top: -2.25em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathit">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span></span></span><span class="" style="top: -0.81em;"><span class="pstrut" style="height: 3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathit">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mord"><span class="mord mathit">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.311664em;"><span class="" style="top: -2.55em; margin-left: 0em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mpunct mtight">,</span><span class="mord mathit mtight" style="margin-right: 0.05724em;">j</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.286108em;"><span class=""></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 2.63em;"><span class=""></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></span></p> 
           

其中矩陣的乘法和加法并不是通常意義上的乘法和加法,而是定義在伽羅華域上的二進制運算,且使用的不可約多項式為

P
   
   
    (
   
   
    x
   
   
    )
   
   
    =
   
   
    
     x
    
    
     8
    
   
   
    +
   
   
    
     x
    
    
     4
    
   
   
    +
   
   
    
     x
    
    
     3
    
   
   
    +
   
   
    x
   
   
    +
   
   
    1
   
  
  
   P(x)=x^8+x^4+x^3+x+1
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord mathit" style="margin-right: 0.13889em;">P</span><span class="mopen">(</span><span class="mord mathit">x</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.897438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord mathit">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">8</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.897438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord mathit">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.897438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord mathit">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.814108em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.66666em; vertical-align: -0.08333em;"></span><span class="mord mathit">x</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">1</span></span></span></span></span>。關于伽羅華域運算我在另一篇文章中有詳細介紹《<a href="https://blog.csdn.net/shaosunrise/article/details/80174210" target="_blank" rel="external nofollow" >伽羅華域運算及C語言實作</a>》。其加法為模二加法,相當于異或運算,其乘法可以使用GMul表示,則上式運算可以表示為:</p> 
           
{
    
    
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          GMul
         
         
          (
         
         
          2
         
         
          ,
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          3
         
         
          ,
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          (
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          2
         
         
          ,
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          3
         
         
          ,
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          (
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          2
         
         
          ,
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          3
         
         
          ,
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
     
      
       
        
         
          
           b
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          =
         
         
          GMul
         
         
          (
         
         
          3
         
         
          ,
         
         
          
           a
          
          
           
            0
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            1
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          (
         
         
          
           a
          
          
           
            2
           
           
            ,
           
           
            j
           
          
         
         
          )
         
         
          ∧
         
         
          GMul
         
         
          (
         
         
          2
         
         
          ,
         
         
          
           a
          
          
           
            3
           
           
            ,
           
           
            j
           
          
         
         
          )
         
        
       
      
     
    
   
   
     <span class="MathJax_Preview" style="color: inherit; display: none;"></span><div class="MathJax_Display"><span class="MathJax MathJax_FullWidth" id="MathJax-Element-5-Frame" tabindex="0" style="position: relative;" data-mathml="<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot; display=&quot;block&quot;><mrow><mo>{</mo><mtable columnalign=&quot;left left&quot; rowspacing=&quot;.2em&quot; columnspacing=&quot;1em&quot; displaystyle=&quot;false&quot;><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr><mtr><mtd><msub><mi>b</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>3</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>1</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mo stretchy=&quot;false&quot;>(</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>2</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo><mo>&amp;#x2227;</mo><mtext>GMul</mtext><mo stretchy=&quot;false&quot;>(</mo><mn>2</mn><mo>,</mo><msub><mi>a</mi><mrow class=&quot;MJX-TeXAtom-ORD&quot;><mn>3</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy=&quot;false&quot;>)</mo></mtd></mtr></mtable><mo fence=&quot;true&quot; stretchy=&quot;true&quot; symmetric=&quot;true&quot;></mo></mrow></math>" role="presentation"><nobr aria-hidden="true"><span class="math" id="MathJax-Span-439" style="width: 100%; display: inline-block; min-width: 23.36em;"><span style="display: inline-block; position: relative; width: 100%; height: 0px; font-size: 102%;"><span style="position: absolute; clip: rect(3.093em, 1022.9em, 8.362em, -999.997em); top: -5.976em; left: 0em; width: 100%;"><span class="mrow" id="MathJax-Span-440"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1022.9em, 8.362em, -999.997em); top: -5.976em; left: 50%; margin-left: -11.448em;"><span class="mrow" id="MathJax-Span-441"><span class="mo" id="MathJax-Span-442" style="vertical-align: 2.739em;"><span style="display: inline-block; position: relative; width: 0.915em; height: 0px;"><span style="position: absolute; font-family: MathJax_Size4; top: -3.088em; left: 0em;">⎧<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; font-family: MathJax_Size4; top: 0.053em; left: 0em;">⎩<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; font-family: MathJax_Size4; top: -1.264em; left: 0em;">⎨<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.835em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.581em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -2.379em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -0.352em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: -0.099em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="font-family: MathJax_Size4; position: absolute; top: 0.155em; left: 0em;">⎪<span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mtable" id="MathJax-Span-443" style="padding-right: 0.155em; padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 21.688em; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1021.59em, 8.312em, -999.997em); top: -5.925em; left: 0em;"><span style="display: inline-block; position: relative; width: 21.688em; height: 0px;"><span style="position: absolute; width: 100%; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -5.925em; left: 0em;"><span class="mtd" id="MathJax-Span-444"><span class="mrow" id="MathJax-Span-445"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -10.84em;"><span class="msubsup" id="MathJax-Span-446"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-447" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-448"><span class="mrow" id="MathJax-Span-449"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-450" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-451" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-452" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-453" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mtext" id="MathJax-Span-454" style="font-family: MathJax_Main; padding-left: 0.256em;">GMul</span><span class="mo" id="MathJax-Span-455" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-456" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-457" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-458" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-459" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-460"><span class="mrow" id="MathJax-Span-461"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-462" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-463" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-464" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-465" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-466" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-467" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-468" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-469" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-470" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-471" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-472" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-473"><span class="mrow" id="MathJax-Span-474"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-475" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-476" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-477" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-478" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-479" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-480" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-481"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-482" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-483"><span class="mrow" id="MathJax-Span-484"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-485" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-486" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-487" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-488" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-489" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-490" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-491"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-492" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-493"><span class="mrow" id="MathJax-Span-494"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-495" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-496" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-497" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-498" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -4.659em; left: 0em;"><span class="mtd" id="MathJax-Span-499"><span class="mrow" id="MathJax-Span-500"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -10.84em;"><span class="msubsup" id="MathJax-Span-501"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-502" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-503"><span class="mrow" id="MathJax-Span-504"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-505" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-506" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-507" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-508" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mo" id="MathJax-Span-509" style="font-family: MathJax_Main; padding-left: 0.256em;">(</span><span class="msubsup" id="MathJax-Span-510"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-511" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-512"><span class="mrow" id="MathJax-Span-513"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-514" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-515" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-516" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-517" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-518" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-519" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-520" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-521" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-522" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-523" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-524" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-525"><span class="mrow" id="MathJax-Span-526"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-527" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-528" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-529" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-530" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-531" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-532" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-533" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-534" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-535" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-536" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-537" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-538"><span class="mrow" id="MathJax-Span-539"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-540" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-541" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-542" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-543" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-544" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-545" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-546"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-547" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-548"><span class="mrow" id="MathJax-Span-549"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-550" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-551" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-552" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-553" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -3.341em; left: 0em;"><span class="mtd" id="MathJax-Span-554"><span class="mrow" id="MathJax-Span-555"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -10.84em;"><span class="msubsup" id="MathJax-Span-556"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-557" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-558"><span class="mrow" id="MathJax-Span-559"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-560" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-561" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-562" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-563" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mo" id="MathJax-Span-564" style="font-family: MathJax_Main; padding-left: 0.256em;">(</span><span class="msubsup" id="MathJax-Span-565"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-566" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-567"><span class="mrow" id="MathJax-Span-568"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-569" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-570" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-571" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-572" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-573" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-574" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-575"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-576" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-577"><span class="mrow" id="MathJax-Span-578"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-579" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-580" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-581" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-582" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-583" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-584" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-585" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-586" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-587" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-588" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-589" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-590"><span class="mrow" id="MathJax-Span-591"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-592" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-593" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-594" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-595" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-596" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-597" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-598" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-599" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-600" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-601" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-602" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-603"><span class="mrow" id="MathJax-Span-604"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-605" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-606" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-607" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-608" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; width: 100%; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -2.075em; left: 0em;"><span class="mtd" id="MathJax-Span-609"><span class="mrow" id="MathJax-Span-610"><span style="display: inline-block; position: relative; width: 100%; height: 0px;"><span style="position: absolute; clip: rect(3.093em, 1021.59em, 4.461em, -999.997em); top: -4em; left: 50%; margin-left: -10.84em;"><span class="msubsup" id="MathJax-Span-611"><span style="display: inline-block; position: relative; width: 1.371em; height: 0px;"><span style="position: absolute; clip: rect(3.144em, 1000.41em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-612" style="font-family: MathJax_Math-italic;">b</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.408em;"><span class="texatom" id="MathJax-Span-613"><span class="mrow" id="MathJax-Span-614"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-615" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-616" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-617" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-618" style="font-family: MathJax_Main; padding-left: 0.256em;">=</span><span class="mtext" id="MathJax-Span-619" style="font-family: MathJax_Main; padding-left: 0.256em;">GMul</span><span class="mo" id="MathJax-Span-620" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-621" style="font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-622" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-623" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-624" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-625"><span class="mrow" id="MathJax-Span-626"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-627" style="font-size: 70.7%; font-family: MathJax_Main;">0</span><span class="mo" id="MathJax-Span-628" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-629" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-630" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-631" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-632" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-633"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-634" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-635"><span class="mrow" id="MathJax-Span-636"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-637" style="font-size: 70.7%; font-family: MathJax_Main;">1</span><span class="mo" id="MathJax-Span-638" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-639" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-640" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-641" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mo" id="MathJax-Span-642" style="font-family: MathJax_Main; padding-left: 0.205em;">(</span><span class="msubsup" id="MathJax-Span-643"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-644" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-645"><span class="mrow" id="MathJax-Span-646"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-647" style="font-size: 70.7%; font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-648" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-649" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-650" style="font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-651" style="font-family: MathJax_Main; padding-left: 0.205em;">∧</span><span class="mtext" id="MathJax-Span-652" style="font-family: MathJax_Main; padding-left: 0.205em;">GMul</span><span class="mo" id="MathJax-Span-653" style="font-family: MathJax_Main;">(</span><span class="mn" id="MathJax-Span-654" style="font-family: MathJax_Main;">2</span><span class="mo" id="MathJax-Span-655" style="font-family: MathJax_Main;">,</span><span class="msubsup" id="MathJax-Span-656" style="padding-left: 0.155em;"><span style="display: inline-block; position: relative; width: 1.472em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.51em, 4.157em, -999.997em); top: -4em; left: 0em;"><span class="mi" id="MathJax-Span-657" style="font-family: MathJax_Math-italic;">a</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span><span style="position: absolute; top: -3.848em; left: 0.509em;"><span class="texatom" id="MathJax-Span-658"><span class="mrow" id="MathJax-Span-659"><span style="display: inline-block; position: relative; width: 0.864em; height: 0px;"><span style="position: absolute; clip: rect(3.397em, 1000.81em, 4.309em, -999.997em); top: -4em; left: 0em;"><span class="mn" id="MathJax-Span-660" style="font-size: 70.7%; font-family: MathJax_Main;">3</span><span class="mo" id="MathJax-Span-661" style="font-size: 70.7%; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-662" style="font-size: 70.7%; font-family: MathJax_Math-italic;">j</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span><span class="mo" id="MathJax-Span-663" style="font-family: MathJax_Main;">)</span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span></span></span><span style="display: inline-block; width: 0px; height: 4.005em;"></span></span></span><span style="display: inline-block; width: 0px; height: 5.93em;"></span></span></span></span><span class="mo" id="MathJax-Span-664"></span></span><span style="display: inline-block; width: 0px; height: 5.981em;"></span></span></span></span><span style="display: inline-block; width: 0px; height: 5.981em;"></span></span></span><span style="display: inline-block; overflow: hidden; vertical-align: -2.323em; border-left: 0px solid; width: 0px; height: 5.171em;"></span></span></nobr><span class="MJX_Assistive_MathML MJX_Assistive_MathML_Block" role="presentation"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mrow><mo>{</mo><mtable columnalign="left left" rowspacing=".2em" columnspacing="1em" displaystyle="false"><mtr><mtd><msub><mi>b</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo>=</mo><mtext>GMul</mtext><mo stretchy="false">(</mo><mn>2</mn><mo>,</mo><msub><mi>a</mi><mrow class="MJX-TeXAtom-ORD"><mn>0</mn><mo>,</mo><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo>∧</mo><mtext>GMul</mte
           

前言

AES算法是目前最流行的對稱加密算法,也是一種分組加密算法,分組密碼就是把明文分為固定長度的一組一組,每次加密一組資料,直到加密完整個明文資料。AES算法根據分組長度可以分為AES128, AES192,AES256,其所要求的秘鑰長度和加密輪數也各不相同。鑒于這三種模式的算法在本質上沒有差別,是以本文主要介紹AES-128(資料分組為16位元組,秘鑰長度為16位元組,加密輪數為10輪),并給出C語言實作。

确切的說分組密碼隻是規定了怎麼加密一組明文,如果明文資料比較長,其他的組需要怎麼進行加密取決于使用何種分組密碼工作模式。對于AES-128而言,每次隻加密16位元組長度的資料,如果明文長度為32位元組話,我們很容易想到第2組16位元組可以仿照第1組16位元組資料進行處理,這就是最簡單的分組密碼工作模式ECB(電子密碼本)模式,本文主要講述AES算法實作,對于長資料也是使用這種最簡單的ECB分組處理方式,更多其他分組密碼工作模式,請參考另一篇文章圖解分組密碼五大工作模式。

前面讨論的資料長度都是16位元組,或者其整倍數長度的加密算法實作,對于資料長度不是分組長度整倍數的情形,通常需要對資料進行填充,使其長度達到分組長度的整倍數再來進行加密。對于資料長度不足分組長度整倍數使用何種格式進行資料填充有多種不同的填充标準,比如在資料後面填充二進制的0x0,直到達到要求的長度,這就是ZeroPadding方式;比如資料缺少幾位就填充二進制的幾,例如缺少4位填充0x04 0x04 0x04 0x04,這就是PKCS7/PKCS5填充方式。本文提供的實作不涉及資料填充,假定明文資料都是16位元組的整倍數長度。

AES算法流程

AES算法主要可以分為秘鑰擴充、位元組替換、行移位、列混合和輪秘鑰加這5個步驟。

  • 秘鑰擴充(KeyExpansions:給定的初始秘鑰一般比較短,比如16位元組,而算法如果進行10輪運算的話就需要16x(10+1)位元組長度的秘鑰,需要對原始秘鑰進行秘鑰擴充。
  • 位元組替換(SubBytes):一個非線性的替換步驟,根據查表把一個位元組替換為另一個位元組。
  • 行移位(ShiftRows):将資料矩陣的每一行循環移位一定長度。
  • 列混合(MixColumns):将資料矩陣乘以一個固定的矩陣,增加混淆程度。
  • 輪秘鑰加(AddRoundKey):将資料矩陣與秘鑰矩陣進行異或操作。

AES加密

AES-128加密流程可以使用如下僞代碼表示:

AES-128加密(uint8 in[16], uint8 out[16], uint8 key[16]){
  uint8 state[4,4] = in;
  uint32 w[44] = KeyExpansions(key[16]);
           

繼續閱讀