受魔术“ Nothing Up My Sleeve”数字的启发-Computerphile-YouTube [5:31]。如果您只需要一个常量来开始算法,而该常量的值并不重要,那么为什么不使用一个众所周知的约定来始终使用Pi或Phi或其他众所周知的常量的数字呢?选择任意数字似乎是不好的,因为它会引起人们对数字起源的怀疑,这可能会导致一些人怀疑它们是为未公开的弱点而精心挑选的。

评论

这实际上经常进行,但是并不总是产生最佳的属性,这就是为什么有时以其他方式选择常数的原因,例如,通过运行定义明确的确定性程序,该程序可以找到表现出所需属性的常数。

我想到了BADA55纸。

@SEJPM您写的内容感觉像是“是的,经常做魔术数字来制造弱点。”但我也得到您实际上是在选择一个众所周知的数字。

#1 楼


如果您只需要一个常量来开始算法,而该常量的值并不重要,为什么不使用一个众所周知的约定来始终使用Pi或Phi或其他众所周知的常量的数字呢? />

为什么不使用全零或全零呢?为什么不使用用户提供给我们的东西?

有个玩笑:关于标准的好事是我们有很多选择。

通常有些值应该具有特定的属性,例如质数。然后,您必须使用带有该常量的CSPRNG。为什么不使用此CSPRNG,为什么不使用它呢?

简而言之:因为它们在广泛不同的环境中使用,我们通常会有一些含糊的要求:


有时它必须具有任意长度和安全性(DH安全素生成)
有时它必须具有任何长度且仅是简单常数(HMAC)
/>有时它必须是特定的长度并具有高熵(AES)
有时它必须与我们在其他地方使用的另一个常数完全独立。

最后一个要求可能是最糟糕的。可能碰巧使用相同常数的两种不同算法会产生干扰,并且由于您有一个标准,因此增加了这种可能性。

即使您设法以某种方式实现了该目标,某些值也应该具有较高的熵,有些可以是简单的东西。使它们有意义将降低算法的运行速度。

所有这些,您将获得1%的额外安全性,而没人会在算法中植入错误。可悲的是,IMO并没有给我们带来太多好处,并且阻止了在保持安全性的同时更快地进行智能设计。

评论


$ \ begingroup $
您可以定义“熵”的含义吗?常数具有0熵,因为每个人都知道它们的值。您是说类似字符串的复杂性吗?
$ \ endgroup $
–艾拉·罗斯(Ella Rose)
17年4月19日在18:45

$ \ begingroup $
@EllaRose是的,我是说它们看起来很随意。 HMAC仅具有6C6C6C ...并且AES常数看起来相当随机。让我们称它们为不可压缩的:)。如果您知道如何巧妙地拨打电话,请编辑
$ \ endgroup $
–axapaxa
17年4月19日在19:11

$ \ begingroup $
@EllaRose我们可能无法为熵分配一个合理的值,但我们可能能够为Komolgorov复杂度分配一个值
$ \ endgroup $
– k_g
17年4月19日在21:37

$ \ begingroup $
@k_g,但“无所适从”的答案是要降低Kolmogorov的复杂性:这就是您表明没有袖手旁观的方法。
$ \ endgroup $
– Peter Taylor
17年4月20日在8:24

$ \ begingroup $
@axapaxa HMAC ipad和opad值并不是我袖长的数字。选择它们的原因是$ k \ oplus \ mathrm {opad} \ ne k \ oplus \ mathrm {ipad} $。任何明显不同的常量都可以使用。它们的唯一要求是简单(以减少定义规范的复杂性并减少实现错误的可能性),并在生成的键之间提供较高的汉明距离,以便它们在计算上均独立。在介绍HMAC的论文的5.2节中对此进行了描述。
$ \ endgroup $
–森林
18'八月7'在1:41



#2 楼


如果您只需要一个常量来开始算法,而该常量的值并不重要,为什么不使用一个众所周知的约定来始终使用Pi或Phi或其他众所周知的常量的数字呢? />

这是一个奇妙的问题,我认为应该针对每个密码/置换建议。我找不到能够准确建议应使用哪种约定的研究论文,因此人们可能仍在使用自己的临时方法来生成常量。

我不知道有没有官方的资料标准,但一种被广泛接受的惯例似乎是选择一些无害的数字(即pi,phi,数字的平方根等),然后对它们运行某种函数以提取输出。所讨论的功能可能与选择所提供编号的某些位一样简单。这似乎或多或少是生成常数的事实上的标准方法。

假设对称图元,我个人主张将图元的线性层应用于递增计数器以生成常量。

其原因是因为它消除了任何自由度在生成常量的过程中,因为总是这样做,而设计者(即我)没有选择/输入。如果可以假设线性层被设计为生成高度不同的输出,而不是被设计为生成秘密的弱输出/恶意常数(这可能会破坏其余的设计),则没有自由度。 >此外,它重用了已经可用的资源:它需要更少的数据(不需要常量表),这意味着更低的存储要求,更少的寄存器交换以及更少的代码。

#3 楼

表面上,有一个常数约定。虚荣心。

这样的常数的标准是使数字与其对算法的任何可能影响无关。是的,有时高熵很有用,但大多数时候大多数数字都可以。尚未进行分析,但是SHA1常数如果为12345,则可能同样有效。但是没有人会相信,不是秘密选择它们对安全性有不利影响。因此,您选择平方根或与SHA2相关的质数。只要是非常明显的东西,并且毫无疑问地认为它与算法的运算都没有关系。

如果您花了五年时间创建了下一个大型加密货币,那么,我会尝试用一种新颖的常量创建方法来炫耀。并且它必须满足上述分离要求。那么该怎么办?使用了所有简单的根,以及(大多数)π的数字。秘密勾结的对立必须是公开产生的数字,因此“百万美元椭圆曲线”常数使用彩票数字。我不是专业的密码学家,所以我无法判断社区如何接受这种表演技巧。 SHA256使用256个字节的常量。我敢肯定,如果那256个字节是《仲夏夜之梦》中ASCII形式的前256个字母,则该功能同样安全。在数学上,文本不可能与SHA256位操作相关,从而满足分离性,这在数学上是不可能的。

您必须意识到密码学家是具有所有人类特征的真实人。有时候我们都炫耀。

评论


$ \ begingroup $
实际上,SHA-1初始状态为[0x67452301、0xEFCDAB89、0x98BADCFE,0x10325476、0xC3D2E1F0],与12345相同。另一方面,SHA-2初始状态使用非理性数字。
$ \ endgroup $
– Nayuki
17年4月20日在3:55

$ \ begingroup $
重用其他算法中使用的相同常量会令人怀疑吗?您还可以从简单字符串的哈希值中获取常量,例如SHA-256的空哈希。例如,您可以使用Fisher-Yates混洗来生成S-box,并且AES的输出以全零键在计数器模式下运行。
$ \ endgroup $
– Melab
17年9月22日在15:11

$ \ begingroup $
@Melab是的,您可以绝对重用其他基元中的常量,但是虚荣可能不允许这样做。如果您花了2年的时间设计AES的替代产品,您将无法真正使用pi吗?您需要表现出才华和想象力,只要服务分离,您走多远也就没关系了。
$ \ endgroup $
–Paul Uszak
17/09/22在17:58