やりたいことは、OpenSSL を使って鍵ペアを作った上で、文字列データを暗号化。 で、それを公開鍵を使って復号化するという一連の操作。
やりたいことは簡単だが、ちょっと時間が経つと忘れてしまうので、メモを残す。
【作業順序】
1. 秘密鍵作成
2. 秘密鍵のパスフレーズを取り除く
2. 公開鍵作成
3. PHPスクリプトを作って、テスト
==================================================================================
1. 秘密鍵作成
2. 秘密鍵のパスフレーズを取り除く
これは必要に応じて作業。
パスフレーズがあると、PHPスクリプト上にそれが平文で出てきてしまうため、取り除くようにした
priv.pem ができたら、temp.pem は要らないので、削除。
3. 公開鍵作成
4. PHPスクリプトを作ってテスト
テスト用の鍵も含むスクリプト全体はこんな感じ。(ダウンロードはこちら)
暗号化された文字列はバイナリデータのため、そのまま画面に表示するとぐちゃぐちゃになるので、base64エンコード/デコードの処理を書き加えている。
やりたいことは簡単だが、ちょっと時間が経つと忘れてしまうので、メモを残す。
【作業順序】
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"; } ?> |