以计数器方式将其像块密码一样安全地输入要获得适合用作流密码的随机填充?
当然,我是在谈论不要重复使用计数器值来加密数据(因此这种构造还需要一些随机IV或处理计数器永远是一个随机数)。
#1 楼
是的,这将是安全的。只要键输出$ F_K $的CTR(计数器)模式是安全的,只要其输出$$
$$
鉴于先前的输出是不可预测的
$$
F_K(1),F_K(2),\ ldots,F_K(i-1)。
$$
此要求本质上是对伪指令的定义随机函数(PRF)。大多数具有广泛使用的哈希函数的HMAC实例被认为是安全的PRF(出于多种原因,不可能提供严格的证明)。
您可能听说过CTR模式是一种分组密码模式。这也是正确的,因为安全分组密码必须是安全的伪随机排列(PRP),如果查询/使用的伪随机排列少于$ 2 ^ {n / 2} $次,则无法将其与PRF区分开,其中$ n $是块大小。
块密码在CTR模式下使用主要是由于它们的速度(HMAC较慢,特别是在短消息上),但是键控散列功能同样强大。您必须确保计数器永远不会重复。您可能要遵循NIST从随机数构造计数器的策略(第18页)。
#2 楼
布鲁斯·施耐尔(Bruce Schneier)在他的《应用密码学》一书中谈到了“基于单向哈希函数的密码”:使用单向函数加密的最简单方法是对前一个密文块与密钥连接在一起,然后将结果与当前纯文本块进行XoR:
$ C_i = P_i \ oplus H(K,C_ {i-1})\\
P_i = C_i \ oplus H(K,C_ {i-1})$
设置块长度等于单向哈希函数的输出。实际上,这在CFB模式下将单向功能用作分组密码。类似的构造可以在OFB模式下使用单向功能:
$ C_i = P_i \ oplus S_i; S_i = H(K,C_ {i-1})\\
P_i = C_i \ oplus S_i; S_i = H(K,C_ {i-1})$
此方案的安全性取决于单向函数的安全性。
这使用单向功能作为分组密码ID OFB和CFB模式。由于$ C_i $是使用XOR操作生成的,因此该方法可用作流密码。
关于“基于单向哈希函数的密码的安全性”,布鲁斯·施耐尔(Bruce Schneier)说:关于基础单向哈希函数的选择。好的单向哈希函数不一定能形成安全的加密算法。密码要求不同。例如,线性密码分析不是针对单向哈希函数的可行攻击,而是针对加密算法。单向哈希函数(例如SHA)可能具有线性特征,虽然不影响单向哈希函数的安全性,但可能使其在诸如MDC的加密算法中不安全。我不知道对作为块密码的特定单向哈希函数的密码分析。等待此类分析,然后再信任其中任何一个。
评论
$ \ begingroup $
这个问题是关于HMAC的,这是一个特定的键控哈希函数。我不会投票否决,因为大多数建议对于键控散列函数和加密单向散列一样有效。
$ \ endgroup $
–马腾·博德威斯♦
17年9月11日在12:49
评论
是的,点击率模式适用于任何PRF。 HMAC-SHA1是一款不错的PRF。感谢您的指导。在Wikipedia中,有一个指向文件的指针,该文件仅在压缩函数为PRF的情况下证明HMAC是PRF(请参阅cseweb.ucsd.edu/~mihir/papers/hmac-new.html)。
@CodesInChaos:顺便说一句,SHA-1是PRF吗?如果是这样,为什么?所有的加密哈希PRF都是按定义定义的吗,还是必须一一证明?还是仅仅是“相信”加密散列是PRF?
PRF是带密钥的原语,而散列则不是。因此,该术语并不直接适用。但是几乎所有对称加密都依赖信念。
@izaera:该证明中的压缩函数是基础迭代哈希方案(SHA1)的压缩函数。您可以在此页的第一个图中看到压缩函数的一个迭代。