今回はPHP環境で「公開鍵暗号」を扱う際の実作業に触れます。
これらの実作業に言及する場合、多くの記事がコマンドプロンプト上での処理を例示しているのですが、実際にはPHPスクリプトで自動的に処理させるケースの方が多いと考えられ、このブログではPHPスクリプトとして書く場合の記述を例示します。なお、公開鍵暗号関連の処理はPHPに実装されており利用の継続性が担保されているOpenSSLを用いて行います。
1. 暗号鍵ペア
よく勘違いされているのですが、「秘密鍵」と「公開鍵」のふたつしか存在しないと思われているのですが、これらは暗号鍵ペア本体から抽出された複製生物であって、これらを生成できる大元の暗号鍵ペアが配列の状態で存在します。その大元に格納された暗号化アルゴリズムの要素(数値)を使ってこれらふたつが生成されている状態です。
'RSA-SHA1', // キーペアが持つ要約関数 'x509_extensions' => 'v3_ca', // x509 証明書を作成する際に使用する拡張モジュール 'req_extensions' => 'v3_req', // CSR を作成する際に使用する拡張モジュール 'private_key_bits' => '2048', // 秘密鍵を作成する際に使用するビット数 'private_key_type' => 'OPENSSL_KEYTYPE_RSA', // 作成する秘密鍵の型 'encrypt_key' => 'true', // エクスポートされるキーを暗号化するか? // 'encrypt_key_cipher' => '', // 暗号定数のうちの一つ // 'curve_name' => '', // 使用する楕円曲線の名前 // 'config' => '' // 代替の openssl.conf ファイルのパス ); // 上記の設定に基づいた暗号鍵ペアを生成 $res = openssl_pkey_new( $config_privKey_array ); // 上記で生成された暗号鍵ペアから秘密鍵を抽出 openssl_pkey_export( $res, $privkey ); // 上記で生成された暗号鍵ペアから公開鍵を抽出(実際は暗号鍵ペア情報に入っている公開鍵情報を取り出すだけ) $keydetail = openssl_pkey_get_details( $res ); $pubkey = $keydetail["key"]; // 生成した上記の秘密鍵と公開鍵を画面に出力 echo $privkey; echo '
'; echo $pubkey; ?>
上記をサーバー上で実行するとブラウザの画面には下記が表示されます。上段の「—–BEGIN PRIVATE KEY—–」で始まる部分が秘密鍵、下段の「—–BEGIN PUBLIC KEY—–」で始まる部分が公開鍵です。
-----BEGIN PRIVATE KEY----- MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDjo+oPXlJTYFak bNsU0tKgbjKX41aGWr/G61eTOG5Y2F3iwiVdEmaSob2p1lbKcld6wo5fdzjujLJj yvkGi2M3a+UP05mmdzhUF+C6ZDAgr9nSfIzMCt/XK0iA6kUnQALlL+rVv+W0K1Fg JoBkHCMlrCLsEcuSvzZL3vXEu/XJuwHiEeueN2wL4FlKHV+PqeTCawKF5E390G75 NdT3QbeuiwpcMoP1k8VloMP5HhjjrgW3k+8xBmfH4aHIPYODFuttos7Ei9lwCxmr swgrhuhaQ1Yw8pkdzbVXPaw0tttBi+yM6RX6+CfDppAjjDB5Dq56b6TPUD8tpfio Z8iTR1tpAgMBAAECggEBAN3eDauq76xJskiRvDmgfR9WKEN3lQZf/pifGfzoPEyl nWP8e7Qp0gVKVPPqby7joLWKWH9dUQTX5qpy0qH5StticqApSZFAk4sKtsKUEYBa RH/tWsEoPCCYFBNpwbrOncPJHyXz4arnqWmAPRTVg8Ac9PCHK5W8fewWxA1acOWK YuWkf/FbPvt3ULLCRolwhhd5eE6GM2/iQrf3JwOuujbSbSmOKtN5ekqxlPlaYujH 2LlpUiONi4NBNpPh9Sx6UaXCgHE4UZFedvU7s69hs35Ke98j+wHluWhe2I1PaDFW PuVH41VqLX9EpC8owhGVI1WOH4xyQDNOeeddzWnwrbECgYEA/P88JY9fWj69Jo/8 OLWWYHPzSRCE45AAJgUCj6u/bn4QtKkLgwPFiLvguhoPI3mDN5MYwNuy6/peLWTW VwYLeCghWNLygdWjOP6R7q2LLJUVtjiQwAJr2AkIC/mNf00LVLYu7iJeNE94NjrC ho+onRjgzjB0z70uo9GjOR6V1L0CgYEA5lehLC6Y56HR17R6g1uQnXKXjCduMl8C iWYcfHvAj1gc2zNch9yK+Xqrsz4M7wN3tJZqX7v62KIFiphkcr949ayDqQM58+bT r9ibif7afjjYHwkyFhEG8hf+nFrbCkvvcderfRE86eOto1RbqwAfTEoUCcEOiFNg 7ULiV+qYah0CgYEA7dpQA8ftD30Ye562s+IUhI2+VhzPstn5KcVgCQ6hJRIkRpT/ G6d6GPj5aD2DqghdkuwaQ4bJig2SaP76fEpUkhy4bTe1gtcFY1oCfPBvffSTuwMn Iz2jgjHLfOabXuliE7xMFtn80xU7oVBQ/g0lqrxu7aqkx4HGzYEUAWl918kCgYEA igob6alnMvFUG0vqW8xE50ZkMbbzoDY2A/dwvN1A8eahLHAkVLtDge0U9s8J2zcd xtiZmRPDaY33ei6HjAjZSYmAQYpQca10UR6jX9ieQiR4yGivXnAH1I+yoysDt7D4 JyZTfBkXgydRyN7mLJ1fJE4Eoi/TMLmfDbEWig9qFbUCgYB6+y9Z6PKg6RH5zyhy 46fuVyRxZLxvHracAM0Rot98R0qCGxlCi8HfH+VdXN1VR0++9kRED23vmi9cT9Pu 393DW2ekGAaumzfjFFFvJ8npZ6qMPOTGdiggPTbiH0qI7d0DyeNxnuGMV3NeeF2/ LbqXFr2noBzf6TwBi5TMNAGemw== -----END PRIVATE KEY-----
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA46PqD15SU2BWpGzbFNLS oG4yl+NWhlq/xutXkzhuWNhd4sIlXRJmkqG9qdZWynJXesKOX3c47oyyY8r5Botj N2vlD9OZpnc4VBfgumQwIK/Z0nyMzArf1ytIgOpFJ0AC5S/q1b/ltCtRYCaAZBwj Jawi7BHLkr82S971xLv1ybsB4hHrnjdsC+BZSh1fj6nkwmsCheRN/dBu+TXU90G3 rosKXDKD9ZPFZaDD+R4Y464Ft5PvMQZnx+GhyD2DgxbrbaLOxIvZcAsZq7MIK4bo WkNWMPKZHc21Vz2sNLbbQYvsjOkV+vgnw6aQI4wweQ6uem+kz1A/LaX4qGfIk0db aQIDAQAB -----END PUBLIC KEY-----
秘密鍵は他人に知られるとその人も暗号を復号できるようになってしまうので人には知られないようにします。可能であればユーザーインターフェイスにも秘密鍵が描画されないようにすべきです(サーバーとブラウザの間の通信を傍受された場合に知られてしまうので)。
新規にkeyをopenssl_pkey_new関数で生成しopenssl_pkey_export関数でメモリー上に変数として秘密鍵が生成されるわけですが、秘密鍵の扱い方としては、openssl_pkey_export_to_file関数を使ってASCII 変換された (PEM エンコードされた)状態の文字列としてサーバーのローカルに保存し、後日に必要な場合はopenssl_pkey_get_private関数を使ってそのファイルから読み込みます。秘密鍵に「パスフレーズ(秘密鍵として利用する際にかけるパスワード)」がかかっている場合はこのopenssl_pkey_get_private関数を使ってファイルから読み込む必要がありますが、パスフレーズがかかっていない秘密鍵であればfile_get_contents関数で読み込んでも利用できます。
2. 秘密鍵と公開鍵はどんな関係か
opensslの関数でopenssl_pkey_get_details関数を使ってキーペアの詳細を表示させることができますが、公開鍵はそのまま出力されるのに対して秘密鍵はそのままの値で表示されません。下記のとおり大元のキーペアの詳細を配列としてダンプすると、公開鍵は保存されていますが秘密鍵は見当たりません。なお、一部の文字列が文字化けしているように見えますが、これはこれらの値がバイナリとして格納されているためで、人間が読むときはbase64_encodeしてASCII文字列にします。
$keydetail = openssl_pkey_get_details( $res );
出力は下記。
array(4) { ["bits"]=> int(2048) ["key"]=> string(451) "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3FQBqvfJjXBh90k48RMs leCWQtekjfh5S58SR5rOEkxfO5mzrXgfYsOj684Gz13Zt1X24C8ZpDJEqvhEwxSo F62imokp8npz5pcMOu+7sVF8UVLJzIA0a5zdMP7MKizQtr+jwDW5MyD4uHgpRx9M HuwkvtkBqkuhY4nJIcFBYxrM/9RqVIIHq4NiO8WYDA69IilXY2Bporh/FHOao7I5 XQiP8UxNuxgCnMGmZhuPbSxRqBrnhNpttoTF8dgx0DCAFuXttju5JJ32bLQHX0c7 ZqpyjQ2YzBjq/nNAfzelJQIw3y0m8lk+nNSKCqQQ2E5uGJ9JQINXyit6ZUgwI7hT 6wIDAQAB -----END PUBLIC KEY----- " ["rsa"]=> array(8) { ["n"]=> string(256) "�T��ɍpa�I8�,���Bפ��yK�G��L_;���xbã���]ٷU��/�2D��D������)�zs�:ﻱQ|QR�̀4k��0��*,ж���5�3 ��x)GL�$���K�c��!�Ac���jT���b;Ř�")Wc`i��s���9]��LM����f�m,Q���m�����1�0����;�$��l�_G;f�r� ����s@7�%0�-&�Y>�Ԋ ��Nn�I@�W�+zeH0#�S�" ["e"]=> string(3) "" ["d"]=> string(256) "���Ȣ0� $���I�?R���i,oȪpNs��K&C��2��������PP�-�'a��Ƿ�d����xݩ�����,K������/�8�Q4 '��]�%�j^�FkzS�1��*�s 0�Y����֊)�x 9�7b��y�-j\��d�Ag��Nƚ��Τ-�p���\��h�3�O�7l�~,%��H9c�ͭ]���c��_�X�V���<֡��#z��7~��U M��Q[dңS����?��TA�" ["p"]=> string(128) "��?)�9�)�����SE��Wy���*äI�����e�(��W�z!�|��O�5�emݾ_���=�y��G5�.��c�O��b����w� ��b�3{��ID�]���Q�0��֎9kҔR`��" ["q"]=> string(128) "� ��h��C�e�|M���8�v���[J{�}^���?�������.���.<�4(\'�W*��( ��9�!��oW�k+��@W���m/���̘Q���j���~T��ɹP����<7�I" ["dmp1"]=> string(128) "�3J$\���՚�܇ы�Oz�j,q�mlQ.�Rcg&>��4�sװ�/��o��Tjw榅� �3ꈡ����Skn��`�������i����F�d.��?U���@�Z/���" ["dmq1"]=> string(128) "���qj�i�%��h�z��'=��w�֑V���hZ�(]9W�_�1p�_zF������7�ɍ�tP�'�;�Wĕ��� ̃�%��k�<�o���[��T[^������'��ӢH�m^$ָ��e���-��^A" ["iqmp"]=> string(128) "��$�(��.`��Y�d��)/�1�(�������m��O��F�#��ݬ��+�cA��D9'E���9?ߡ�g�q�9%+����3�3�X3�7����]��h�xLj���guc���!�H�V���g���� �" } ["type"]=> int(0) }
これは、前回の記事でも少し言及しましたが、RSA暗号を構成する要素が別々に格納されている状態で、秘密鍵(正確にいうと秘密鍵の核となる数値)はdです。dはこれらの$keydetail[‘rsa’][‘e’]と$keydetail[‘rsa’][‘p’]と$keydetail[‘rsa’][‘q’]を使って e^(-1) mod (p-1)x(q-1) となる正の整数として計算できます。
実際に秘密鍵と公開鍵にこれらの値が含まれていることを見てみましょう。n (= pとqの積), e, d, p, qの値はこのままでは読めないのでbase64_encodeします。
n(= pとqの積)の値 $keydetail[‘rsa’][‘n’]:
u12cLtGphx04sRkUx4RqI/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik 22xtJcxvX6imbJs4UiGpWs4efjGWQShfJxZLUvuKJsp90e4B1EmVs9jKm77 9gWBDHU52+oeU45Q+kgwhvFuKGw/a3vVWdUfDsuzdtQnd8kyGBwX5tBCN4A PEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb3pXWqfroszv2vQ/mTDs4yiAw 08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/Jm+Mh25n8I9DzJvxsLi VGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uDXw==
eの値 $keydetail[‘rsa’][‘e’]:
AQAB
dの値 $keydetail[‘rsa’][‘d’]:
qDGVNZYyl77MmHYKaDxex6dKvVZskzscc1e3kZTXJ/GrYsVG59O0GHbYB6q FutTY74MMJQFqbMBMQFUtNYZG3FKD329RSpHPdveHYpiviPo8neH8mVnI76 kdRJDzTgVqDozlsQKEzLeyeZmqHpoIQOdtDRS4fit4YlU+uBk5EMbwB7/ll J1WxU7wHGPZLKQaO0+7VeclTo5kJ3Ig+BmjQT12OarSV9kB/CcdiQh3HfiE Szqb/rd0Vt9+OZaMjOp5nHK9JB06+Ljxdt8+ZyPAtdZEYXwDkHB/u/h3A0A ZaAmPsvofcvSMZ7iAPNIuSyG35Os3pVSVRbzRZ6h82nooyQ==
pの値 $keydetail[‘rsa’][‘p’]:
9mO2X2QYqeidGtSLff/rxLhjF9bKW7A5wa0Ps8R4go3CkQil19ZFV4IbFiz 1TWeMInp96ZQ8U8e6xGQVi6Ht3Byui9BQWLAjWPBDcBhyiJhYBsvjMOVO9X cd+WijR6xG/nf1EuJK/0Ur/CDKzGlME/uAyT+QpllwBBY3MmbQZ1s=
qの値 $keydetail[‘rsa’][‘q’]:
wqyGA/RB9E1X/Fn3mt1SR849u8TZbKXtWPqOUwJvufE74hPFUxAqUoAimsg Om4nY7xfu2AJjCLCqQB+JL43HVuqawNZk3LkwxH2jdzaYdFWWo+k0yDF2As PBwtjXop1U/qqoh4Sux8Yq8bKPjEnUpGcT1EuhuJUwot1GrWvt100=
これらn, e, d, p, qが秘密鍵と公開鍵のどこに含まれているか見てみましょう。
秘密鍵:
-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7XZwu0am HHTixGRTHhGoj/tgfKVNH5ckWMozllYprKY7JNIHr7wvicLsSKTbbG0lzG9 fqKZsmzhSIalazh5+MZZBKF8nFktS+4omyn3R7gHUSZWz2Mqbvv2BYEMdTn b6h5TjlD6SDCG8W4obD9re9VZ1R8Oy7N21Cd3yTIYHBfm0EI3gA8RageIlb PHDW7fxwvYOfVzGTMqkJqlNR51veldap+uizO/a9D+ZMOzjKIDDTyrawfU1 8PrHihi00e0DevbY/RFCn2G9AzEYdi78mb4yHbmfwj0PMm/GwuJUYclBYj0 wkTYSx0RvX8ypbsJwTzE2nTuAcUFRT8yOru4NfAgMBAAECggEBAKgxlTWWM pe+zJh2Cmg8XsenSr1WbJM7HHNXt5GU1yfxq2LFRufTtBh22AeqhbrU2O+D DCUBamzATEBVLTWGRtxSg99vUUqRz3b3h2KYr4j6PJ3h/JlZyO+pHUSQ804 Fag6M5bEChMy3snmZqh6aCEDnbQ0UuH4reGJVPrgZORDG8Ae/5ZSdVsVO8B xj2SykGjtPu1XnJU6OZCdyIPgZo0E9djmq0lfZAfwnHYkIdx34hEs6m/63d FbffjmWjIzqeZxyvSQdOvi48XbfPmcjwLXWRGF8A5Bwf7v4dwNAGWgJj7L6 H3L0jGe4gDzSLksht+TrN6VUlUW80WeofNp6KMkCgYEA // ここからpの値が入っている 9mO2X2QYqeidGtS Lff/rxLhjF9bKW7A5wa0Ps8R4go3CkQil19ZFV4IbFiz1TWeMInp96ZQ8U8 e6xGQVi6Ht3Byui9BQWLAjWPBDcBhyiJhYBsvjMOVO9Xcd+WijR6xG/nf1E uJK/0Ur/CDKzGlME/uAyT+QpllwBBY3MmbQZ1s // ここまでpの値が入っている CgYEA // ここからqの値が入っている< wqyGA/RB 9E1X/Fn3mt1SR849u8TZbKXtWPqOUwJvufE74hPFUxAqUoAimsgOm4nY7xf u2AJjCLCqQB+JL43HVuqawNZk3LkwxH2jdzaYdFWWo+k0yDF2AsPBwtjXop 1U/qqoh4Sux8Yq8bKPjEnUpGcT1EuhuJUwot1GrWvt100 // ここまでqの値が入っている CgYEA 8cbLETQyF5jRgaCL+WqGuxWM97mn/O0i3/Co9eiXsNTW1mc8Bl6W0NY1Kj+ XvwsbMkItCGaUBEp79XeYxNpzhIkIpt4V2dGN/hpWssrqqSuFRbYRDMwX/T uUSEfr4csmJ1MjRBKXMYN5NAIhvxCcvQcRS2p60SH2j6wVIfpOCv0CgYANo N5Q8IydebyrIfE/mjbkZ//SYVmHTaZsED5eeVExBz5V+WRbCEquM+I4S8Ea CnBxbI9/98rPFO8WRh7ogVhvMUVcMqYk/aH4X4NOGThbDJLbLrxPN4c3clT iOyP9cl485d2efx9tROZEvWdnPtPwHnc46YKM1YTuIeeMxH2GEQKBgFgbSb BUSUZrYMYG0Q1ny+70qB/N20hzJHe0a+qcNMayvkHSW0DSku4lZ+pr8sZF8 RyCWmNgT+NswOV1KBsTAP7I4/sUfZBeTDdq9W+nQxhOdyJczkDdy90dYJ3Q tF36aq388Cf92STXT6tzgHZSjUK0xGRLEcihn/MfiHON+1eu -----END PRIVATE KEY-----
公開鍵:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA // ここからnの値が入っている u12cLtGphx04sRkUx4RqI/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik 22xtJcxvX6imbJs4UiGpWs4efjGWQShfJxZLUvuKJsp90e4B1EmVs9jKm77 9gWBDHU52+oeU45Q+kgwhvFuKGw/a3vVWdUfDsuzdtQnd8kyGBwX5tBCN4A PEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb3pXWqfroszv2vQ/mTDs4yiAw 08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/Jm+Mh25n8I9DzJvxsLi VGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uDXw // ここまでnの値が入っている ID // ここからeの値が入っている< AQAB // ここまでeの値が入っている -----END PUBLIC KEY-----
というように秘密鍵にはpとqの両方が、公開鍵にはpとqの積であるnが入っています。eは鍵のアルゴリズムによって固定値なので、秘密鍵の方が計算上有利な情報が入っていることがわかります。なお、秘密鍵に肝心のdが含まれていないじゃ無いかと思うかもしれませんが、他の値のようにbase64_encode/decodeしただけではわからない状態で入っています。このように、秘密鍵と公開鍵が「キーペア」と呼ばれ相互に密接な関係を持っているとはいえ、秘密鍵には非常に多くの大事な情報が含まれています。秘密鍵がこれらの大事な情報を個別要素として持っているせいで秘密鍵があれば公開鍵を生成できますが、公開鍵があっても秘密鍵は生成できません。
3. 暗号と復号をしてみる
上記で「多くのケースでは公開鍵を使って不特定多数に暗号にしてもらい秘密鍵を使って復号するが、秘密鍵を使って暗号にし公開鍵を使って復号することもできる」と述べました。対象とする平分を「This is a pen.」として実際にやってみましょう。
下記のケースでは「公開鍵で暗号にし、秘密鍵で復号する」と「秘密鍵で暗号にし、公開鍵で復号する」の両方を行っています。
<?php $txt = 'This is a pen.'; $privkey = '-----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7XZwu0amHHTix GRTHhGoj/tgfKVNH5ckWMozllYprKY7JNIHr7wvicLsSKTbbG0lzG9fqKZsmzhSI alazh5+MZZBKF8nFktS+4omyn3R7gHUSZWz2Mqbvv2BYEMdTnb6h5TjlD6SDCG8W 4obD9re9VZ1R8Oy7N21Cd3yTIYHBfm0EI3gA8RageIlbPHDW7fxwvYOfVzGTMqkJ qlNR51veldap+uizO/a9D+ZMOzjKIDDTyrawfU18PrHihi00e0DevbY/RFCn2G9A zEYdi78mb4yHbmfwj0PMm/GwuJUYclBYj0wkTYSx0RvX8ypbsJwTzE2nTuAcUFRT 8yOru4NfAgMBAAECggEBAKgxlTWWMpe+zJh2Cmg8XsenSr1WbJM7HHNXt5GU1yfx q2LFRufTtBh22AeqhbrU2O+DDCUBamzATEBVLTWGRtxSg99vUUqRz3b3h2KYr4j6 PJ3h/JlZyO+pHUSQ804Fag6M5bEChMy3snmZqh6aCEDnbQ0UuH4reGJVPrgZORDG 8Ae/5ZSdVsVO8Bxj2SykGjtPu1XnJU6OZCdyIPgZo0E9djmq0lfZAfwnHYkIdx34 hEs6m/63dFbffjmWjIzqeZxyvSQdOvi48XbfPmcjwLXWRGF8A5Bwf7v4dwNAGWgJ j7L6H3L0jGe4gDzSLksht+TrN6VUlUW80WeofNp6KMkCgYEA9mO2X2QYqeidGtSL ff/rxLhjF9bKW7A5wa0Ps8R4go3CkQil19ZFV4IbFiz1TWeMInp96ZQ8U8e6xGQV i6Ht3Byui9BQWLAjWPBDcBhyiJhYBsvjMOVO9Xcd+WijR6xG/nf1EuJK/0Ur/CDK zGlME/uAyT+QpllwBBY3MmbQZ1sCgYEAwqyGA/RB9E1X/Fn3mt1SR849u8TZbKXt WPqOUwJvufE74hPFUxAqUoAimsgOm4nY7xfu2AJjCLCqQB+JL43HVuqawNZk3Lkw xH2jdzaYdFWWo+k0yDF2AsPBwtjXop1U/qqoh4Sux8Yq8bKPjEnUpGcT1EuhuJUw ot1GrWvt100CgYEA8cbLETQyF5jRgaCL+WqGuxWM97mn/O0i3/Co9eiXsNTW1mc8 Bl6W0NY1Kj+XvwsbMkItCGaUBEp79XeYxNpzhIkIpt4V2dGN/hpWssrqqSuFRbYR DMwX/TuUSEfr4csmJ1MjRBKXMYN5NAIhvxCcvQcRS2p60SH2j6wVIfpOCv0CgYAN oN5Q8IydebyrIfE/mjbkZ//SYVmHTaZsED5eeVExBz5V+WRbCEquM+I4S8EaCnBx bI9/98rPFO8WRh7ogVhvMUVcMqYk/aH4X4NOGThbDJLbLrxPN4c3clTiOyP9cl48 5d2efx9tROZEvWdnPtPwHnc46YKM1YTuIeeMxH2GEQKBgFgbSbBUSUZrYMYG0Q1n y+70qB/N20hzJHe0a+qcNMayvkHSW0DSku4lZ+pr8sZF8RyCWmNgT+NswOV1KBsT AP7I4/sUfZBeTDdq9W+nQxhOdyJczkDdy90dYJ3QtF36aq388Cf92STXT6tzgHZS jUK0xGRLEcihn/MfiHON+1eu -----END PRIVATE KEY-----'; $pubkey = '-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu12cLtGphx04sRkUx4Rq I/7YHylTR+XJFjKM5ZWKaymOyTSB6+8L4nC7Eik22xtJcxvX6imbJs4UiGpWs4ef jGWQShfJxZLUvuKJsp90e4B1EmVs9jKm779gWBDHU52+oeU45Q+kgwhvFuKGw/a3 vVWdUfDsuzdtQnd8kyGBwX5tBCN4APEWoHiJWzxw1u38cL2Dn1cxkzKpCapTUedb 3pXWqfroszv2vQ/mTDs4yiAw08q2sH1NfD6x4oYtNHtA3r22P0RQp9hvQMxGHYu/ Jm+Mh25n8I9DzJvxsLiVGHJQWI9MJE2EsdEb1/MqW7CcE8xNp07gHFBUU/Mjq7uD XwIDAQAB -----END PUBLIC KEY-----'; // 公開鍵を使って暗号($encrypted)にします openssl_public_encrypt( $txt, $encrypted, $pubkey ); // $encryptedはそのままだと読めないのでbase64_encodeします echo base64_encode( $encrypted ); echo '
'; // 暗号化された$encryptedを復号します openssl_private_decrypt( $encrypted, $decrypted, $privkey ); // 元の「This is a pen.」が表示されます echo $decrypted; echo '
'; // 秘密鍵を使って暗号($encrypted2)にします openssl_private_encrypt( $txt, $encrypted2, $privkey ); // $encrypted2はそのままだと読めないのでbase64_encodeします echo base64_encode( $encrypted2 ); echo '
'; // 暗号化された$encrypted2を復号します openssl_public_decrypt( $encrypted2, $decrypted2, $pubkey ); // 元の「This is a pen.」が表示されます echo $decrypted2; ?>
なお、openSSLには「openssl_encrypt」「openssl_decrypt」という上記と類似した関数がありますが、これらは「共通鍵暗号」用なので間違えないようにしてください。
次回はCSR、要約関数に言及します。