[Unix] xargsで複数コマンドを実行させてシーザー暗号を解く

暗号技術入門 を読み始めたのですが、その中にシーザー暗号が出てきました。
ターミナルで解けないかなと思って調べたら このページ にたどり着きました。

trコマンドを使うとできるようです。

$ echo "krjhkrjh" | tr "$(printf %23sa-z)" a-za-z
hogehoge

うーん tr コマンドを使って置き換えているようだけどよくわからない...

trコマンドの説明抜粋

NAME
     tr -- translate characters
 
SYNOPSIS
     tr [-Ccsu] string1 string2
     tr [-Ccu] -d string1
     tr [-Ccu] -s string1
     tr [-Ccu] -ds string1 string2

string1をstring2に置き換えてくれますが、string1の先頭にスペースがあると置き換えられるstring2の文字列がずれます。
なるほど、記事を書いていてやっと理解できました。
printfを使うと、%フォーマットが使えるので、何文字ずらすが簡単にできます。

これを使って、シーザー暗号を特には1から25までずらして行って、意味の通るものが正解です。
先ほどの例を解く場合はxargsコマンドを使って、printfの数値を変化させれば良いです。
xargsを使って、複数コマンドを実行させるには、 sh -c としてコマンドを実行させます。

$ seq 1 25 | xargs -n 1 -I@ sh -c 'echo "krjhkrjh" | tr "$(printf %@sa-z)" a-za-z'
lskilski
mtljmtlj
numknumk
ovnlovnl
pwompwom
qxpnqxpn
ryqoryqo
szrpszrp
tasqtasq
ubtrubtr
vcusvcus
wdvtwdvt
xewuxewu
yfxvyfxv
zgywzgyw
ahzxahzx
biaybiay
cjbzcjbz
dkcadkca
eldbeldb
fmecfmec
gnfdgnfd
hogehoge
iphfiphf
jqigjqig

hogehogeが見つかりました。

0 件のコメント :

コメントを投稿