西出正美です。有益なことや無益なことなどいろいろ書いています。

Vimで暗号化

Vimで暗号化したいと思うこと、ありますよね。
僕はあるので自分用にメモです。

Vim で暗号化を行うには、次の方法が用意されています。

:set cryptmethod=blowfish

この blowfish の他に zip や、環境によっては blowfish2 が用意されています。使えるならばセキュリティの面から考えて blowfish2 を使うべきでしょう。 しかしです。本当にセキュリティの面から考えると、blowfish の発展型である Twofish※注:blowfish2 は Twofish ではありませんや AES 等の方がより良い選択肢なはずです。 今回、Vim の暗号化機能に頼らず、自前で openssl を用いて AES にて暗号化・復号をしてみたいと思います。

通常 vim で文章を保存するのには

:w

を行いますが、出力先を標準入力としてコマンドを実行することもできます。 すなわち、openssl へ以下のように渡せば良いわけです。

:w !openssl aes-256-cbc -out ~/vim_enc_test_file

2 回パスワードを聞かれるため、それを入力すれば指定した場所(この場合は~/vim_enc_test_file)へ書き込まれます。

復号する際は、Vim から

:r !openssl aes-256-cbc -d -in ~/vim_enc_test_file

とするか、もしくはコマンドラインから

cat ~/vim_enc_test_file | openssl aes-256-cbc -d | vim -

とします。

ただ、非常にイケてないことにこの書き込まれたファイルを text して見てみると、

00000000  53 61 6c 74 65 64 5f 5f  04 12 0d 0c 9e e8 74 aa  |Salted__......t.|
00000010  f6 60 00 e7 d1 60 7b 64  19 23 a5 ad 7f 4d 62 19  |.`...`{d.#...Mb.|

このように、ファイルの頭に「Salted__」の文字列が入るため、openssl にて暗号化したことはわかる人にはバレバレです。 もっとも、Vim の暗号化機能でも以下のように、

00000000  56 69 6d 43 72 79 70 74  7e 30 32 21 de 8b b9 db  |VimCrypt~02!....|
00000010  03 c7 6b 23 86 e1 25 79  e7 ee 6c 5e 27 9d eb 58  |..k#..%y..l^'..X|
00000020  f8                                                |.|

「VimCrypt~02!」という文字列が入るのでバレバレなのですが。

このバレバレなのをどうにかしたい時も、openssl でやる場合は簡単です。 以下のように dd で 8 バイトスキップすれば「Salted__」の文字列を消すことができます。

:w !openssl aes-256-cbc | dd ibs=8 skip=1 of=~/vim_enc_test_file

そうすると、以下のようなファイルが出力されます。

00000000  92 3a 22 ce 3e 26 5a cf  26 6c da e5 3c ec e9 c6  |.:".>&Z.&l..<...|
00000010  ad 3b c1 47 13 d6 e9 d2                           |.;.G....|

当然、一見ランダムですから、ただの乱数ファイルにも見えますし、たとえ暗号化されたファイルだとわかったとしてもいったいなんのソフトで暗号化されたのかもわかりません。

読み込みは以下のように行います。

:r !cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-cbc -d
cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-cbc -d | vim -

ちなみに圧縮もしてみましょう。書き込みは以下の通りです。

:w !bzip2 | openssl aes-256-cbc | dd ibs=8 skip=1 of=~/vim_enc_test_file

読み込みは以下の通りです。

:r !cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-cbc -d | bzcat
cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-cbc -d | bzcat | vim -

さて、最後にあとひと押しです。 「aes-256-cbc」はパスワードが間違っている場合にエラーを出します。CentOS6.8 の場合は以下のエラーとなります。

digital envelope routines:EVP_DecryptFinal_ex:wrong final block length

これは、総当りで復号化を試みるクラッカーにとっては助けにもなってしまいます。なぜなら、パスワードが間違っていることがわかるためです。 Mac 等では使えませんが、「aes-256-cbc」の代わりに「aes-256-ofb」を使うことで解決されます。 「aes-256-ofb」なら、パスワードが合っているのか間違っているのすらわかりません。 書き込みは以下の通りです。

:w !bzip2 | openssl aes-256-ofb | dd ibs=8 skip=1 of=~/vim_enc_test_file

読み込みは以下の通りです。

:r !cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-ofb -d | bzcat
cat <(echo -ne Salted__) ~/vim_enc_test_file | openssl aes-256-ofb -d | bzcat | vim -

パスワードが合っているのか間違っているのすらわからないというのは、つまりあなたのパスワードを突破しようとしても、パスワード 1 つ 1 つを確認しなければならないということです。 人間には不可能ですし、機械的に判定しようにも非常に手をこまねくはずです。 環境が許せばぜひやってみて下さい。

Vim と openssl で暗号化・復号をしようというお話でした。 みなさんもぜひやってみて下さい。

NISHIDEMASAMI.GITHUB.IO
NISHIDE, Masami

西出正美です。有益なことや無益なことなどいろいろ書いています。

©NISHIDE, Masami Some Rights Reserved