我最近在使用AES-GCM时面临随机访问解密的问题。我说这个人说底层的CTR应该允许并行化,但是我不知道身份验证如何发挥作用。

现在我知道CTR的一个很酷的功能就是您可以解密任何块而无需涉及任何其他障碍。我也知道CTR是GCM基础的一部分。

现在我的问题是:


可以以某种方式并行化GCM中的数据加密模式(仅CTR部分?还是MAC的一部分?)
是否可以随机访问解密的密文(+快速验证?),或者至少可以某种方式并行化解密和身份验证(两者都做)并行还是内部并行化?)?


评论

Bouncy Castle甚至有一个技巧,可以在处理普通数据后处理附加身份验证数据的添加,尽管它除了乘法之外还需要取模幂,这需要附加表。

个别区块的解密并非CTR独有。您还可以解密CBC或CFB加密的各个块。但这对于经过身份验证的加密来说不是一个非常有趣的功能,因为您无法对单个块进行身份验证。

#1 楼

与Stephen所说的相反,您绝对可以并行计算标签。

它的工作方式是这样;标签计算本质上是“将AAD,数据,长度字段和$ Encr(Nonce)$组装为一系列值$ x_n,x_ {n-1},x_ {n-2},...,x_0 $ ”,然后“计算多项式$ x_nh ^ n + x_ {n-1} h ^ {n-1} + x_ {n-2} h ^ {n-2} + ... + x_0h ^ 0 $

此计算在$ GF(2 ^ {128})$字段中进行评估;由于它是一个字段,因此是重新安排多项式工作的所有标准方法。

对于例如,如果要将其转换为三向并行度,则可以计算$ j = h ^ 3 $,然后并行计算三个多项式:

$$ tag_2 = j ^ 0x_2 + j ^ 1x_5 + j ^ 2x_8 + ... $$
$$ tag_1 = j ^ 0x_1 + j ^ 1x_4 + j ^ 2x_7 + ... $$
$$ tag_0 = j ^ 0x_0 + j ^ 1x_3 + j ^ 2x_6 + ... $$

,然后将它们组合为最终结果$ tag = h ^ 2tag_2 + h ^ 1tag_1 + h ^ 0tag_0 $

很显然,我们可以将其调整到适合我们的并行度,并且我们没有以任何方式更改标签结果。

Stephen还指出,整个消息必须扫描以计算标签;对于任何带有标记的方法来说,这都是正确的,该标记是整个消息的复杂功能。

评论


$ \ begingroup $
这可以用来对认证进行位片吗?
$ \ endgroup $
–黛米
16年4月5日在18:45

$ \ begingroup $
@Demetri:位片的GCM实现当然可以使用上述技巧来计算MAC标签(同时处理多个块)
$ \ endgroup $
–雨披
16年4月5日在18:55

#2 楼

维基百科上的GCM流程图和我的直觉都支持可以并行完成某些GCM工作的想法。至少您可以并行执行每个$ E_k(ctr)$操作,但是看起来您应该能够并行化身份验证,因为每个$ mult_H $都需要前一个调用的输出作为其输入。编辑:poncho解释了为什么这是错误的答案。

类似地,您可以执行随机访问解密,但是要实现身份验证,仍然需要对整个密文进行身份验证。就是说,由于您只需要计算一次$ E_k(ctr)$,仍然节省了工作量。