Keccak中状态的初始值全为零,为什么?
舍入常数仅设置了几位,为什么?
诸如SHA-2之类的先前基元使用伪随机常量(例如从π派生)。
/* Keccak round constants */
uint64_t RC[24] = {
0x0000000000000001, 0x0000000000008082,
0x800000000000808A, 0x8000000080008000,
0x000000000000808B, 0x0000000080000001,
0x8000000080008081, 0x8000000000008009,
0x000000000000008A, 0x0000000000000088,
0x0000000080008009, 0x000000008000000A,
0x000000008000808B, 0x800000000000008B,
0x8000000000008089, 0x8000000000008003,
0x8000000000008002, 0x8000000000000080,
0x000000000000800A, 0x800000008000000A,
0x8000000080008081, 0x8000000000008080,
0x0000000080000001, 0x8000000080008008,
};
#1 楼
正如fgrieu所指出的,这些常量是根据二进制线性反馈移位寄存器定义的。因为可以使用标准逻辑门非常有效地表示LFSR,所以数十年来,它们已用于伪随机数生成计算机。由于密码分析的进步,它们已不适合直接用作安全流密码。但是,不能完全依靠Keccak的舍入常数来提供加密安全的伪随机生成器的所有属性。通过以这种方式定义它们,Keccak的设计人员实现了一些目标:
NIST特别要求提供可以扩展轮数的功能。这种舍入常量的定义提供了无限的供应,如果以后需要添加更多的回合。
常量可以有效地实现为硬件中的LFSR。您不必将表嵌入到具有2304位平方根和立方根(如SHA-2)的ROM中。
由于常量计算出的值多数为零,因此完全展开的管道实现可能甚至更多。在每个阶段都比LFSR更有效率。超线性定标FTW。
设计人员表明,由于没有足够的信息内容来隐藏一个常数,因此他们没有在选择圆形常数时隐藏任何细微的弱点。 NIST过去曾遇到过这样的问题:http://www.wired.com/politics/security/commentary/securitymatters/2007/11/securitymatters_1115
设计师们断言Keccak的安全性不是在很大程度上取决于具有完全统计上无偏的舍入常数。这听起来有些微不足道,但可以让同行评审者提前避免不必要的无用讨论,这似乎是对公共密码分析的直接好处。无论如何,它似乎对Keccak都有效。
真正令人着迷的是,所有这些原因在信息论中变得紧密相关。 http://en.wikipedia.org/wiki/Algorithmic_information_theory
#2 楼
这不是一个基本原理,我承认我还不太了解如何从中得到这些值,但是我至少可以指出常数的派生方式。引用Keccak参考:术语之间的加法和乘法在$ \ mathrm {GF}(2)$中。除了舍入常数$ \ mathrm {RC} [i_r] $的值以外,这些舍入是相同的。舍入常数由下式给出(第一个索引表示舍入数):
$$ \ mathrm {RC} [i_r] [0] [0] [2 ^ j-1] = \ mathrm {rc} [j + 7i_r] \ text {对于所有} 0 \ leq j \ leq l,$$
和$ \ mathrm {RC} [i_r] [x] [y] [z] $的所有其他值是零。 \ mathrm {GF}(2)$中的值$ \ mathrm {rc} [t] \定义为二进制线性反馈移位寄存器(LFSR)的输出:
$$ \ mathrm {rc} [ t] = \ left(x ^ t \ bmod x ^ 8 + x ^ 6 + x ^ 5 + x ^ 4 + 1 \ right)\ bmod x \ text {in} \ mathrm {GF}(2)[x] 。$$