to site top page

Problem 59 - Project Euler

暗号化の方法はVigenere cipher(ヴィジュネル暗号).但し文字の変換はVigenere square(a = 0~z = 25で平文と鍵足して26で割った余り)ではなくasciiのbitごとにExclusive OR (EOR, XOR) .

鍵の長さが不明ならKasiski examination (カシスキーテスト) で鍵長のあたりをつけてからそれぞれ頻度分析ですが,今回鍵長は3で固定なので頻度分析のみ.

一般の書籍に見られるような英文の最頻出文字は,おそらく“e”(16歳のセアラが挑んだ世界最強の暗号 (Amazon) (広告) P24末に例外)ですが,“ ”(スペース)の数がそれ以上にあるかも知れませんのでまずは“ ”から.

……と,やって鍵決めうちで一発で答え出たという.以下,上記の事やっただけのプログラム.

# -vim- fileencoding: utf-8

cipher = []
for d in open("cipher1.txt", "r"):
    cipher = [int(i) for i in d.strip().split(",")]

keys = [[cipher[i] for i in range(len(cipher)) if i % 3 == j] for j in range(3)]

spc = []
for s in keys:
    count = 0
    tmp = 0
    for i in set(s):
        if s.count(i) > count:
            count = s.count(i)
            tmp = i
    spc.append(tmp)
key = [ord(" ") ^ i for i in spc]

ans = 0
for i in range(len(cipher)):
    ans += key[i % 3] ^ cipher[i]
print(ans)

'''
solve = []
for i in range(len(cipher)):
    solve.append(chr(key[i % 3] ^ cipher[i]))
print("".join(solve))
'''

can't load my result

最近の記事(5件分)

する事

そのうち記事にするかもリスト

欲しい本