くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

PHP で暗号化を使う(OpenSSL関数を使って)

2009-04-13 16:08:14 | SEまわり
 やりたいことは、OpenSSL を使って鍵ペアを作った上で、文字列データを暗号化。 で、それを公開鍵を使って復号化するという一連の操作。

 やりたいことは簡単だが、ちょっと時間が経つと忘れてしまうので、メモを残す。

【作業順序】
1. 秘密鍵作成
2. 秘密鍵のパスフレーズを取り除く
2. 公開鍵作成
3. PHPスクリプトを作って、テスト


==================================================================================
1. 秘密鍵作成

openssl genrsa -out temp.pem -des3 1024


2. 秘密鍵のパスフレーズを取り除く
 これは必要に応じて作業。
 パスフレーズがあると、PHPスクリプト上にそれが平文で出てきてしまうため、取り除くようにした

openssl rsa -in temp.pem -out priv.pem


 priv.pem ができたら、temp.pem は要らないので、削除。

3. 公開鍵作成

openssl rsa -in priv.pem -pubout -out pub.pem


4. PHPスクリプトを作ってテスト

テスト用の鍵も含むスクリプト全体はこんな感じ。(ダウンロードはこちら)
暗号化された文字列はバイナリデータのため、そのまま画面に表示するとぐちゃぐちゃになるので、base64エンコード/デコードの処理を書き加えている。

#!/usr/local/bin/php
//秘密鍵
$priv = "-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+R+C7hsZEt7x01tadVV09y0HYMYCM5EY4GYn1ppGX7tL7tIlo
uzYS7GRXNMdvX8x7Vapv9/c6irvV2ncC1MPU2nwbsmVaIhTKMn6/dVu6V9GTYqHr
AW4MUkfT4aleG6M18qiFMxbnQ3VSnwn9QBvPkrzSoOup0bipvhY6wz2wUQIDAQAB
AoGAd6TKch90W5EMNos/tv4N+uTrKf02T2DZpjyouoVZ1qackxgZrnjIr21kSlEt
daJO+N4MpQrNsUm6geU0H9uYphB0lv60FmsdE51QstKIZYxk4pdOryJpW5KiAa18
dlf1MUhvJZ86IUBS+YDzkZDsHQrg1mKuDeuPeXeBnsxD1IECQQDilFLPiZt61gsA
lUQU4tgM5OYTzKj6D+BEaxssq8e1PzNSsm76guareozBlhfBu6NRoqMhbY3iWbBc
RN4WXQwFAkEA1vz1vnWhiNt0uxq7niD3PGWzWF4KHEnCHt/TZgfAhG/H/qKnc6wB
BpVgG0vsOY6OBMfgQX2CTh0XdNVZNaIQ3QJBAI8Qwp0isVbFchsDJQLfHTY/Dfuw
fX2vqpbo3ja9nJMX/esYmbR6FPZvohLWF9gPB5eTTtfbmfwzT4VjQqvyQpUCQF9g
vFlx8Gc6DVCQ7JmbwHPgHq/ekJe6NU/jNvM2DzfyK4URfj64GYBlNs0FYtiqIOGI
FzqWxv+GsohXuosrylUCQQCPuZ+jzs2FmjctOroDd3LT8nGvm2HfiX8rQh0pfk6S
4r+t47iN2WKmdYBhnjQ1ysUlvaVcpdfUO2QF/ShRFuDD
-----END RSA PRIVATE KEY-----";

// 公開鍵
$pub = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+R+C7hsZEt7x01tadVV09y0HY
MYCM5EY4GYn1ppGX7tL7tIlouzYS7GRXNMdvX8x7Vapv9/c6irvV2ncC1MPU2nwb
smVaIhTKMn6/dVu6V9GTYqHrAW4MUkfT4aleG6M18qiFMxbnQ3VSnwn9QBvPkrzS
oOup0bipvhY6wz2wUQIDAQAB
-----END PUBLIC KEY-----";

$res = openssl_pkey_get_private($priv);
if ( $res == FALSE ) { echo "取り出し失敗\n"; }
$string = "hogehoge";
echo "暗号化前文字列: $string\n";
if ( openssl_private_encrypt($string, $crypted, $res) ) {
$crypted = base64_encode($crypted);
echo "暗号化後文字列: $crypted\n";
} else { echo "暗号化失敗\n";}

echo "--- 今後は復号化 ---\n";
if ( openssl_public_decrypt(base64_decode($crypted), $string2, $pub) ) {
echo "復号化した文字列: $string2\n";
} else {
echo "復号化失敗\n";
}
?>



最新の画像もっと見る