#1 楼
TL; DR,如果您在2020年阅读此书,则应用程序应使用GCM模式。CCM(带有CBC-MAC的计数器)
消息身份验证(通过CBC-MAC)在明文而不是密文上完成。 (通常这不是理想的功能。)
在加密操作中,加密和MAC可以并行发生,但通常不会并行发生(通常是因为其中只有一个AES引擎)一个芯片,一次仅一个AES线程,等等)。类似的说法也适用于解密。
每个块的性能基本上要花费2 x AES操作
不能并行化
从TLS 1.3开始,OpenSSL中提供了CCM密码( 2018),但默认情况下处于禁用状态。
GCM(Galois计数器模式)
GCM密码是全球使用最广泛的分组密码。从TLS 1.2(2008)开始是强制性的,并且大多数客户端默认使用它。
消息身份验证(通过GMAC / GHASH)在密文上进行。 (这在大多数情况下都是可取的。)请注意,在大多数实现中,出于性能方面的考虑,身份验证检查和解密是并行进行的。
性能花费1 x AES操作和每块1 x GHASH(GHASH通常比AES快,因此GCM更快)
可以很好地并行化多个块的加密/解密
对于大多数需要经过身份验证的加密的应用程序,应认为GCM优于CCM。由于发生了身份验证,因此GCM不受位翻转和其他针对计数器模式或其他流模式的攻击的影响。
使用GCM之前,应注意一些细微差别:涉及加密消息的最大大小和MAC大小。这些在标准(NIST SP800-38D)中被调用。
评论
GCM可能会更快一些(取决于CPU),但我不喜欢它。感觉很脆弱。@CodesInChaos:您为什么认为GCM“感觉非常脆弱”?我对此的主要保留意见是尚未广泛实施,这使得它在某些情况下(例如Java Card Classic)几乎无法使用。
除非您有任何特殊要求,否则都可以。两种模式均已通过NIST批准。我个人更喜欢GCM的设计。它比CCM更现代(建议使用EAX模式替代CCM)。有关GCM和CCM的更多规格。
正如Hunter所说,您不能使用EAX或其他特定于存储的选项之一吗? [另一个参考]