Modes-of-Operation

普通 AES CTR 和“CCM 風格”CTR 之間的區別

  • April 12, 2014

我正在嘗試從進行“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)的組成部分,它們在構造初始計數器(儘管一旦完成,大多數將遵循相同的基本方法)。

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