PHPでPGP・S/MIMEによる暗号化

問い合わせメールフォームなどでメール送信が発生する時、サイトはSSLに対応していてもメールが平文で送られてしまってはセキュリティ的に良くないので、PGPやS/MIMEを使用して暗号化することができます。

PGP・S/MIMEはメール文書の暗号化などに使われます。基本的なシーケンスは以下のようになります。

  1. 平文を暗号化する際に、まず当該平文を圧縮する
  2. セッション鍵と呼ばれる使い捨ての秘密鍵を作成し、共通鍵暗号方式で暗号化する
  3. セッション鍵は受け手の公開鍵で暗号化し、暗号文とともに送信する
  4. 受け手は、自分の秘密鍵で復号したセッション鍵を用いて暗号文を復号する

PGPとS/MIMEの主な違いは公開鍵証明書を使用するかしないかです。S/MIMEでは公開鍵の保証のため証明書を使用しますが、PGPでは利用者が互いに署名し合うことによって公開鍵を保証しています。

PHPでPGPを使用するにはGnuPG関数を使用します。

<?php
  // 暗号化用フィンガープリント(相手の鍵)、署名用のフィンガープリント(自分の鍵)、パスフレーズ
  $crypt_fp = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  $sign_fp = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
  $passphrase = 'fugafuga';

  $plain_text = 'hogehoge';

  $gnupg = new gnupg();
  // 暗号化用の鍵を追加
  $gnupg->addencryptkey($crypt_fp);
  $gnupg->addsignkey($sign_fp, $passphrase);

  // 暗号化のみ行う場合
  $ecrypted_text = $gnupg->encrypt($plain_text);
  // 署名を行う場合
  $signed_text = $gnupg->sign($plain_text);
  // 署名と暗号化を同時に行う場合
  $encryptsigned_text = $gnupg->encryptsign($plain_text);
?>

S/MIME形式ではopenssl_pkcs7_encrypt関数などで暗号化をします。

参考

http://php.net/manual/ja/function.gnupg-encrypt.php

http://php.net/manual/ja/function.openssl-pkcs7-encrypt.php