暗号化の方法は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))
'''