2016-11-20 3 views
2

私は挑戦を受けて、今はちょっと立ち往生しています。基本的には、XORされたASCIIコードのリストがあります。鍵はサイズ5の小文字の英字です。私はこれを解読するために周波数解析やPython用のツール(xortoolのようなもの)の使い方からさまざまな方法を読んだが、それらを機能させることはできなかった。 Xortoolは引数-l 5 -oで使用され、私は悲しみのように不器用な結果を100回受け取りました。XORされた文字列を、すべての可能な小文字の組み合わせで構成されたキーで解読する機能

この例では、上記ASCIIの最初の5つのコードのみを使用します。完全なメッセージは、バイナリに変換され、長さ1125

xor_min = ["49","29","1","67","42"] 

これである:

converted_min = ['00110001', '00011101', '00000001', '01000011', '00101010'] 

そしてIは、バイナリ形式で、小文字、アルファベットのすべての文字を含む別のリストを作りました。

alph = list(string.ascii_lowercase) 
bin_key = convert_to_bin((convert_to_ascii(alph))) 

これまですべてが完全に機能しています。今、私は何をしたいbin_keyのうち、26

key = list(itertools.combinations(bin_key, 5)) 

オクラホマのうち、すべての可能な組み合わせを含むサイズ5のキーを作成することです。現在のkeyはタプルのリストに65780要素を含んでいます。次のステップは、xor_minの各要素に対して、XOR演算がキーリストのタプルで行われることです。これは私が問題を抱えている部分です。ここに私の全体のコードは次のとおりです。

def xor_list(xor_encrypted, max_key): 
     key = list(itertools.combinations(max_key, 5)) 
     possible_xor = ['' for x in range(0, len(key))] 
     i = 0 
     for element in range(0, len(max_key)): 
      if i == 5: 
        i = 0 
      possible_xor[element] = operator.xor(int(xor_encrypted[i]), int(key[element][i])) 
      i+=1 
     return possible_xor 


alph = list(string.ascii_lowercase) 
bin_key = convert_to_bin((convert_to_ascii(alph))) 

xor_min = ["49","29","1","67","42"] 
converted_min = convert_to_bin(xor_min) 

プリント(xor_list(converted_min、bin_key))

私が手に出力されている:私はバイナリにint型に変換する必要があります知っている[1140048, 1106871, 1100010, 2067215, 1132123, 1140048, 1106871, 1100010, 2067215, 1132452, 1140048, 1106871, 1100010, 2067215, 1140073, 1140048, 1106871, 1100010, 2067215, 1145162, 1140048, 1106871, 1100010, 2067214, 1132122, 1140048, '', '', '', '', '',.........]

が、私ならばoperator.xrのbin関数を使用します。エラーメッセージが表示されます。

possible_xor[element] = operator.xor(bin(int(xor_encrypted[i])), bin(int(key[element][i]))) 
TypeError: unsupported operand type(s) for ^: 'str' and 'str' 

ご質問/ご要望がありましたら、お知らせください。また、他の/より良い解決策がある場合は、共有することを恐れないでください。復号化された5文字の結果で、私は何が意味をなされるかを見るためにそれらをスキミングします。それはリンクまたは英語の単語の始まりでなければなりません。

+0

あなたがアイテムを変換する理由を私は理解していません'xor_min'をバイナリ文字列に変換し、その文字列を' int(xor_encrypted [i]) 'で10進数として扱います。また、 'itertools.combinations'はソートされた組み合わせを反復せずに作成します。あなたが_really_長さ5のすべての可能な組み合わせをリストや文字列 'a'から求めたいなら、デカルト積が必要です:' product(a、repeat = 5) '。 26文字の場合、 '26 ** 5 = 11881376'の組み合わせが異なります。したがって、出力をリストに格納するのではなく、 'product' iterableを直接反復することが最善の方法です。 –

答えて

0

まず第一に、itertools.combinations(max_key, 5)で十分だと思いますか? 秘密鍵に「aaaaa」などの繰り返し文字が含まれる場合はどうなりますか?あなたのメソッドはそのようなバリアントをチェックしていません。

しかし、条件はキーが文字の繰り返しが含まれていないことを言ったら、それはOKですし、復号化のすべての可能な変形を表示するには、このコードを試すことができます。

import itertools 
import string 
encrypted = [100, 101, 102, 103, 104] 
alph = list(string.ascii_lowercase) 
bin_key = [b for b in map(ord, alph)] 
for i in itertools.combinations(bin_key, 5): 
    print([chr(i[k]^encrypted[k]) for k in range(5)]) 
+0

私は組み合わせの代わりに製品が必要だという事実を忘れてしまったようです。ありがとうございました。私はあなたが上でやったことを試みましたが、itertoolsの結果を試しました。productはタプルのリストであり、各要素は文字列です。これをやろうとすると、str^strが機能しないというエラーが出ます。 また、製品を作った後にキーをバイナリに戻す必要があると思います。ですから、代わりにバイナリのタプルのリストがあります。その後、私はそれとXOR演算を行うことができます。正しい?このよう – Vanayad

+0

試みもの: 'DEF xor_list2(xor_encrypted、キー)キーのIため possible_xor = [] : possible_xor.append([CHR(I [K]^xor_encrypted [K])の範囲内のkの( 1125)]) return possible_xor' 1125 - メッセージの真の長さです。 – Vanayad

+0

変換のためにこのようなことを試してみてください。 (0、len(key_list)): updated_list = []の要素の範囲(0、len(key_list)): の変換のための 変換されたリスト_append(bin(int(key_list [tup] return converted_list' – Vanayad

関連する問題