-2

以前にこのような同様の質問をしたことは知っていますが、この疑似コードはのコードと同じですか? 大文字の変数は疑似コード内の " ' " を含む変数で、条件付きの値はすべてリストにあります。たとえば、すべての "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]
4

2 に答える 2

3

あなたが指している疑似コードは、関数 f、定数 K と K'、セレクター r と r' などを定義しています。これらはすべて、表示しているコードのどこに隠れていますか? あなたはそれらを使用しているように見えますが、私たち (およびあなた) は、それらが正しいことを検査せずにどのように知ることができますか?

結局のところ、あなたのバグは、あなたが私たちから隠しているこのすべてのコードにある可能性があります。

于 2010-06-22T23:57:04.867 に答える
0

私の提案は、コードを関数に入れて単体テストすることです。期待どおりの出力が得られます。単体テストは、コードが想定どおりに機能することを確認するための非常に便利な方法です。たとえば、リスト内包表記は正しいリストになりますか?

また、Pythonのスタイルガイドを読むことをお勧めします。コードは必要以上に読むのが複雑だからです。たとえば、1行に複数のステートメントがあります。

于 2010-06-23T06:18:06.360 に答える