Crypto - Data Security - Digital Signature - Others - PHP

電子署名(公開鍵暗号)

 今回は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、要約関数に言及します。

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments