1. 程式人生 > >RSA 加密傳輸 (php)

RSA 加密傳輸 (php)

ring string 加密傳輸 可能 16px cer div static pen

RSA加密傳輸:

  對於初接觸RSA加密的童鞋來說,很可能會被繞進去。最近寫了一個RSA加密傳輸的需求,總結一下。希望能對你有點幫助。

  首先要明白以下幾點:

    1:公鑰和私鑰一定是成對的才可以

    2:私鑰是保密的,公鑰是公開的

    3:公鑰和私鑰,可以互為加密和解密

    4:用其中一個密鑰加密數據,則只有對應的那個密鑰才能解開

主要有兩種用法

  1:公鑰加密

    A傳輸數據給B

      (1),A用公鑰加密數據,傳輸給B

      (2),B用私鑰解密

  2:公鑰認證

    A傳輸數據給B

      (1),A用私鑰加密數據(也就是私鑰簽名),傳輸給B

      (2),B用公鑰解密(也就是驗簽)

示例:證書,公鑰認證的過程

簽名:

    /**
    signing  簽名 password   私鑰證書需要密碼
     */
    public function get_signing_str($data){
        //$data=$this->get_request_string();
        $certs=array();
       // dump(file_get_contents(ROOT_PATH."public/static/"."private_key.pfx"));
        openssl_pkcs12_read(file_get_contents
(ROOT_PATH."public/static/"."private_key.pfx"), $certs, "password"); if(!$certs) return; $signature = ‘‘; openssl_sign($data, $signature, $certs[‘pkey‘],‘sha256‘); //dump(base64_encode($signature)); return base64_encode($signature); }

驗簽:

public function verify_signing($rest
){ $rest=json_decode($rest,true); $sign=$rest[‘sign‘]; $sign = base64_decode($sign);//簽名參數 unset($rest[‘sign‘]); unset($rest[‘sign_type‘]); $verifystr=$this->get_request_str($rest);//驗簽明文字符串 $pkeyid = openssl_pkey_get_public(file_get_contents(ROOT_PATH."public/static/"."public_key.cer")); $verify = openssl_verify($verifystr,$sign,$pkeyid,‘sha256‘); //驗簽 (明文/簽名/key) // $msg = openssl_error_string(); // dump($msg); // dump($verify); openssl_free_key($pkeyid); if($verify==1){ echo ‘驗簽通過‘; // $data=json_encode($rest); // return $data; }else{ return ‘驗簽失敗‘; } }

RSA加密過程

        $privateKeyStr=file_get_contents(ROOT_PATH."public/static/"."pkcs1_key.pem");
        $pi_key=openssl_pkey_get_private($privateKeyStr);      
        $encryptSign="";
        openssl_private_encrypt($sign_str,$encryptSign,$pi_key);  //(待加密字符串/加密後的字符串/key)

SHA加密過程

$sign  = hash(‘sha256‘,$source);  //(算法/待加密字符串)

RSA 加密傳輸 (php)