fr33f0r4ll

自分用雑記

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で暗号化された秘密鍵の生成、公開鍵の作成、暗号化、復号化の処理になる。 復号できる人と暗号化できる人を分けたいときとか、何度もパス入力するのめんどいときなんかにはこっちの方が使いやすいかもしれない。