Comment implémenter le cryptage asymétrique en PHP : créez d'abord un exemple de fichier PHP ; puis utilisez openssl pour implémenter le cryptage asymétrique ; enfin testez-le via "$rsa = new Rsa('ssl-key');"
Recommandé : "Tutoriel vidéo PHP"
PHP implémente le cryptage asymétrique
Quant à ce qu'est le cryptage asymétrique, je n'entrerai pas dans les détails ici, je le recherche simplement sur Google. Ce qui est expliqué ici, c'est que j'ai récemment travaillé sur un service de cryptage de recharge externe, donc en ce qui concerne le traitement du cryptage, j'ai rencontré quelques petits problèmes au cours du processus, je l'ai donc enregistré pour plus de commodité pour vérifier la prochaine fois.
Code détaillé
<?php /** * 使用openssl实现非对称加密 * * @since 2015-11-10 */ class Rsa { /** * 私钥 * */ private $_privKey; /** * 公钥 * */ private $_pubKey; /** * 保存文件地址 */ private $_keyPath; /** * 指定密钥文件地址 * */ public function __construct($path) { if (empty($path) || !is_dir($path)) { throw new Exception('请指定密钥文件地址目录'); } $this->_keyPath = $path; } /** * 创建公钥和私钥 * */ public function createKey() { $config = [ "config" => 'D:\wamp\bin\apache\apache2.4.9\conf\openssl.cnf', "digest_alg" => "sha512", "private_key_bits" => 4096, "private_key_type" => OPENSSL_KEYTYPE_RSA, ]; // 生成私钥 $rsa = openssl_pkey_new($config); openssl_pkey_export($rsa, $privKey, NULL, $config); file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey); $this->_privKey = openssl_pkey_get_public($privKey); // 生成公钥 $rsaPri = openssl_pkey_get_details($rsa); $pubKey = $rsaPri['key']; file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey); $this->_pubKey = openssl_pkey_get_public($pubKey); } /** * 设置私钥 * */ public function setupPrivKey() { if (is_resource($this->_privKey)) { return true; } $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key'; $privKey = file_get_contents($file); $this->_privKey = openssl_pkey_get_private($privKey); return true; } /** * 设置公钥 * */ public function setupPubKey() { if (is_resource($this->_pubKey)) { return true; } $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key'; $pubKey = file_get_contents($file); $this->_pubKey = openssl_pkey_get_public($pubKey); return true; } /** * 用私钥加密 * */ public function privEncrypt($data) { if (!is_string($data)) { return null; } $this->setupPrivKey(); $result = openssl_private_encrypt($data, $encrypted, $this->_privKey); if ($result) { return base64_encode($encrypted); } return null; } /** * 私钥解密 * */ public function privDecrypt($encrypted) { if (!is_string($encrypted)) { return null; } $this->setupPrivKey(); $encrypted = base64_decode($encrypted); $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey); if ($result) { return $decrypted; } return null; } /** * 公钥加密 * */ public function pubEncrypt($data) { if (!is_string($data)) { return null; } $this->setupPubKey(); $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey); if ($result) { return base64_encode($encrypted); } return null; } /** * 公钥解密 * */ public function pubDecrypt($crypted) { if (!is_string($crypted)) { return null; } $this->setupPubKey(); $crypted = base64_decode($crypted); $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey); if ($result) { return $decrypted; } return null; } /** * __destruct * */ public function __destruct() { @fclose($this->_privKey); @fclose($this->_pubKey); } } ?>
Test
$rsa = new Rsa('ssl-key'); //私钥加密,公钥解密 echo "待加密数据:segmentfault.com\n"; $pre = $rsa->privEncrypt("segmentfault.com"); echo "加密后的密文:\n" . $pre . "\n"; $pud = $rsa->pubDecrypt($pre); echo "解密后数据:" . $pud . "\n"; //公钥加密,私钥解密 echo "待加密数据:segmentfault.com\n"; $pue = $rsa->pubEncrypt("segmentfault.com"); echo "加密后的密文:\n" . $pue . "\n"; $prd = $rsa->privDecrypt($pue); echo "解密后数据:" . $prd;
Problèmes importants
Une attention particulière doit être portée ici pour spécifier l'adresse du fichier openssl.cnf dans la configuration, ou Définissez simplement la variable globale OPENSSL_CONF.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!