share facebook facebook twitter menu hatena pocket slack

2012.04.11 WED

GnuPGを使ってファイルを暗号化(PHP偏)

木村 圭佑

WRITTEN BY 木村 圭佑

こんにちは。
職人見習いの木村です。

前回のエントリー(GnuPGを使ってファイルを暗号化(Linux偏))では、暗号化&復号化をLinux上で行いましたが、
今回は、PHPで暗号化し、WindowsPCで復号化する方法を紹介します。

流れは、以下のようになります。

  1. PHPでファイルを暗号化
  2. PHPで暗号化されたファイルを添付したメールを送信
  3. WindowsPCでメールを受け取り、ツールを使って復号化

それでは、順番に進めていきます。
まず、PHPのexec関数でcsvファイルを暗号化します。
Apacheユーザーにはgpgの実行権限がないので、sudoして実行します。

exec('sudo /usr/bin/gpg -e -a -r hoge@hoge.com hoge.csv 2>&1',$output,$ret_val);

この時、「sudo: sorry, you must have a tty to run sudo」とエラーが出る場合は、/etc/sudoersの
にコメントアウトをしてあげると、エラーが無くなります。

Defaults requiretty

これで、暗号化は出来ました。
次に、添付ファイル付きのメールを送ります。
mb_send_mailでは添付ファイル付きメールは送信できないので、PHPMailerを使います。

require_once("class.phpmailer.php");
$to = "hoge@hoge.com"; //宛先
$subject = "添付ファイル暗号化メール"; //題名
$body = "添付ファイルをご確認ください。"; //本文
$from = "hoge@hoge2.com"; //差出人
$attachfile = "hoge.csv"; //添付ファイルパス


$mail = new PHPMailer();
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

$mail->AddAddress($to);

$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");

//添付ファイル追加
$mail->AddAttachment($attachfile);
if (!$mail->Send()){
echo("メールが送信できませんでした。エラー:".$mail->ErrorInfo);
}

これで、暗号化されたファイルが添付されたメールが送信されました。

それでは、届いたメールの添付ファイルを復号化してみます。
今回は、Gpg4winというソフトを使って復号化します。
まず、http://www.gpg4win.org/download.htmlよりGpg4winを入手し、インストールします。

次に秘密鍵(secring.gpg)をインポートします。

インポートが出来たら、実際にファイルを復号化していきます。
まずは、復号化したいファイルを選択します。

ファイルを選択したら、復号化を開始します。

パスフレーズを聞かれるので、設定したパスフレーズを入力します。

復号化が完了されると以下のような画面になります。

以上のような手順で、PHPでの暗号化、Windowsでの復号化ができます。
個人情報を扱うフォーム送信の際に使える方法です。

※この記事は、なかの人(moresmileman)が書いています。

木村 圭佑

木村 圭佑

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。