我试图调整SJCL的以下功能,它做"AES-CCM“风格的CTR加密,做”纯CTR“加密。我正在玩SIV,我宁愿使用这个经过仔细审查的实现,而不是从头开始构建我自己的CTR密码。然而,我很难准确理解CCM部件做什么,以及如何修改这个例程以“删除”CCM功能(处理标记和L参数的部分)。我的问题是:这两种CTR“样式”到底有什么区别,在下面的片段中是如何翻译的?任何帮助都是非常感谢的。
_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) };
}发布于 2014-04-10 23:28:24
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
复制相似问题