cutで暗号解読?rubyのzipを使った文字列合成

cut-command-puzzle

TVアニメ『ジョーカー・ゲーム』。戦時中のスパイ機関を題材にした短編ミステリー。毎回主役が変わり、たいていは一話完結なので、途中から見る人でも楽しめます。他のミステリー同様、最後に謎が解けますので、見終わって、あぁ、なるほどポン!、と手を打つことになります。私の場合は、いや、待てよ……、巻き戻し、再生、巻き戻し、再生と、何度も見て納得する楽しみ方になっていますが。

タイトル画像は、angoというテキストファイルの内容を表示した時の画像です。
偶数列、奇数列を別々に抽出すると、文字が現れる簡単な暗号ですが、真面目にcutコマンドの-bオプションに、1,3,5,7…と指定していてはダメです。
seqコマンドを使って-bオプション生成しましょう。

~$ cut -b`seq -s, 1 2 48` < ango
####### #     #   ###   
#       ##    #    #    
#       # #   #    #    
#####   #  #  #    #    
#       #   # #    #    
#       #    ##    #    
####### #     #   ###   

~$ cut -b`seq -s, 2 2 48` < ango
 #####  #     #    #    
#     # ##   ##   # #   
#       # # # #  #   #  
#  #### #  #  # #     # 
#     # #     # ####### 
#     # #     # #     # 
 #####  #     # #     # 
                        
~$ 

上段がENI、下段にGMAという文字列が抽出されました。ENIGMAです。
ENIGMA(エニグマ)は、第二次世界大戦でナイツ・ドイツが用いていた暗号機の名前です。

さて、cutでの文字列抽出は割と簡単に出来ましたが、文字列を交互に合成するのは、簡単にできる気がしませんね。どうやるのでしょうか。
まずは、それぞれのバナー出力の結果を文字数を揃えて格納します。

~$ banner ENI | tr '\n' '\0' | xargs -0 printf "%-24s\n" > eni
~$ banner GMA | tr '\n' '\0' | xargs -0 printf "%-24s\n" > gma

次に、rubyを使います。
eniとgmaファイルを読み込んで、それぞれa1、a2に格納します。
ruby-zip

配列a1とa2をzipで結合します。このzipメソッドは、ズボンのジッパーのように配列どうしがくっつきますが、zipしたままですと配列が2次元になってしまいますので、flattenで一次元配列にしています。最後に2つ連続している改行コードの片方を削って完成です

~$ ruby -e '
a1=File.binread("eni").unpack("C*");
a2=File.binread("gma").unpack("C*");
print a1.zip(a2).flatten().pack("C*").gsub(/\n\n/,"\n")'
# ###########   ##          ##      # ###       
##           #  ####       ###       ##  #      
##              ##  ##   #  ##     #  #    #    
### # #### # #  ##    ##    ##   #    #      #  
##           #  ##      #   ##   # # ### # # #  
##           #  ##        # ##   #    #      #  
# ###########   ##          ##   #  # # #    #  
                                                
~/blog/lic$ 

ENIGMA暗号機を打ち破ったのは、コンピュータが誕生するのに重要な役割を果たしたアランチューリング。暗号解読に成功したことで、戦争終結が早まり多くの命が死なずに済んだとも言われています。英雄のはずですが、彼自身は衝撃的で悲しい末路を辿っています。イミテーション・ゲームという映画にもなっていますので見ておきたい作品です。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA