Encryption

AES-256 混合列程式碼生成大於 8 位的輸出

  • January 15, 2020

MixColumn我在 JavaScript 中實現 AES-256,塊大小為 128 位,除了轉換之外,我了解 AES 的所有內容。

所以我從網際網路上複製了這段程式碼,兩者MixColumnInvMixColumn轉換完美地相互對抗,但問題是MixColumn程式碼在塊中生成大於 8 位的字節,而其他函式(如SubBytes等)不接受。

AES.prototype.TEMPMixColumns = function(state)
{
 var i, Tmp, Tm, t;
 for (i = 0; i < 4; ++i)
 {  
   t   = state[i*4];
   Tmp = state[i*4] ^ state[i*4+1] ^ state[i*4+2] ^ state[i*4+3] ;
   Tm  = state[i*4] ^ state[i*4+1]  ;
   Tm = this.xtime(Tm);  
   state[i*4+0] ^= Tm ^ Tmp ;
   Tm  = state[i*4+1] ^ state[i*4+2] ; Tm = this.xtime(Tm);  state[i*4+1]     ^= Tm ^ Tmp ;
   Tm  = state[i*4+2] ^ state[i*4+3] ; Tm = this.xtime(Tm);  state[i*4+2] ^= Tm ^ Tmp ;
   Tm  = state[i*4+3] ^ t ;              Tm = this.xtime(Tm);  state[i*4+3] ^= Tm ^ Tmp ;


 }
 return state
}

AES.prototype.xtime = function(x){ 
   return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)) 
}

AES.prototype.Multiply = function(x, y){
   var t =  (((y & 1) * x) ^ ((y >> 1 & 1) * this.xtime(x)) ^ ((y >> 2 & 1) * this.xtime(this.xtime(x))) ^ ((y >> 3 & 1) * this.xtime(this.xtime(this.xtime(x)))) ^ ((y >> 4 & 1) * this.xtime(this.xtime(this.xtime(this.xtime(x))))));
   return t;
}

AES.prototype.TEMPInvMixColumns = function( state)
{
 var i, a, b, c, d;
 for (i = 0; i < 4; ++i)
 { 
a = state[i*4+0];
b = state[i*4+1];
c = state[i*4+2];
d = state[i*4+3];

state[i*4+0] = this.Multiply(a, 0x0e) ^ this.Multiply(b, 0x0b) ^ this.Multiply(c, 0x0d) ^ this.Multiply(d, 0x09);
state[i*4+1] = this.Multiply(a, 0x09) ^ this.Multiply(b, 0x0e) ^ this.Multiply(c, 0x0b) ^ this.Multiply(d, 0x0d);
state[i*4+2] = this.Multiply(a, 0x0d) ^ this.Multiply(b, 0x09) ^ this.Multiply(c, 0x0e) ^ this.Multiply(d, 0x0b);
state[i*4+3] = this.Multiply(a, 0x0b) ^ this.Multiply(b, 0x0d) ^ this.Multiply(c, 0x09) ^ this.Multiply(d, 0x0e) ;
 }
 return state
}

程序中的其他一切工作正常,但我不理解MixColumn轉換,所以我無法調試它,我不知道為什麼它會產生更大的輸出。

我相信問題出在這裡:

AES.prototype.xtime = function(x){ 
   return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)) 
}

這段程式碼似乎假設返回值被截斷了 8 位;我懷疑這對您的實施不正確。

如果您將其更改為:

AES.prototype.xtime = function(x){ 
   return (((x << 1) & 0xfe) ^ (((x >> 7) & 1) * 0x1b)) 
}

它可能會按預期工作……

引用自:https://crypto.stackexchange.com/questions/60857