リラックス! Linux! (9)シーザー暗号

簡単にできるシーザー暗号でちょっと息抜き

Linuxのコマンドラインで「シーザー暗号」を作って遊んでみます。

WindowsでLinuxコマンドライン環境を使えるようにするには

以下の記事を参考まで。

シーザー暗号とは

シーザー暗号とは、アルファベットの文字列を対象に、各文字をあらかじめ決められた数だけずらして暗号化する方法です。例えば、ABCを1文字後ろにずらすとBCDとなります。

映画「2001年宇宙の旅」でAIの「HAL9000」が登場します。この「HAL」を同様に1文字後ろにずらすと「IBM」になることは有名です。

“tr”コマンドで文字をずらしてみよう

端末から文字列を入力し、1文字前にずらして出力するプログラムを作成してみます。とりあえず、扱うのはアルファベットのみとします。グラスでも傾けながら、気楽にやってみましょう。

文字を変換するには”tr”コマンドを使用します。
trコマンドは、標準入力から文字を読み込み、オプションで指定されたルールに従って文字を変換します。
たとえば、”a”から”f”までの小文字を大文字に変換するにはこうします。

$ tr abcdefg ABCDEFG
a ← 小文字の"a"を入力して[Enter]
A ← 大文字の"A"に変換されて出力された
d ← 以下、同じ
D
bca
BCA
h 
h ← "a"から"f"の範囲外なので何も起こらない

trコマンドの1番目の引数は、変換前の文字セットです。2番目の引数は、変換後の文字セットです。なので、引数の文字の数は同じにします。

B→A、C→Bといった具合に手前に1文字ずらすには、tr コマンドのオプションに変換前と変換後の文字セットを指定します。
上記の引数”abcdefg”は、”a-g”と書くこともできます。つまり、下のように実行しても同じです。

$ tr a-g A-G
b
B
gf
GF

大文字と小文字を同時に指定する場合は下のように指定します。
下の例では、大文字は小文字に、小文字は大文字に変換されます。

$ tr A-Za-z a-zA-Z
a
A
A
a
z
Z

今回は1文字手前にずらしたシーザー暗号を作りたいので、次のように指定します。

$ tr B-Za-zA A-Za-z
ibm
hal
IBM
HAL
azAZ
ZyzY
I have an IBM PC.
H gZud Zm HAL OB.

1番目のオプション”[B-Za-zA]” と2番めの”[A-Za-z]”とで、1文字ずつ変換対象となる文字列が対応します。
次のように変換されます。
a → Z
A → z

編集済みのファイル(f.in)を暗号化し、別のファイル(f.out)に出力するには、次のように実行すればよいでしょう。

$ tr B-Za-zA A-Za-z < f.in > f.out