2017-09-17 75 views
-1

私は友人から挑戦を受けました。 彼は関数を逆にする必要があると言いました。入力を見つける必要があります。 しかし、私は時間をかけて論理を考えていて、コードで思ったことをどのように書くのか悩んでいます。暗号ブロックチェーンの復号XOR「暗号化」

彼は私にこのアルゴリズムを与えた:

def hash_cbc(input): 
    initial = 'a' 
    key = 'netsos' 

    output = [ord(initial)] 

    def enc(c, key, i): 
     z = key[i % len(key)] 
     return (c + ord(z))^ord(z) 

    for i in range(len(input)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(input[i]) 
     output.append(next_char) 

    return output 

をこのアルゴリズムの出力は次のようにする必要があります。

97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762 

私は入力を得ることができるので、機能を逆にする必要があります。入力は文字列でなければなりません。

助けてください、私は何時間も詰まっており結果がありません。 私はXOR関数を逆にすることを考えていましたが、それを書く方法を本当に混乱させました。


私は、これらのアルゴリズムは 「ENC(prev_char、キーがあるので、ループ

ではなく、私は逆にする方法がわからないことをやって、この

enc(prev_char, key, i)^1st ordinal input = 1st output 
enc(prev_char, key, i)^2nd ordinal input = 2nd output 
enc(prev_char, key, i)^3rd ordinal input = 3rd output 

などをやって考えていました私は混乱させる部分です

私は自分自身のリバースコードを作成しようとしました

def enc(c, key, i): 
Awalan = input("Insert numbers: ") 
Awalan_split = Awalan.split (', ') 
Awalan_len = len(Awalan_split) 

initial = 'a' 
key = 'netsos' 
output = [ord(initial)] 
z = key[i % len(key)] 
return (c + ord(z))^ord(z) 

for i in range(Awalan_len): 
    prev_char = output[i] 
    next_char = int(Awalan_split[i])^enc(prev_char, key, i) 
    char_convert = chr(next_char) 
    return(char_convert) 

print(char_convert) 

しかし運がないだけで、空の出力が得られます。 私のコードで何が問題になっていますか?

+0

そして、これを解決するために、あなたの試みで正確に助けが必要ですか? –

+0

私はXOR(^)関数を逆にしようとしていましたが、運がない...アルゴリズムの提案を私に与えることができます –

+0

あなたのために与えられたことをするプログラムを書くことは、ここでやっていることではありません。 StackOverflowは、Q&Aのナレッジベースとして存在するもので、カノニカルな質問(あなた以外の誰かが直面する可能性のある質問)を集めて答えます。あなたがどこにいて、より広範に適用できる潜在的な問題を見つけることができれば、その質問の周辺にある要素を削除して、その適用性をより明確にすることができます。やってみること)が助けになるだろう。 –

答えて

0

XOR自体が逆転します。 A^B = C、C^B = A。例:

>>> 123^456 
435 
>>> 435^456 
123 

結果、194の第2の値なので、元の値を生成する必要がありenc()機能を再度194をXOR、enc()関数の結果に未​​知の元の文字のXORをとることによって計算しました。

>>> 194^enc(ord('a'),'netsos',0) 
99 
>>> chr(99) 
'c' 

結果、299の3番目の値は、前の値を使用して暗号化関数とXORとしたinitial'a'あるとencの最後のパラメータは、現在の元の文字列のインデックス、そう0であることを忘れないでくださいシーケンスの次の文字なので、暗号化機能をXOR演算は再びそれを生成する必要があります

>>> 299^enc(194,key,1) # index (last parm) incremented 
105 
>>> chr(105) 
'i' 

このパターンに続き、その後、暗号解除機能は次のようになります。

output = [] 
for i in range(len(inp) - 1): # original will be one shorter. 
    prev_char = inp[i] 
    next_char = enc(prev_char, key, i)^inp[i+1] 
    output.append(next_char) 

それからちょうど文字に戻って生成された序数に変換:

ここ
return ''.join(chr(n) for n in output) 

はすべて一緒に縛られていますが:

# factor out common stuff 
initial = 'a' 
key = 'netsos' 
def enc(c, key, i): 
    z = key[i % len(key)] 
    return (c + ord(z))^ord(z) 

def hash_cbc(inp): 
    output = [ord(initial)] 

    for i in range(len(inp)): 
     prev_char = output[i] 
     next_char = enc(prev_char, key, i)^ord(inp[i]) 
     output.append(next_char) 

    return output 

def unhash_cbc(inp): 
    output = [] 
    for i in range(len(inp) - 1): 
     prev_char = inp[i] 
     next_char = enc(prev_char, key, i)^inp[i+1] 
     output.append(next_char) 

    return ''.join(chr(n) for n in output) 

expected_result = [97, 194, 299, 411, 533, 654, 768, 873, 965, 1066, 1164, 1272, 1399, 1512, 1603, 1706, 1792, 1895, 1994, 2110, 2215, 2310, 2404, 2517, 2645, 2762] 

u = unhash_cbc(expected_result) 
h = hash_cbc(u) 
print(h == expected_result) 
print(u) 

出力:

True 
cipheringblockingchaining 
+0

ありがとうございます!非常に有用で詳細な説明:D –