使用md2哈希算法帮助 [英] Help wanted with md2 hash algorithm

查看:95
本文介绍了使用md2哈希算法帮助的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,下面你会发现我的简单python版本的MD2算法

,如RFC1319所述( http://rfc1319.x42.com/MD2)

它产生正确的结果短于16字节的字符串和错误的

导致更长的字符串。


我找不到什么是错的。


有人可以帮忙吗?


问候

沃尔夫冈


------ -------------------------------


#--- MD2验证数据

md2_test = [

('''','''8350e5a3e24c153df2275c9f80692773''),

(" a",''32ec01ec4a6dac72c0ab96fb34c0b5d1' '),

(" abc",''da853b0d3f88d99b30283a69e6ded6bb''),

(" message digest",''ab4f496bfb2a530b219ff33031fe06b0''),

(" abcdefghijklmnopqrstuvwxyz",

''4e8ddff3650292 ab5a4108c3aa47940b''),

(" ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv wxyz0123456789",

''da33def2a42df13975352846c30338cd''),


(" 123456789012345678901234567890123456789012345678 90123456789012345678901234567890",


''d5976f79d83d3a0dc9806c3c66f3efd8'')

]

#--- 256字节随机由数字构成的排列

PI_SUBST = [41,46,67,201,162,216,124,1,61,54,84,161,236,

240,6,

19,98,167,5,243,192,199,115,140,​​152,147,43,217,188,

76,130,202,30,155,87,60,253,212,224,22,103,66,111,24,

138,23,229,18,190,78, 196,214,218,158,222,73,160,251,

245,142,187,47,238,122,169,104,121,145,21,178,7, 63,

148,194,16,137,11,34,95,33,128,127,93,154,90,144,50,

39, 53,62,204,231,191,247,151,3,255,25,48,179,72,165,

181,209,215,94,146,42,172, 86,170,198,79,184,56,210,

150,164,125,182,118,252,107,226,156,116,4,241,69,157,

112,89,100,113,135,32,134,91,207,101,230,45,168,2,27,

96,37, 173,174,176,185,246,28,70,97,105,52,64,126,15,

85,71,163,35,221,81,175,58, 195,92,249,206,186,197,

234,38,44,83,13,110,133,40,132,9,211,223,205,244,65,

129,77,82,106, 220,55,200,108,193,171,250,36,225,123,

8,12,189,177,74,120,136,149,139,227,99, 232,109,233,

203,213,254,59,0,29,57,242,239,183,14,102,88,208,228,

166,119,114,248,235,117,75,10,49,68,80,180,143,237,

31,26,219,153,141,51, 159,17,131,20]

PADDING = [".join(map(chr,[i] * i))for i in range(17)]

SIZE = 16

#------------------------------- ---------------------------

def md2(m):


##(1)准备消息


#---附加到具有值i的mi字节,len(m)%16 == 0

padLen = SIZE - len(m)%SIZE

m + = PADDING [padLen]


#---计算m的校验和C并将其附加到m

C = [0] * SIZE

L = 0

我在范围内(len(m)/ SIZE):

m16 = m [i * SIZE :(i + 1)* SIZE]

for j in range(SIZE):

c = ord(m16 [j])

C [j] = PI_SUBST [c ^ L]

L = C [j]

C ="" .join(map(chr,C))

m + = C


##(2)压缩消息


X = [0] * 48#''压缩机''


我在范围内(len(m)/ SIZE):


#fill X

m16 = m [i * SIZE:(i + 1)* SIZE]

X [16:32] =地图(ord,m16)

X [32: 48] = [a ^ b for(a,b)in zip(X [16:48],X [:16])]


#compress m

t = 0

范围内的j(18):

范围内的k(48):

t = X [k] ^ PI_SUBST [t]

X [k] = t

t =(t + j)%256


X =" ;.join(map(lambda d:"%02x" %d,X [:SIZE]))

返回X

def test():
md2_test中的(i,j)


md = md2(i)

print" Message:%s" %i

print" My MD:%s" %md

print" Test MD:%s" %j

print"%s" %(md == j)

打印


if __name__ ==" __ main __":

test()

hi all,

below you find my simple python version of MD2 algorithm
as described in RFC1319 (http://rfc1319.x42.com/MD2).
It produces correct results for strings shorter than 16 Bytes and wrong
results for longer strings.

I can''t find what''s wrong.

Can anybody help?

Regards
Wolfgang

-------------------------------------

#--- MD2 validation data
md2_test = [
('''', ''8350e5a3e24c153df2275c9f80692773''),
("a", ''32ec01ec4a6dac72c0ab96fb34c0b5d1''),
("abc", ''da853b0d3f88d99b30283a69e6ded6bb''),
("message digest", ''ab4f496bfb2a530b219ff33031fe06b0''),
("abcdefghijklmnopqrstuvwxyz",
''4e8ddff3650292ab5a4108c3aa47940b''),
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv wxyz0123456789",
''da33def2a42df13975352846c30338cd''),

("123456789012345678901234567890123456789012345678 90123456789012345678901234567890",

''d5976f79d83d3a0dc9806c3c66f3efd8'' )
]
#--- 256-byte "random" permutation constructed from the digits of pi
PI_SUBST = [41, 46, 67, 201, 162, 216, 124, 1, 61, 54, 84, 161, 236,
240, 6,
19, 98, 167, 5, 243, 192, 199, 115, 140, 152, 147, 43, 217, 188,
76, 130, 202, 30, 155, 87, 60, 253, 212, 224, 22, 103, 66, 111, 24,
138, 23, 229, 18, 190, 78, 196, 214, 218, 158, 222, 73, 160, 251,
245, 142, 187, 47, 238, 122, 169, 104, 121, 145, 21, 178, 7, 63,
148, 194, 16, 137, 11, 34, 95, 33, 128, 127, 93, 154, 90, 144, 50,
39, 53, 62, 204, 231, 191, 247, 151, 3, 255, 25, 48, 179, 72, 165,
181, 209, 215, 94, 146, 42, 172, 86, 170, 198, 79, 184, 56, 210,
150, 164, 125, 182, 118, 252, 107, 226, 156, 116, 4, 241, 69, 157,
112, 89, 100, 113, 135, 32, 134, 91, 207, 101, 230, 45, 168, 2, 27,
96, 37, 173, 174, 176, 185, 246, 28, 70, 97, 105, 52, 64, 126, 15,
85, 71, 163, 35, 221, 81, 175, 58, 195, 92, 249, 206, 186, 197,
234, 38, 44, 83, 13, 110, 133, 40, 132, 9, 211, 223, 205, 244, 65,
129, 77, 82, 106, 220, 55, 200, 108, 193, 171, 250, 36, 225, 123,
8, 12, 189, 177, 74, 120, 136, 149, 139, 227, 99, 232, 109, 233,
203, 213, 254, 59, 0, 29, 57, 242, 239, 183, 14, 102, 88, 208, 228,
166, 119, 114, 248, 235, 117, 75, 10, 49, 68, 80, 180, 143, 237,
31, 26, 219, 153, 141, 51, 159, 17, 131, 20]
PADDING = ["".join(map(chr, [i]*i)) for i in range(17)]
SIZE = 16

#----------------------------------------------------------
def md2(m):

## (1) prepare message

#--- append to m i byte with value i, len(m) % 16 == 0
padLen = SIZE - len(m) % SIZE
m += PADDING[padLen]

#--- compute checksum C of m and append it to m
C = [0] * SIZE
L = 0
for i in range(len(m) / SIZE):
m16 = m[i*SIZE : (i+1)*SIZE]
for j in range(SIZE):
c = ord(m16[j])
C[j] = PI_SUBST[ c ^ L ]
L = C[j]
C = "".join( map(chr, C) )
m += C

## (2) compress message

X = [0] * 48 # ''compressor''

for i in range(len(m) / SIZE):

# fill X
m16 = m[i*SIZE : (i+1)*SIZE]
X[16:32] = map(ord, m16)
X[32:48] = [ a^b for (a,b) in zip(X[16:48], X[:16]) ]

# compress m
t = 0
for j in range(18):
for k in range(48):
t = X[k] ^ PI_SUBST[t]
X[k] = t
t = (t+j) % 256

X = "".join(map(lambda d: "%02x" % d, X[:SIZE]))
return X
def test():
for (i, j) in md2_test:
md = md2(i)
print "Message: %s" % i
print "My MD:%s" % md
print "Test MD:%s" % j
print "%s" % (md== j)
print

if __name__ == "__main__":
test()

推荐答案

2006年1月6日星期五 wj ** **@web.de 写道:
On Fri, 6 Jan 2006 wj****@web.de wrote:
下面你会发现我的简单python版本的MD2算法
,如RFC1319所述( http://rfc1319.x42.com/MD2)
它为字符串生成正确的结果超过16字节和错误的结果更长的字符串。

我找不到什么是错的。

任何人都可以帮忙吗?
below you find my simple python version of MD2 algorithm
as described in RFC1319 (http://rfc1319.x42.com/MD2).
It produces correct results for strings shorter than 16 Bytes and wrong
results for longer strings.

I can''t find what''s wrong.

Can anybody help?




好​​的,我已经从头开始重新实现了代码,基于RFC,甚至没有看到你的代码,作为比较的基础。


麻烦的是,我得到与你完全相同的结果!


这里是我的:
http://urchin.earth.li/~twic/md2.py


我猜测要做的事情是从RFC中提取C代码并编译它,

验证它是否有效,然后在C中粘贴大量的打印语句,然后ç€
python ,看看校验和引擎状态的分歧。


tom


-

所有人死亡元音!真理部说元音是加号

不加考虑。元音是欧亚的情节!大哥,带领我们获得胜利

获胜!



Okay, i''ve reimplemented the code from scratch, based on the RFC, without
even looking at your code, as a basis for comparison.

The trouble is, i get exactly the same results as you!

Here''s mine:

http://urchin.earth.li/~twic/md2.py

I guess the thing to do is extract the C code from the RFC and compile it,
verify that it works, then stick loads of print statements in the C and
the python, to see where the states of the checksum engines diverge.

tom

--
Death to all vowels! The Ministry of Truth says vowels are plus
undoublethink. Vowels are a Eurasian plot! Big Brother, leading us proles
to victory!


wj****@web.de 写道:
下面你会发现我的简单python版本的MD2算法
,如RFC1319所述( http://rfc1319.x42.com/MD2)
它为短于的字符串生成正确的结果16字节和错误
结果更长的字符串。
below you find my simple python version of MD2 algorithm
as described in RFC1319 (http://rfc1319.x42.com/MD2).
It produces correct results for strings shorter than 16 Bytes and wrong
results for longer strings.




为什么要使用MD2?这是非常缓慢的,并且出于安全原因也被弃用了
。使用SHA1(内置于Python库中)

或SHA256 / 384/512(实现正在循环)。



Why do you want to use MD2? It''s very slow and it''s also been
deprecated for security reasons. Use SHA1 (built into Python library)
or SHA256/384/512 (implementations are circulating) instead.




Paul Rubin写道:

Paul Rubin wrote:
wj****@web.de 写道:
下面你会找到我的简单python版本的MD2算法
,如RFC1319所述( http://rfc1319.x42.com/MD2)
它为短于16字节的字符串生成正确的结果,为更长的字符串生成错误的结果。
below you find my simple python version of MD2 algorithm
as described in RFC1319 (http://rfc1319.x42.com/MD2).
It produces correct results for strings shorter than 16 Bytes and wrong
results for longer strings.



为什么要使用MD2?这是非常缓慢的,并且出于安全原因也被弃用了。使用SHA1(内置于Python库)
或SHA256 / 384/512(实现正在循环)。



Why do you want to use MD2? It''s very slow and it''s also been
deprecated for security reasons. Use SHA1 (built into Python library)
or SHA256/384/512 (implementations are circulating) instead.




我想了解它,并且 - 因此;-) - 我想在纯Pyhton中实现它





I want to understand it, and -- therefor ;-) -- I want to implement it
in pure Pyhton.


这篇关于使用md2哈希算法帮助的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆