イドのなんらか

TRPGしたりキャンプしたりするITエンジニアの人間が書く雑記

就活と称し暗号解析して遊んでいた

就活した

今日は暗号解析をしていた.
先日面接を受けた企業からの課題の一つである.

解析結果から言うと,暗号の中身はアルファベットの1:1の対応表を用いたものだった.
つまりは26C2のパターンで行われるタイプの変換をしているというものである.

解析の手順としては,文法から冠詞とかを抜き出してみて,変換先がわかりやすいものから洗い出していく感じになった.
つまりはaとかanとかandとかtheとか,そういうやつである.

多分頻出するアルファベットは統計解析的にも復号できそうだなぁと後になって思ったが,後の祭りである.
なにはともあれ,そのような形で文の大部分を変換した.

その後は暗号文と歯抜けの復号文を比較しながら,英単語を復元して対応表を埋めていった.
最終的に出来上がった復号用のコードを上げておこう.

data = list()

with open('e-data.txt', 'r') as f:
    while line := f.readline():
        # 1行ずつ取得し,改行は捨てる.大文字はすべて小文字に変換
        data.append(str(line).rstrip('\n').lower())
    f.closed

# a-zの変換表 (解読済み)
# ord(char) - ord('a')でインデックスが取れるのでそれで変換できる
conversionTable = ['l', 'p', 'd', 's', 'k', 't', 'r', 'u', 'm', 'z',
                   'g', 'n', 'c', 'b', 'e', 'q', 'o', 'h', 'j', 'v',
                   'a', 'x', 'y', 'i', 'w', 'f']

trueMessage = ''
for line in data:
    trueLine = ''
    for char in line:
        index = ord(char) - ord('a')
        # アルファベット以外はそのまま保存し,アルファベットは変換表から変換して保存
        if index < 0 or index >= 26:
            trueLine += char
        else:
            trueLine += conversionTable[index]
    trueMessage += trueLine
    trueMessage += '\n'

print(trueMessage)

とても簡単なコードである.
処理の内容は特段変なことをしているところはないと思う.

そんな感じで,暗号解析の課題が終わった.

ついでに文字列の処理とか数値の処理とかそういう課題も終わらせておいた.
Pythonをいじるのは久しぶりだったけど,まぁ高専とか大学の課題に比べればマシな部類である.
これをやれば就職できるなら,笑顔でできる代物だ.

後はデータベースの扱いとかgitの扱いとかの課題があるが,これは明日にしよう.
どのみちすぐに終わりそうである.

よし.
なんだかちゃんとエンジニアになれそうで安心した.

後は油断せずに,残りの面接などへの対策を重ねて明日を迎えよう.