2010-06-22 275 views
-2

我知道ive之前曾問過類似的問題,但是:這個僞代碼here與我的代碼相同嗎?大寫變量是僞代碼中帶有「'」的變量,條件值全部在列表中,例如:所有「s」條件都在列表「s」和「s」中,列表「S」中的條件爲這兩個代碼是否相等?

for i in xrange(t): 
    a = h0; b = h1; c = h2; d = h3; e = h4 
    A = h0; B = h1; C = h2; D = h3; E = h4 
    X = data[512*i:512*(i+1)]     # the data is a binary string 
    X = [int(X[32*x:32*(x+1)],2) for x in xrange(16)] 
    for j in xrange(80): 
     a, e, d, c, b = e, d, ROL(c,10), b, ROL((a + F(b, c, d, j) + X[r[j]] + k[j/16])%(1<<32), s[j]) + e 
     A, E, D, C, B = E, D, ROL(C,10), B, ROL((A + F(B, C, D, 79-j) + X[R[j]] + K[j/16])%(1<<32), S[j]) + E 
    T = (h1+c+D)%(1<<32) 
    h1 = (h2+d+E)%(1<<32) 
    h2 = (h3+e+A)%(1<<32) 
    h3 = (h4+a+B)%(1<<32) 
    h4 = (h0+b+C)%(1<<32) 
    h0 = T 

我一直在研究這段代碼(偶爾),現在已經有相當長一段時間了,而且由於某些原因,我還沒有能夠使這段代碼正常工作。爲什麼???確保數據的預處理是正確的,但即使我複製其他人的代碼並將它們轉換成python時,輸出也沒有接近正確的地方

這部分代碼應該是正確的:

def F(x,y,z,round): 
    if round<16: 
     return x^y^z 
    elif 16<=round<32: 
     return (x & y) | (~x & z) 
    elif 32<=round<48: 
     return (x | ~y)^z 
    elif 48<=round<64: 
     return (x & z) | (y & ~z) 
    elif 64<=round: 
     return x^(y | ~z) 

h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; h4 = 0xC3D2E1F0 
k = [0, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E] 
K = [0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0] 

s =  [ 11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8, 
     7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12, 
     11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5, 
     11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12, 
     9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6] 

S =  [ 8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6, 
     9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11, 
     9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5, 
     15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8, 
     8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11] 

r =  range(16) + [ 
     7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 
     3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 
     1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 
     4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13] 

R =  [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 
     6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 
     15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 
     8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 
     12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11] 

回答

3

您指向的僞代碼定義了一個函數f,常量K和K',選擇器r和r'等等 - 這些東西都隱藏在您要顯示的代碼中?你似乎在使用它們,但是,我們(和你)怎麼知道它們是正確的,沒有任何檢查?

您的錯誤,畢竟,可能在你隱藏的所有這些代碼。

+0

好的。我添加了常量和f。我很確定他們是正確的,雖然 – calccrypto 2010-06-23 01:00:53

+0

「很肯定」和「肯定/證明」 – 2010-06-23 01:23:49

+0

之間有很大的區別,他們是一樣的嗎? – calccrypto 2010-06-23 01:39:57

0

我的建議是將代碼放入函數並進行單元測試。你有一個預期的輸出,而單元測試是一種非常有用的方式,可以驗證代碼是否符合它的要求。例如,你的列表理解結果是否在正確的列表中?

我還建議你閱讀Style Guide for Python,因爲你的代碼比它需要的更復雜。例如,您在一行中有多個語句。