opensslでファイル暗号化
みんな見られたくない画像とか一杯ストレージにあるよな? そういうわけでopensslを使ってファイルを暗号化する方法をメモ。 自分一人が暗号化、復号化できればそれでいいので共通鍵方式のAESを使って暗号化する。速度的にRSAを使うより多分速いだろうし。
暗号化
openssl enc -e -aes-256-cbc -in secret.jpg -out secret.enc
パスワードだけ設定しなければならないので入力しよう、一応ファイルの先頭行なんかをパスワードとして渡せる-kfile
なんかもあるがパスをどこかに書き込むのは抵抗ある。
パスを忘れたらまず復号できないので絶対に忘れないようにしよう。量子コンピュータとか完成したら復号できるかもな。
これでsecret.jpgは暗号化される、元のファイルは残ってしまうのでshred
かなにかで削除しよう。
とはいえ、最近のファイルシステムじゃジャーナリングとかで残っちゃうらしい。その辺面白そうだしforenっぽいので調べてみたい。TODOリストの100個目くらいに追加しておこう。
openssl
はサブコマンドとそのオプションを取るようになっている。
encは共通鍵のアルゴリズムで暗号化、復号化するらしい。
-e
が暗号化の指定になる。
今回の例では-aes-256-cbc
でAESの256bitを使ったが128bitもある、特に理由がなければbit長は長い方がいい。
最後のcbcは暗号化のモードで、これは直前のブロックも使って暗号化する方式になる。
よく推奨されるモードはcbcとctr、逆にecbは解読されやすいので絶対に使ってはいけない。
ちなみに復号するときも同じ方式じゃないといけないので注意。
他にはDESとかもあるけどAESが一番無難だし、十分な強度がある。
DESは鍵長が短すぎるので必要がない限り使うべきじゃない。
他のアルゴリズムも調べると面白そう。
-in
と-out
入力と出力先の指定になる。
指定しないと標準入出力になるらしい、stdoutとstdinで指定しても標準入出力になる。
復号化
openssl enc -d -aes-256-cbc -in secret.enc -out decrypt.jpg
復号するには入力を暗号化されたファイルにして、-e
を-d
に替えるだけでいい。
RSA
単にファイルを暗号化したいだけなら必要ないが、公開鍵方式で暗号化することもできる。
openssl genrsa -aes256 -out rsa.pem openssl rsa -pubout -in rsa.pem -out rsa.pub.pem openssl rsautl -encrypt -pubin -inkey rsa.pub.pem -in secret.jpg -out secret.enc openssl rsautl -decrypt -inkey rsa.pem -in secret.enc -out decrypt.jpg
上から、AES256bitで暗号化された秘密鍵の生成、公開鍵の作成、暗号化、復号化の処理になる。 復号できる人と暗号化できる人を分けたいときとか、何度もパス入力するのめんどいときなんかにはこっちの方が使いやすいかもしれない。