Modes-of-Operation
普通 AES CTR 和“CCM 風格”CTR 之間的區別
我正在嘗試從進行“AES-CCM”樣式 CTR 加密的 SJCL 中調整以下功能來進行“純 CTR”加密。我正在玩 SIV,寧願使用這個經過充分審查的實現,也不願從頭開始建構我自己的 CTR 密碼。但是,我無法準確理解 CCM 部分的作用,以及我將如何修改此常式以“剝離”CCM 功能(處理標籤和 L 參數的部分)。我的問題是:兩種點擊率“樣式”之間的區別到底是什麼,以及在下面的程式碼段中如何翻譯?任何幫助表示讚賞。
_ctrMode: function(prf, data, iv, tag, tlen, L) { var enc, i, w=sjcl.bitArray, xor = w._xor4, ctr, b, l = data.length, bl=w.bitLength(data); // start the ctr ctr = w.concat([w.partial(8,L-1)],iv).concat([0,0,0]).slice(0,4); // en/decrypt the tag tag = w.bitSlice(xor(tag,prf.encrypt(ctr)), 0, tlen); // en/decrypt the data if (!l) { return {tag:tag, data:[]}; } for (i=0; i<l; i+=4) { ctr[3]++; enc = prf.encrypt(ctr); data[i] ^= enc[0]; data[i+1] ^= enc[1]; data[i+2] ^= enc[2]; data[i+3] ^= enc[3]; } return { tag:tag, data:w.clamp(data,bl) }; }
CCM 的 CTR 部分基本上是
_ctrMode
函式中的最後一個 for 循環:for (i=0; i<l; i+=4) { ctr[3]++; enc = prf.encrypt(ctr); data[i] ^= enc[0]; data[i+1] ^= enc[1]; data[i+2] ^= enc[2]; data[i+3] ^= enc[3]; }
即 CTR 很簡單:用塊密碼加密一個計數器塊,將加密塊異或到數據中,增加計數器,重複……
(對於那些不習慣SJCL API 的人,他們傾向於對 32 位字而不是字節進行操作)。
正如 CodesInChaos 所提到的,雖然 CTR 模式已經標準化(在NIST SP800-38A中),但“CTR”被用作許多其他模式(例如 CCM、GCM、SIV、EAX)的組成部分,它們在構造初始計數器(儘管一旦完成,大多數將遵循相同的基本方法)。