// 注意先開啓 OpenSSL 擴展,php -m |grep openssl 確認 class Rsa { private $privateKey = ''; private $publicKey = ''; public function __construct($privateKey, $publicKey = false) { if ($privateKey && openssl_pkey_get_private($privateKey)) { $this->privateKey = $privateKey; } throw new Exception('祕鑰信息不正確', 500); if ($publicKey) { if (openssl_pkey_get_public($publicKey)) { $this->publicKey = $publicKey; } throw new Exception('公鑰信息不正確', 500); } } public function getPublicKey () { return $this->publicKey; } /* * 服務端加密數據(使用私鑰加密, 客戶端公鑰能夠解密) */ public function serverEncodeData($data) { $encryptData = ''; if (is_array($data)) { openssl_private_encrypt(json_encode($data, true), $encryptData, $this->privateKey); } elseif (is_string($data)) { openssl_private_encrypt($data, $encryptData, $this->privateKey); } return base64_encode($encryptData);//加密後的內容一般含有特殊字符,須要編碼轉換下 } /* * 客戶端解密數據(使用公鑰解密, 可解私鑰加密數據) */ public function clientDecodeData($data) { $decryptData = ''; if (!is_string($data)) throw new Exception('解密格式應爲字符串格式'); if (!$this->publicKey) throw new Exception('客戶端解密須要提供公鑰'); openssl_public_decrypt(base64_decode($data), $decryptData, $this->publicKey); return $decryptData; } /* * 客戶端加解數據(使用公鑰加密, 服務端私鑰可解密) */ public function clientEncodeData($data) { $encryptData = ''; if (!$this->publicKey) throw new Exception('客戶端加密須要提供公鑰'); if (is_array($data)) { openssl_public_encrypt(json_encode($data, true), $encryptData, $this->publicKey); } else if (is_string($data)) { openssl_public_encrypt($data, $encryptData, $this->publicKey); } return base64_encode($encryptData);//加密後的內容一般含有特殊字符,須要編碼轉換下 } /* * 服務端解密數據(使用私鑰解密, 公鑰加密數據私鑰可解) */ public function serverDecodeData($data) { $decryptData = ''; if (!is_string($data)) throw new Exception('解密格式應爲字符串格式'); openssl_private_decrypt(base64_decode($data), $decryptData, $this->privateKey); return json_decode($decryptData, true); } } // 工具生成的祕鑰 加個開頭和結尾 每行64字符換行 // https://docs.open.alipay.com/58/103242 https://docs.open.alipay.com/291/106097 $rsa = new Rsa('-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDHngAxxMArpym+hgNreSVrF34JOrPo07DicaOQgzErJOlihtgf EFml8UR+0vPmyLmoXPSYX7VGnOryQmedn5iWoy8cV7MRwZsaIUwNQc2tTHq4EdXi zuY1w22r04eCjfqYcksIXBedUGJyA7RCOmioqxRKlq4Da0COgq/M3tTcbwIDAQAB AoGAL3RkX3CCrt4CkoSRc49NUfQ3xkHqW0NYHb0eQVCu867GvOGJp3jflw+QVQYZ bZfyaxAOJds64RqU0BrxPwud3mYvJEIYmvGGwAelUNY/0DOho9NOlLniwbkBxEoy wUU6bRwQ8bELbhlPvoT9VoCCtkZ7uP+Ux7bffCrQB7Z+yAECQQDu8cT+x/mbN1vh +PfcuM6wz5Xorq+pnQaTDbES+ZT2NukIwk1y2RSmULIlXDRxsOTKGBLEedk6HmGB QM/I8xVvAkEA1d2a5IExncjeadOiYftT79UTOb35GkClf5UQcSyILdH5kzxk6OWv 9LP2V72sah6Dg59bUv8BL19AGAowtD0pAQJBAKMEf4nzlO+4jQ9WdIQ58Ynflj7x Lxdg8iNRrAVuEZsJS2OWbJB2Wgg99cxXY9BNB0p5shQprXJhV9R/C0Pl1DECQERl +4PZTeUIuRlfdi+gEdhCbUOqXmDnDAchxYBsnaEJ5qgQSLWzv/KjG8Y0A1BtMeKG tM52gAqGjBkkKS974AECQHw37eeYnY90prE5cNCnHDWJhk2uAK8yxmAOJezlKs4I 0fKonrujwuJVOMT0Asnia5pQTS93RwmePy9RECRzxak= -----END RSA PRIVATE KEY-----','-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHngAxxMArpym+hgNreSVrF34J OrPo07DicaOQgzErJOlihtgfEFml8UR+0vPmyLmoXPSYX7VGnOryQmedn5iWoy8c V7MRwZsaIUwNQc2tTHq4EdXizuY1w22r04eCjfqYcksIXBedUGJyA7RCOmioqxRK lq4Da0COgq/M3tTcbwIDAQAB -----END PUBLIC KEY-----'); $data = $rsa->serverEncodeData(['id'=>1,'name'=>'jay']); //"L1yto67q+LEVcB9gvfYHFqXGZ9irHXuhrxbzuRS71im4dNkVUB4t2BbdpwNux+SsakbV8T+eaTHsl0Im999y03ot/xV2jApzMILZoU+aNoDtZlKjue+gNm+O6uCcycYIeYOt1X8rTmuvmgVd3cmhqlNKegC3NDtBWOumJ9JiYJ8=" $data = $rsa->clientDecodeData($data);//"{"id":1,"name":"jay"}" $data2 = $rsa->clientEncodeData(['id'=>1,'name'=>'jay'])); //"vbHbTr1v/O10G7rStTVfubcnX+6/oUBWaeB+/IRWP1dacFIxzpzISXCs8yHix3+6MK4h6GZ9P3HWLqYTiyHHGmO9MnPV4vQ0gHBzw0wolvVpfwIEonuulg8dzh/D1Kx10dn7r3HQDLWlhAPmGVHLfGQqUlDE1WNwH6ptdJuVyzc=" $data2 = $rsa->serverDecodeData($data2);//"{"id":1,"name":"jay"}"
openssl工具生成私鑰和公鑰,也能夠命令行生成php