2017-05-16 12 views
-10

このコードで何が問題になっていますか? 「:文字列インデックス範囲外のはIndexErrorを」最後のインデックスがある7 len(md5_final) == 7のでとmd5_final[6]iがあるとき私のPythonコードが動作しないのはなぜですか?

import hashlib 
import struct 
import re as sbc 
xorer=[117, 5, 36, 94, 6, 23, 113, 44, 71, 105, 6, 125, 1, 6, 90, 31, 54, 57, 117, 118, 2, 123, 61, 112, 1, 74, 106, 98, 69, 2, 12, 93] 

md5_final="8a0e2e33fc0ef5f4d1b9243139a2aa4f" 

flag='' 
for i in range(32): 
    flag+=str(chr(ord(md5_final[i])^xorer[i])) 

print "answer{"+flag+"}" 
exit() 
+7

'md5_final'は' 7'文字ですが、あなたは '31'までインデックスを作成しようとしています。 –

+2

コードを投稿して何が間違っているかを尋ねるのではなく、何をしようとしているのか、達成したいことの説明を追加する必要があります。 – Antimony

答えて

3

あなたのコードが正しくIndexErrorためのmd5_final[i]アクセスして失敗している - 出力ではなく、エラーを与えて与えていませんあなたはアクセスすることができます。

私の盲目的な推測は、range(32)range(len(md5_final))に置き換える必要があるコードを修正することです。その後、answer{8pC9jr}が印刷されます。つまり、あなたの "Muggles"文字列は、バイト単位でxorerの値でXORされます。実際の例では、そこに32文字の文字列があると思います。 "Muggles"の代わりに "8a0e2e33fc0ef5f4d1b9243139a2aa4f"となるので、range(32)となります。

同様に、i >= len(xorer)の場合、コードが破損します。実装する内容に応じて、標準的な解決策はxorer[i % len(xorer)]またはrange(min(len(md5_final), len(xorer)))です。または、len(md5_final) == len(xorer)の両方をアサートし、例外である場合は例外を発生させます。

しかし、それはただの盲目的な推測でした。あなたが何をしているのかを説明してみてください。あなたのインプットは何ですか?インプリメンテーションのアルゴリズムは何ですか?

また、単純なXOR暗号とMD5ハッシュ関数の両方が現実世界のセキュリティではあまりにも不十分であることに注意してください。したがって、これは学習プロジェクトではなく、実際の実用的なアプリケーションがある可能性がある場合は、自分が行っていることについて誰かと相談する方がよいでしょう。

+0

md5_finalの値を "8a0e2e33fc0ef5f4d1b9243139a2aa4f"に変更しました。しかし、答えは読めない形式で来ています。 – Kickstand

+0

@Kickstandそれはあなたのコードが行うことです - それはデータをXORし、基本的にバイナリを出力します。このバイナリには、印刷できない文字が含まれている可能性があります。何をしているのかを記述して質問を編集してください。私は助けようとします。 – drdaeman

0

md5_final文字列の長さは7文字ですが、forループはi = 0..31と繰り返されます。あなたは> 6. md5_final[i]ときi

にアクセスしたときに

これが問題の原因になりますあなたは、おそらくこのような何かをしたい:answer{8pC9jr}

for i in range(len(md5_final)): 
    flag += str(chr(ord(md5_final[i])^xorer[i])) 

出力は次のようになります。

0

コードでは、md5_final文字列に7文字しか含まれていないところで、0から32までルー​​プしてみます。 md5_final[7]にアクセスすることはできません。これを試してください:

for i in range(len(md5_final)): 
+0

最終的には '' '.join(chr(ord(final)^ xor))、zipにはxor(md5_final、xorer)を使用すると、 '' zip''と '' str.join'を使うことができます。 )) ') –

関連する問題