多表式暗号(Tabula recta)を生成するワンライナー

*1

大切なパスワードの管理方法が最近よく取り上げられています。

LastPass1Password など有名なオンラインパスワード管理サービスを利用する方法、Mac なら KeyChain で記憶する方法などを使っている方が多いのではないでしょうか。

以前はアナログな方法(紙に書いて大事に保管)で済んでいたものが、オンラインサービスの洪水でいつの間にか、そんな管理方法じゃやってられなくなりました。ほぼ毎日のようにどこかのサイトでユーザ登録をし、ある意味どうでもいいけど忘れたら困るパスワード。あるいは銀行やショッピングサイトのような絶対に他人に漏れてはいけないパスワードもあります。

昨年後半、

決定版! パスワード変更法、使用法、管理法

最強のパスワード管理ツール5選!

こんな記事を見るにつけ、いつかちゃんと管理しなおさないとヤバイなぁと思いながらも、面倒で面倒で放ってありました。

それに、オンライン管理サービスを利用するというのは、暗号化されて保管されるとはいえ、あまり気持ちのよいものではありません。理論的には安全かもしれませんが、抵抗のある方って意外と多いのではないでしょうか。

そんなとき、この記事を読みました。

パスワードを記録し、暗号化するための、超アナログな方法 : ライフハッカー[日本版]

では、多くの文字の中から、安全で忘れづらいパスワードを作るにはどうすればいいのでしょうか? Graham-Cumming氏は、多表式暗号(Tabula recta)を活用しているそう。

:

具体的な使い方は、こんな具合。たとえば、Amazonにログインするときは、「Amazon」という文字列の2番目「m」と3番目の「a」を選び、文字一覧表(左画像)の「m」の行と「a」の列にある文字(T)から順に、対角線上に16文字をパスワードにします(このケースだと、「TZ'k}T'p39m-Y>4d」となります)。もちろん、何番目の文字をベースにするかや文字の読み方は、必ずしも対角線でなくてもよく、垂直やスパイラルなど、自分でルールを決めればOKです。

なるほどなぁ。これなら自分でもできるかも…と思っていると、早速に多表式暗号(Tabula recta)の生成CGIを作ってくださった方もいらっしゃって

Cumpass Tabula Recta - Create Your New Password to be mobile

▼ 出力結果はこんな風になります(わ、先日見たときより進化してる)。


どうせなら、せめて暗号表の生成ぐらいはネットを通さないで自分のPC上でできるようにこんなのを書いてみました。


dd if=/dev/urandom  bs=1m count=1 | strings  | grep -o [[:alnum:]] | head -n 676 | tr  "\n" " " | fold -w 52 | 
awk 'BEGIN {print "  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \n=+==================================================="} {print substr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",NR,1)"|"$0}'

Mac OSX でしか試していませんが*2、こんな風に出力されますので、これをテキストファイルにリダイレクションして保存します。


  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
=+===================================================
A|D 8 1 M r U 7 U t g L j L g R E C 3 r w Z I S H k u 
B|G f M V y E H L D 5 b b f J 2 X N o l v n 8 G 7 q P 
C|i o 3 F z v B p O A p B n T C t S n h s 6 e n K e h 
D|v w S t p D 3 A l b b K N s 2 3 j D 0 s S k 5 t R Q 
E|A P g u h K 9 D k S J n i i 2 n D G x d n v y 6 5 T 
F|k P v a z 1 D L M a Q T K C h R d z h Q 5 8 w x P m 
G|Q c q T G j a Z 7 w 8 t 5 x k O 4 D v M 1 g 3 i e J 
H|V Y B S 6 B 4 7 F Z X K N W d I 2 w i r 7 q v y B A 
I|v C G x d l 9 3 Y c w G A a 3 V M m 4 x 8 G 7 J f D 
J|E 1 F T U o t G x y k N i B C f 4 j 6 i V l 2 g B N 
K|Z Z H U R U T v P v 6 G X z r w H R z y j t 9 A h V 
L|n Z X 5 U w 4 y u V W 5 v z 6 l G d t 4 x T 8 4 Z 4 
M|m V R i q 3 q 1 x P P i M k s 3 7 X h i t v q 3 h Z 
N|e T w M h L 9 S T s 8 V v 7 B t r u i q a u w M T Q 
O|P M u P Z R f r a D y J f D X T I 3 M X D o F Z 9 r 
P|O 4 I j R 5 m O 8 L j q k y N h i 9 Q A m N 5 7 y o 
Q|Z L M i I W J 6 W n o O v t u f 6 V A h i q E T V I 
R|p q T I j d n o R V W X N 8 Z a 0 a f d y j k 2 g d 
S|r F y j 7 3 7 F 6 6 z G N B t m T W E a b f Z b o j 
T|i u f U n L q v 2 d B G 6 E 8 L X F P 7 B h q R c G 
U|K X P M 8 8 u 1 U k t j w I i s Y q i Z 1 W I P M k 
V|0 Y e 9 K R 8 h v s W k t A q 2 J R J l 3 j h c q K 
W|o Q E G 5 p 4 h t I 2 G 4 U f z k x d J U m Y H H C 
X|G G I n L Q K j c f f f 5 G P R v c J 9 n U E t 3 r 
Y|l o j O z j y V z r E N T G W f I k U J M l N J Y q 
Z|G p N Z z 6 f 1 m G 9 V z 7 9 0 e O m 4 y p W b f 7 

見栄えはよくないけどね。Perl とか Ruby の 一発スクリプターの方ならもっと素敵にできるのかも。

*1:追記:2011/11/22 はてな記法を間違えていたため、ワンライナー正規表現が誤って表示されておりました。失礼いたしました。

*2:その後、ubuntuSV2.6 Debian2.6.26 でも確認、"bs=1m" はNGだったので"bs=1k" で実行