在学习S表时,我注意到MD2使用基于Pi的S表。我不明白的是这些数字与Pi的关系。奇怪的是,我找不到任何描述它的地方。 RFC只是说:
此步骤使用从pi的数字构造的256字节“随机”置换。
在参考文献中代码中,有以下注释:
由pi的数字构造的0..255的置换。它提供了一个“随机”的非线性字节替换操作。
查看前几个字节:
41,46,67
我看不到您如何从Pi获取这些数字。我尝试查看Pi的二进制表示形式,这些数字似乎与pi的第一个字节不匹配。似乎完全复制了上面的评论。在哪里找不到从Pi解释此表的构造的地方。
#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
评论
您是在问这些数字是$ \ pi $还是为什么从$ \ pi $中提取这些数字?有趣的问题,我还不知道答案(也无法通过谷歌搜索找到答案)。可能实际上不是我的袖子号码,而是装作一个;-)
《网络安全:公共世界中的私人通信》的作者对此表是否真的基于Pi提出了一些疑问。
还要注意,RC2(在RFC2268中)也有一个排列,该排列应该基于其关键时刻表中$ \ pi $的数字。 RFC中的最终表也无法解释(也用于RSA的其他算法中)。这些也从未解释过,AFAIK。
我想说这个问题的正确答案应该是一个足够简洁的解释,我可以实现一个算法,该算法接受pi的输入,并输出作为此S表的结果。