Encryption
AES-256 混合列程式碼生成大於 8 位的輸出
MixColumn
我在 JavaScript 中實現 AES-256,塊大小為 128 位,除了轉換之外,我了解 AES 的所有內容。所以我從網際網路上複製了這段程式碼,兩者
MixColumn
和InvMixColumn
轉換完美地相互對抗,但問題是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)) }
它可能會按預期工作……