在RC4上阅读Wiki页面时,我注意到键大小必须在40-2,048位之间。那么我应该这样理解,我可以有一个长度为333位的密钥吗?(任何在40-2048之间的十进制数?)输入长度如何?
假设我可以要求用户给我输入长度(例如,1027)和keylength (比如说,359),我可以使用它们吗?
关于RC2的相同问题-键大小必须在8-128 比特和RC5的范围内-键大小必须在0-2040 比特范围内。
我可以使用在给定范围内的任意键长度吗?即使是异国情调的,比如,我不知道,879或123位作为键的长度?
发布于 2013-08-25 18:51:19
是的,您可以拥有该范围的任意长度的键(只要它是一个整数字节),但实际上,为什么呢?绝对没有理由这么做。
底线:如果您需要询问密钥长度的确切范围,您可能使用RC4不正确。相反,坚持使用128-256位长的密钥,并且使用加密质量的伪随机数生成器或使用合适的散列/KDF函数均匀分布和生成密钥。
更新:显然,根据Henno的评论,RC2确实允许任意的键位长度(谢谢!)然而,这并没有改变底线。我不建议使用不寻常的长度键。坚持普通长度,比如128位或256位。
发布于 2013-08-25 02:19:10
简而言之,短键容易受到某种类型的攻击,2048位以上的密钥信息正在被丢弃,而外来密钥(那些与字节不对齐的键)实际上要么通过您的实现与字节对齐,要么只是一个非常糟糕的主意,视情况而定。
RC4是一个相当简单的算法,让我们通过初始化来看看会发生什么。
首先,准备一个256字节的增量数组,例如:
sbox[]
for i in 0 to 255:
sbox.append(i)然后取一些键k并准备一个256个字节的单独数组key_array,只需循环这个键来填充它。
key_index = 0
while len(key_array) < 256:
key_array.append(key[key_index])
key_index = key_index + 1
if key_index > len(key):
key_index = 0因此,任何超过2048位(即256字节)的东西都会被丢弃。
现在,您将遍历这两个数组,从0到255,将每个数组中的索引求和,并将该和添加到计数器(mod 256)中。然后在sbox中交换两个值,使用该运行计数器作为一个值的索引,使用当前的索引步骤作为另一个值。
for i in 0 to 255:
j = (j + self.sbox[i] + key_array[i]) mod 256
swap(self.sbox[j], self.sbox[i])现在,当你看前几个i's,还没有太多的移动。这些字节可能会再次被洗牌,但如果你能做一些假设,你可能能够检测到键和前几个字节之间的偏差,在初始化后。
就这样,这种攻击对5字节及以下的键特别有效,所以这可能就是避免40位以下键的警告之处。有趣的是,这种攻击并不仅仅停留在五个字节,成功的概率随着密钥大小的增加而下降,直到对超过16个字节的密钥变得根本不实用为止。
至于外来的键,大多数简单的实现只需要字节。因此,如果你提供333位,它可能只是解释为一个336位(42字节)的键,也许有一些填充的0。
如果实现没有将输入放入最近的字节,而只是将其循环到键数组中的2048个可用位,那么您可能已经有效地提供了一个2048位密钥。由于333与8不共享公共因子,所以在我们的键数组满后很长时间内,它将不会对齐一个偶数字节,直到2668位。因此,在333位键中保存重复模式,您可能无意中生成了相当于256字节的密钥。
另外,256字节的键听起来很棒,但实际上并不像你想象的那样能给你带来更多的熵。sbox的初始化结果是用信息填充256位字节,并设置两个计数器i和j。该键提供了填充256字节、255字节或254字节等选项。因此,256可能不一定提供任何额外的熵以上的键,只有180字节。
另外,请注意,很多研究都涉及重复的密钥攻击,因此正如DW所指出的,采取一些步骤以确保不重复密钥是非常重要的。Ri背心建议接受(键,初始化向量)并通过散列函数传递它,因此即使是重复的初始化向量也不会导致后续键之间的任何关系。另一个研究领域是研究PRNG的偏见,直到它“解决”为止。大多数实现都建议在初始化中添加另一个值,即在安装过程中丢弃的PRNG的几个回合(Rivest建议丢弃前256个字节)。
RC4是最简单的一种,因此也是研究最深入的流密码之一。很难跟上所有不同类型的攻击,并确定哪种理论攻击具有实际的适用性。所以,不要把这当作RC4永远安全的保证,继续检查研究。
针对大密钥的
使用密钥调度算法对小密钥的
的辩护
https://crypto.stackexchange.com/questions/9682
复制相似问题