当前位置:首页 > PHP教程 > php应用 > 列表

php和openssl实现非对称加密的代码示例

发布:smiling 来源: PHP粉丝网  添加日期:2020-01-31 12:48:00 浏览: 评论:0 

本篇文章给大家带来的内容是关于php和openssl实现非对称加密的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

  1. <?php 
  2.  
  3. namespace MyObjSummary; 
  4.  
  5. /** 
  6.  
  7.  * 使用openssl实现非对称加密 
  8.  
  9.  */ 
  10.  
  11. class Rsa 
  12.  
  13.  
  14.     /** 
  15.  
  16.      * 私钥 
  17.  
  18.      *  
  19.  
  20.      */ 
  21.  
  22.     private $_privKey
  23.  
  24.   
  25.  
  26.     /** 
  27.  
  28.      * 公钥 
  29.  
  30.      *  
  31.  
  32.      */ 
  33.  
  34.     private $_pubKey
  35.  
  36.   
  37.  
  38.     /** 保存文件地址 
  39.  
  40.      * @var 
  41.  
  42.      */ 
  43.  
  44.     private $_keyPath
  45.  
  46.   
  47.  
  48.     /** 公钥 
  49.  
  50.      * @var string 
  51.  
  52.      */ 
  53.  
  54.     private $_pubKeyLink = "-----BEGIN PUBLIC KEY----- 
  55.  
  56. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCF4sz1eu4XgLeIK9Aiu4+rfglt 
  57.  
  58. k1gmNhUytOtk3kbzPoy2XoR5sQIRXBYnIagwBVOLPWDacVJoqjfeK6xGvL17745u 
  59.  
  60. Z7RubcZIW62ocgX3swIDAQAB 
  61.  
  62. -----END PUBLIC KEY-----"; 
  63.  
  64.     /**私钥 
  65.  
  66.      * @var string 
  67.  
  68.      */ 
  69.  
  70.     private $_priKeyLink = "-----BEGIN RSA PRIVATE KEY----- 
  71.  
  72. MIICXAIBAAKBgQCF4sz1eu4XgLeIK9Aiu4+rfgltk1gmNhUytOtk3kbzPoy2XoR5 
  73.  
  74. sQIRXBYnIagwBVOLPWDacVJoqjfeK6xGvL17745uwNSw3eKLl1qm+w2z5KhNEnpg 
  75.  
  76. LWxKxSPMfekt1Aj3Te0Ct652Scr42Coca/ld2mGkZ7RubcZIW62ocgX3swIDAQAB 
  77.  
  78. AoGAHinbvU6Fx5vDPZWJXdnd42gQ3bP9fxZeLj9ebSo61+B2uTuQIw6DBcA2aXiG 
  79.  
  80. uNLqYItif7RaOaRn09EJDiLFmYwRBXAGnEdSnxWRy/IMrtKATV+dLnyFDVrIzsn+ 
  81.  
  82. /9l3HQXKhlSqTc4v7o1sWAM9GW2vjB3X432BjzbgqCyplOECQQC7UnvQUZYT+sum 
  83.  
  84. PStREJt85krUKgeFwyQdji+BdAXhv9xz3PiSWsAvw87zFrpBKcWbTimSH38onKGa 
  85.  
  86. htuYE08xAkEAtvjx7t05TiVusPcsgABxoABKRKZpcY5QQIXTT3oigvCMuz41nBDm 
  87.  
  88. EXeot+TXBGwG0QNS7p5BwkrXfCFJJONkIwJAUbcItfZxPqQAJLO4arOQ8KpRaD4x 
  89.  
  90. a+OVpKL7DEC9tB4LICv773RRNET5yUdX1sdPIZG2Rr0grmmtgYhk0PFTcQJBAI8I 
  91.  
  92. uv2VL3fMBI4SGWWN/LPSeZkUdPbh0GmRCSo4nPOfxK8= 
  93.  
  94. -----END RSA PRIVATE KEY-----"; 
  95.  
  96.     /** 
  97.  
  98.      * Rsa constructor. 
  99.  
  100.      * @param string $path 
  101.  
  102.      */ 
  103.  
  104.     public function __construct($path=''
  105.  
  106.     { 
  107.  
  108.         if (!emptyempty($path)) { 
  109.  
  110.             $this->_keyPath = $path
  111.  
  112.         } 
  113.  
  114.     } 
  115.  
  116.   
  117.  
  118.     /** 
  119.  
  120.      * 创建公钥和私钥 
  121.  
  122.      *  
  123.  
  124.      */ 
  125.  
  126.     public function createKey() 
  127.  
  128.     { 
  129.  
  130.         $config = [ 
  131.  
  132.             "config" => 'D:\Min\Install\wamp\wamp64\bin\php\php5.6.25\extras\ssl\openssl.cnf'
  133.  
  134.             "digest_alg" => "sha512"
  135.  
  136.             "private_key_bits" => 4096, 
  137.  
  138.             "private_key_type" => OPENSSL_KEYTYPE_RSA, 
  139.  
  140.   
  141.  
  142.         ]; 
  143.  
  144.         // 生成私钥 
  145.  
  146.         $rsa = openssl_pkey_new($config); 
  147.  
  148.         openssl_pkey_export($rsa$privKey, NULL, $config); 
  149.  
  150.         file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key'$privKey); 
  151.  
  152.         $this->_privKey = openssl_pkey_get_public($privKey); 
  153.  
  154.         // 生成公钥 
  155.  
  156.         $rsaPri = openssl_pkey_get_details($rsa); 
  157.  
  158.         $pubKey = $rsaPri['key']; 
  159.  
  160.         file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key'$pubKey); 
  161.  
  162.         $this->_pubKey = openssl_pkey_get_public($pubKey); 
  163.  
  164.     } 
  165.  
  166.   
  167.  
  168.     /** 设置私钥 
  169.  
  170.      * @return bool 
  171.  
  172.      */ 
  173.  
  174.     public function setupPrivKey() 
  175.  
  176.     { 
  177.  
  178.         if (is_resource($this->_privKey)) { 
  179.  
  180.             return true; 
  181.  
  182.         } 
  183.  
  184.         //从文件中获取 
  185.  
  186.         /*$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key'; 
  187.  
  188.         $privKey = file_get_contents($file);*/ 
  189.  
  190.         $privKey = $this->_priKeyLink; 
  191.  
  192.         $this->_privKey = openssl_pkey_get_private($privKey); 
  193.  
  194.         return true; 
  195.  
  196.     } 
  197.  
  198.   
  199.  
  200.     /** 设置公钥 
  201.  
  202.      * @return bool 
  203.  
  204.      */ 
  205.  
  206.     public function setupPubKey() 
  207.  
  208.     { 
  209.  
  210.         //从文件中获取 
  211.  
  212.         /*$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key'; 
  213.  
  214.         $pubKey = file_get_contents($file);*/ 
  215.  
  216.         //数据源 
  217.  
  218.         $pubKey = $this->_pubKeyLink; 
  219.  
  220.         $this->_pubKey = openssl_pkey_get_public($pubKey); 
  221.  
  222.         return true; 
  223.  
  224.     } 
  225.  
  226.   
  227.  
  228.     /** 用私钥加密 
  229.  
  230.      * @param $data 
  231.  
  232.      * @return null|string 
  233.  
  234.      */ 
  235.  
  236.     public function privEncrypt($data
  237.  
  238.     { 
  239.  
  240.         if (!is_string($data)) { 
  241.  
  242.             return null; 
  243.  
  244.         } 
  245.  
  246.         $this->setupPrivKey(); 
  247.  
  248.         $result = openssl_private_encrypt($data$encrypted$this->_privKey); 
  249.  
  250.         if ($result) { 
  251.  
  252.             return base64_encode($encrypted); 
  253.  
  254.         } 
  255.  
  256.         return null; 
  257.  
  258.     } 
  259.  
  260.   
  261.  
  262.     /** 私钥解密 
  263.  
  264.      * @param $encrypted 
  265.  
  266.      * @return null 
  267.  
  268.      */ 
  269.  
  270.     public function privDecrypt($encrypted
  271.  
  272.     { 
  273.  
  274.         if (!is_string($encrypted)) { 
  275.  
  276.             return null; 
  277.  
  278.         } 
  279.  
  280.         $this->setupPrivKey(); 
  281.  
  282.         $encrypted = base64_decode($encrypted); 
  283.  
  284.         $result = openssl_private_decrypt($encrypted$decrypted$this->_privKey); 
  285.  
  286.         if ($result) { 
  287.  
  288.             return $decrypted
  289.  
  290.         } 
  291.  
  292.         return null; 
  293.  
  294.     } 
  295.  
  296.   
  297.  
  298.     /** 公钥加密 
  299.  
  300.      * @param $data 
  301.  
  302.      * @return null|string 
  303.  
  304.      */ 
  305.  
  306.     public function pubEncrypt($data
  307.  
  308.     { 
  309.  
  310.         if (!is_string($data)) { 
  311.  
  312.             return null; 
  313.  
  314.         } 
  315.  
  316.         $this->setupPubKey(); 
  317.  
  318.         $result = openssl_public_encrypt($data$encrypted$this->_pubKey); 
  319.  
  320.         if ($result) { 
  321.  
  322.             return base64_encode($encrypted); 
  323.  
  324.         } 
  325.  
  326.         return null; 
  327.  
  328.     } 
  329.  
  330.   
  331.  
  332.     /** 公钥解密 
  333.  
  334.      * @param $crypted 
  335.  
  336.      * @return null 
  337.  
  338.      */ 
  339.  
  340.     public function pubDecrypt($crypted
  341.  
  342.     { 
  343.  
  344.         if (!is_string($crypted)) { 
  345.  
  346.             return null; 
  347.  
  348.         } 
  349.  
  350.         $this->setupPubKey(); 
  351.  
  352.         $crypted = base64_decode($crypted); 
  353.  
  354.         $result = openssl_public_decrypt($crypted$decrypted$this->_pubKey); 
  355.  
  356.         if ($result) { 
  357.  
  358.             return $decrypted
  359.  
  360.         } 
  361.  
  362.         return null; 
  363.  
  364.     } 
  365.  
  366.   
  367.  
  368.     /** 私钥签名 
  369.  
  370.      * @param $data 
  371.  
  372.      * @return string 
  373.  
  374.      */ 
  375.  
  376.     public function priKeySign($data
  377.  
  378.     { 
  379.  
  380.         if(!is_string($data)) return null; 
  381.  
  382.         $private_key=openssl_get_privatekey($this->_priKeyLink); 
  383.  
  384.         $original_str$data ;//原数据 
  385.  
  386.         openssl_sign($original_str,$sign,$private_key); 
  387.  
  388.         openssl_free_key($private_key); 
  389.  
  390.         $sign=base64_encode($sign);//最终的签名 
  391.  
  392.         return $sign ; 
  393.  
  394.     } 
  395.  
  396.   
  397.  
  398.     /** 公钥验签 
  399.  
  400.      * @param $sign 
  401.  
  402.      * @param $data 
  403.  
  404.      * @return bool 
  405.  
  406.      */ 
  407.  
  408.     public  function pubKeyCheck($sign,$data
  409.  
  410.     { 
  411.  
  412.         if(!is_string($sign) || !is_string($data)) return null; 
  413.  
  414.         $public_key=openssl_get_publickey($this->_pubKeyLink); 
  415.  
  416.         $sign=base64_decode($sign);//得到的签名 
  417.  
  418.         $original_str=$data
  419.  
  420.         $result=(bool)openssl_verify($original_str,$sign,$public_key); 
  421.  
  422.         openssl_free_key($public_key); 
  423.  
  424.         return $result ; 
  425.  
  426.     } 
  427.  
  428.   
  429.  
  430.     /** 
  431.  
  432.      * __destruct 
  433.  
  434.      *  
  435.  
  436.      */ 
  437.  
  438.     public function __destruct() { 
  439.  
  440.         @fclose($this->_privKey); 
  441.  
  442.         @fclose($this->_pubKey); 
  443.  
  444.     } 
  445.  
  446.  
  447. $rsa = new Rsa(); 
  448.  
  449.   
  450.  
  451. echo "openssl_private_encrypt,openssl_public_decrypt","<br />"
  452.  
  453. //私钥加密,公钥解密 
  454.  
  455. echo "私钥加密,公钥验签","<br />"
  456.  
  457. echo "待加密数据:testInfo","<br />"
  458.  
  459. $pre = $rsa->privEncrypt("testInfo"); 
  460.  
  461. echo "加密后的密文:<br />" . $pre . "<br />"
  462.  
  463. $pud = $rsa->pubDecrypt($pre); 
  464.  
  465. echo "解密后数据:" . $pud . "<br />"
  466.  
  467. echo "<hr>"
  468.  
  469.   
  470.  
  471.   
  472.  
  473. //公钥加密,私钥解密 
  474.  
  475. echo "openssl_public_encrypt,openssl_private_decrypt","<br />"
  476.  
  477. echo "公钥加密,私钥验签","<br />"
  478.  
  479. echo "待加密数据:ssh-test","<br />"
  480.  
  481. $pue = $rsa->pubEncrypt("ssh-test"); 
  482.  
  483. echo "加密后的密文:","<br />" . $pue . "<br />"
  484.  
  485. $prd = $rsa->privDecrypt($pue); 
  486.  
  487. echo "解密后数据:" . $prd
  488.  
  489.   
  490.  
  491. echo "<hr>";echo "<hr>"
  492.  
  493.   
  494.  
  495. echo "openssl_sign,openssl_verify","<br />"
  496.  
  497. echo "私钥签名,公钥验签","<br />"
  498.  
  499. echo "待加密数据:test=32","<br />"
  500.  
  501. $pre = $rsa->priKeySign('test=32'); 
  502.  
  503. echo "加密后的密文:","<br />" . $pre . "<br />"
  504. //phpfensi.com 
  505. $pud = $rsa->pubKeyCheck($pre,'test=32'); 
  506.  
  507. echo "是否解密成功:" . $pud . "<br />"
  508.  
  509. echo "<hr>"

Tags: openssl php非对称加密

分享到: