株式会社エスロジカル
株式会社エスロジカル
セキュリティ、Web開発、Unix開発、Go言語

■ OpenSSL:opensslコマンド(基本:md5,des3.blowfish)

技術ドキュメント目次 -> OpenSSL -> opensslコマンド(基本:md5,des3.blowfish)

本技術ドキュメントは、ここしばらくメンテナンスをしておりません。
内容が古くなっている可能性などございますこと、ご理解を頂けますようお願いいたします。


サイフにやさしいSSL証明書
【低価格SSL証明書】弊社運営の低価格SSL証明書販売サイト、翌月末払いなど請求書払いも可能。


◆ OpenSSLについてはじめに

OpenSSL は、非常に有名で強力な暗号化のツールキットです。

開発者が OpenSSL を使用する際には次のどちらかのようにして、
使用することになるかと思います。

1.OpenSSLのライブラリを使用して、C言語などのプログラムから、
  暗号化の処理を行う関数を呼び出す。
2.opensslのパッケージをmakeすることで生成される実行ファイルを
  使用して、暗号化の処理を行う。

ここでは、
opensslコマンドを使用する方法についての、幾つかtipsを紹介します。
(最近は多くのOS環境においてOpenSSLが標準で付属してきますが、
 OpenSSLをmakeすると、opensslというコマンドが生成されます。
 opensslコマンドは、多数のアルゴリズムに対応した暗号化・複合化や、
 ハッシュ関数を用いたデータのハッシュを、コマンドを実行すること
 でできるので、状況によっては大変便利です。)

なお、opensslコマンドは、
デフォルトでは /usr/local/ssl/bin/openssl としてインストールされます。

また、下記の文章内に出てくるdes3(トリプルDES)・Blowfishとは、
どちらも共通鍵方式の暗号アルゴリズムの名前です。

◆ md5値の求め方

opensslコマンドを使用して、
MD5アルゴリズムによるデータのハッシュを行うためには、次のように入力します。

なお、
MD5 はハッシュアルゴリズムですので、
出力された結果から、入力値を求めることはできません。
(下記の例でいうところの、
 "18e6b1ff5d7633a3fdf0d3915cf641e5" から、
 "This is test string" を求めることはできません。
 "This is test string" から、
 "18e6b1ff5d7633a3fdf0d3915cf641e5" を求めることのみ可能です。)

$ cd /usr/local/ssl/bin
$ echo "This is test string" | ./openssl md5
18e6b1ff5d7633a3fdf0d3915cf641e5


他のコマンドで MD5値を求めてみて、
opensslコマンドと同じ結果になるか確認してみます。
下記の例では md5 コマンドを使用していますが、
md5sum 名前のという同じ動作をするコマンドも、
多くの OS に標準でインストールされています。

$ echo "This is test string" | md5
18e6b1ff5d7633a3fdf0d3915cf641e5


◆ des3(トリプルDES) での暗号化・複合化(saltの指定無し)

次のようにして、
opensslコマンドを使用した暗号化・複合化を行うことができます。
コマンドとして実行できるので、
PerlのCGIの中などで実行するときなど、非常に便利です。
(多くのパフォーマンスが求められているときには、
 外部コマンドを実行するという比較的負荷の大きい処理を行うこと
 ができない場合もあるかもしれません。)

(暗号化)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..'
U2FsdGVkX19N0YWttghPtA40XzLnMzG9cy27qjX3OQK9BetS+j53/w==
 
(上記暗号化の出力結果を、複合化する。)
(-e オプションを -d オプションに変更します)
$ echo U2FsdGVkX19N0YWttghPtA40XzLnMzG9cy27qjX3OQK9BetS+j53/w== | openssl des-ede3 -d -base64 -k 'ThisIsTestKey..'
This is test string
$


-k の後の値を元に暗号化・複合化で使用する共通鍵が生成されますので、
(-k の後の値がそのまま鍵として使用されるわけではありません)
-k の後の値を異なる値にして複合化を試みると、
bad decrypt といったエラーメッセージが表示されます。

◆ des3の暗号化・複合化において、saltの指定を行う

先ほどの実行例では、saltの指定を行っていませんので、
-k オプションで同じ文字列を指定していても、
暗号化の結果として出力される値が下記のように毎回異なってしまいます。

下記の実行例は、
-k オプションで同じ値を指定しながら、
同じ文字列を複数回暗号化してみた結果になります。

その際に、-p オプションを付加して salt と key の値を確認していますが、
saltの値としてそれぞれ異なる値を使用しているので、
keyの値もそれぞれ異なった値になり、
結果として出力されるメッセージも異なった値になっていることを確認できます。

(1回目の実行)
$ echo "This is test string" | ./openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -p
salt=34017588C10E3364
key=298DA43B5DCA70A5F4B134E6D2874C5D9D4418578831E0C9
U2FsdGVkX180AXWIwQ4zZDOMpOg2K1jIUh3u1/b0zFVenZXwGNohag==
$

(2回目の実行)
$ echo "This is test string" | ./openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -p
salt=216E219C0A474ADE
key=2A27F0A2500A5A3B606BA30E43A750DD68D83A4971382772
U2FsdGVkX18hbiGcCkdK3nqCrTA3VtNl1lEHWhK3CToJJ2lhUkCGug==
$

(3回目の実行)
$ echo "This is test string" | ./openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -p
salt=E845F1FEB8B843D5
key=453EDAF937C3F2DB57B72505F2675BC8D72554CAAC2921D5
U2FsdGVkX1/oRfH+uLhD1cZpKK3yQU3FrXUCgQRR/9R21Eb3tQFAog==
$

もちろん、
上記すべての出力結果を -k 'ThisIsTestKey..' の指定で複合化できます。


-k の指定に 同じ文字列を指定した際には、
常に同じ文字列が出力されるようにするためには、
salt の指定を明示的に行うことで実現できます。

(例えば、CGI内でのセッション管理などで、
 暗号化したユーザーIDの値を使用したい状況などで、
 この技術を応用することができるかもしれません。)

次の実行例では、-K オプションで saltの指定をしているので、
暗号化された文字列が常に同じ値になっています。

(1回目の実行:saltの指定は 0123456789ABCDE)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 0123456789ABCDE
U2FsdGVkX1+Nq1pQq4T46S18pIODbdm0bVYD2R5a3sPterYwUKeHLA==
$

(2回目の実行:saltの指定は 0123456789ABCDE)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 0123456789ABCDE
U2FsdGVkX19HWkLMZa9bhy18pIODbdm0bVYD2R5a3sPterYwUKeHLA==
$

(3回目の実行:saltの指定は 0123456789ABCDE)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 0123456789ABCDE
U2FsdGVkX185q6A9FiBaLC18pIODbdm0bVYD2R5a3sPterYwUKeHLA==
$

(1回目の実行:saltの指定は 38DD2F31AEAC9A7A)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 38DD2F31AEAC9A7A
U2FsdGVkX1/xQ8FOnUr9W/3zWEBdKe+gdInOI0uWgsd3dkO0ZpOHeA==
$

(2回目の実行:saltの指定は 38DD2F31AEAC9A7A)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 38DD2F31AEAC9A7A
U2FsdGVkX19mHqxnblmGCf3zWEBdKe+gdInOI0uWgsd3dkO0ZpOHeA==
$

(3回目の実行:saltの指定は 38DD2F31AEAC9A7A)
$ echo "This is test string" | openssl des-ede3 -e -base64 -k 'ThisIsTestKey..' -K 38DD2F31AEAC9A7A
U2FsdGVkX1+tn0nJRDZlK/3zWEBdKe+gdInOI0uWgsd3dkO0ZpOHeA==
$


◆ Blowfish での暗号化・複合化を行う

上記までの実行例では、
暗号化のアルゴリズムとしてトリプルDESを使用していましたが、
OpenSSL はもちろんそれ以外のアルゴリズムにも対応しているので、
他のアルゴリズムで暗号化・複合化を行うことが可能です。

例えば、Blowfish で暗号化・複合化するためには、
openssl の一つ目の引数 を bf に変更すればOKです。

(暗号化)
$ echo "This is test string" | openssl bf -e -base64 -k 'ThisIsTestKey..'
U2FsdGVkX1+6K9trGLDKdcONf+RKAy4ySweNTa4aZR93Sl294miPng==
$

(複合化)
$ echo U2FsdGVkX1+6K9trGLDKdcONf+RKAy4ySweNTa4aZR93Sl294miPng== | openssl bf -d -base64 -k 'ThisIsTestKey..'
This is test string
$




■ OpenSSL についての他のドキュメント


■ 他のグループのドキュメント

Apache  /  Linux  /  FreeBSD  /  OpenSSL  /  Perl  /  HTTPプロトコル  /  Jakarta Tomcat  /  Java  /  NetBSD  /  Oracle  /  PostgreSQL  /  UNIX の C言語  /  UNIX のコマンド  /  Windows  /  bind  /  システム運用TIPS

アンケートにご協力をお願いいたします。

1. このドキュメントへの評価をご選択ください。
         

2. ご感想をお書きください。