cli互換の暗号化・復号処理をいろいろな言語でやってみたとあるプロジェクトでOpenSSLのcliを使って暗号化したテキストを各種スクリプト言語で復号する必要に迫られてJavaとPHPの場合にはちょっと面倒だったので情報をまとめてみました。cliの暗号化・復号処理OpenSSLのcliで例えば以下の様にencオプションを使うと簡単にパスワードペースでのテキストの暗号化を行なえますが、これをJavaを使って復号しようとすると、OpenSSL互換のヘッダー情報の付加と解析に対応した機能がないためにそのままでは復号することができませんでした。OpenSSLのcliでテキストファイルの内容を暗号化する場合には、以下の例の様にオプションとして暗号化の方法とパスワードを与えるだけで簡単に暗号化された文字列を得ることができます。Vector=初期化ベクトル)を与える必要がありますが、OpenSSLではこのSaltとIVは自動的に生成されて暗号化されたデータのヘッダーへと埋め込まれるため、ユーザーはパスワード以外を意識する必要はありません。この記事のサンプルスクリプトにある様にPerlやRubyのOpenSSLライブラリではOpenSSLのcliでの暗号化互換のSaltとIVの生成メカニズムを持っている為に比較的簡単にOpenSSLのcliで暗号化されたテキストを復号することができるのですが、JavaとPHP向けのOpenSSLライブラリの場合にはこのOpenSSLのcli互換の仕組みを持っていなかったために自前でSaltとIVの生成メカニズムを組み込む必要がありました。ちなみに、OpenSSLのcliでencオプションを使ってAES方式で暗号化を行なった場合にはSaltにはランダムな8バイト(64ビット)のビット列が、IVには以下の方法で生成された16バイト(128ビット)のビット列が使われます。MD5これらが暗号化されたデータの先頭にヘッダー情報として付加されて暗号化データとして返されます。[暗号化されたデータ]復号する際には暗号化されたデータの先頭が"Salted__"であることを確認したならば、それに続く8バイトのデータをSaltとして利用して、暗号化の時と同じ様にパスワード、SaltからIVを生成し、Saltに続く暗号化されたデータの本体を復号します。##Javaの場合これを組み込んで書いたのが以下のサンプルコードです。Cli互換の方法でSaltとIVの生成を行なっています。