为了娱乐,我正在学习有关密码和哈希的更多信息。我正在根据RFC 1319(http://tools.ietf.org/html/rfc1319)实现MD2哈希函数。首先,我会说我知道有图书馆,我知道这是一个旧的哈希,并且我不打算在任何现实世界中使用它,所以请不要害怕。

在学习S表时,我注意到MD2使用基于Pi的S表。我不明白的是这些数字与Pi的关系。奇怪的是,我找不到任何描述它的地方。 RFC只是说:


此步骤使用从pi的数字构造的256字节“随机”置换。


在参考文献中代码中,有以下注释:


由pi的数字构造的0..255的置换。它提供了一个“随机”的非线性字节替换操作。


查看前几个字节:



41,46,67


我看不到您如何从Pi获取这些数字。我尝试查看Pi的二进制表示形式,这些数字似乎与pi的第一个字节不匹配。似乎完全复制了上面的评论。在哪里找不到从Pi解释此表的构造的地方。

评论

您是在问这些数字是$ \ pi $还是为什么从$ \ pi $中提取这些数字?

有趣的问题,我还不知道答案(也无法通过谷歌搜索找到答案)。可能实际上不是我的袖子号码,而是装作一个;-)

《网络安全:公共世界中的私人通信》的作者对此表是否真的基于Pi提出了一些疑问。

还要注意,RC2(在RFC2268中)也有一个排列,该排列应该基于其关键时刻表中$ \ pi $的数字。 RFC中的最终表也无法解释(也用于RSA的其他算法中)。这些也从未解释过,AFAIK。

我想说这个问题的正确答案应该是一个足够简洁的解释,我可以实现一个算法,该算法接受pi的输入,并输出作为此S表的结果。

#1 楼

我向Ron Rivest发送了一封电子邮件,并得到了答复。

$ \ pi $的数字被用作Durstenfeld shuffle中使用的一种随机数生成器(另请参阅Knuth第3卷,sec 3.4.2)。

下面是一些伪代码,这些伪代码是根据他发送给我的描述和代码改编而成的。


S = [0, 1, ..., 255]
digits_Pi = [3, 1, 4, 1, 5, 9, ...] # the digits of pi

def rand(n):
  x = next(digits_Pi)
  y = 10

  if n > 10:
    x = x*10 + next(digits_Pi)
    y = 100
  if n > 100:
    x  = x*10 + next(digits_Pi)
    y = 1000

  if x < (n*(y/n)): # division here is integer division
    return x % n
  else:
    # x value is too large, don't use it
    return rand(n)

for i in 2...256: #inclusive
  j = rand(i)
  tmp = S[j]
  S[j] = S[i-1]
  S[i-1] = tmp


next函数只是逐步查看pi的数字。您会注意到rand并未使用其中的一些可能输出。 Rivest博士说,使用这些值将不会给出均匀的分布,因为它们太大。

评论


$ \ begingroup $
物有所值:创建MD2 S-Box的C proggy
$ \ endgroup $
– e-sushi
2014年8月15日4:47