php RSA加密傳輸程式碼範例(轉)

來源:互聯網
上載者:User

標籤:方式   gen   大於   parameter   code   int   rsa加密   填充   對稱式加密   

原文地址:http://www.cnblogs.com/firstForEver/p/5803940.html

  涉及敏感性資料的傳輸,雙方最好約定使用加密解密。那RSA非對稱式加密就大有作為了。

服務端可以保留自己的私密金鑰,發給用戶端對應的公開金鑰。這樣就可以互相加解密了。php中rsa加解密實現:

首先要產生一對公開金鑰私密金鑰。前提是linux機器上安裝了openssl命令。

 

產生私密金鑰檔案:

openssl genrsa -out rsa_private_key.pem 1024

利用私密金鑰,產生公開金鑰:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

 

加密解密實現流程

<?phpheader(‘Content-Type: text/html; charset=utf-8‘);//獲取公鑰密鑰內容$private_key = file_get_contents("./rsa_private_key.pem");$public_key = file_get_contents("./rsa_public_key.pem");$pi_key =  openssl_pkey_get_private($private_key);// 可用返回資源id$pu_key = openssl_pkey_get_public($public_key);// 加密資料$data = array(    ‘id‘ => ‘1234567890‘,    ‘name‘ => ‘小明‘,    ‘mobile‘ => ‘123456‘,);$data = json_encode($data);$encrypted = ‘‘;$decrypted = ‘‘;openssl_public_encrypt($data, $encrypted, $pu_key);//公開金鑰加密$encrypted = base64_encode($encrypted);// base64傳輸echo $encrypted,"<br/>";openssl_private_decrypt(base64_decode($encrypted), $decrypted, $pi_key);//私密金鑰解密echo $decrypted,"<br/>";print_r(json_decode($decrypted, true));

公開金鑰加密(openssl_public_encrypt),私密金鑰解密(openssl_private_decrypt)。私密金鑰加密(openssl_private_encrypt),公開金鑰解密(openssl_public_decrypt)。都是一個道理,代碼類似。

RSA加密解密有個填充方式padding的參數,不同程式設計語言之間互動,需要注意這個。

padding can be one of OPENSSL_PKCS1_PADDINGOPENSSL_SSLV23_PADDINGOPENSSL_PKCS1_OAEP_PADDING,OPENSSL_NO_PADDING

 

值得注意的是,如果選擇密鑰是1024bit長的(openssl genrsa -out rsa_private_key.pem 1024),那麼支援加密的明文長度位元組最多隻能是1024/8=128byte;

如果加密的padding填充方式選擇的是OPENSSL_PKCS1_PADDING(這個要佔用11個位元組),那麼明文長度最多隻能就是128-11=117位元組。如果超出,那麼這些openssl加解密函數會返回false。

 

這時有個解決辦法,把需要加密的源字串按少於117個長度分開為幾組,在解密的時候以172個位元組分為幾組。

其中的『少於117』(只要不大於117即可)和『172』兩個數字是怎麼來的,值得一說。

為什麼少於117就行,因為rsa encrypt後的位元組長度是固定的,就是密鑰長1024bit/8=128byte。因此只要encrypt不返回false,即只要不大於117個位元組,那麼返回加密後的都是128byte。

172是因為什嗎?因為128個位元組base64_encode後的長度固定是172。

這裡順便普及下base64_encode。encode的長度是和原文長度有個計算公式:

$len2 = $len1%3 >0 ? (floor($len1/3)*4 + 4) : ($len1*4/3);

 

明文超出長度的代碼(前提是1024bit的密鑰長,OPENSSL_PKCS1_PADDING的填充方式,如產生私鑰設置的是2048bit ,base64_decode($encrypted) 對應的就是 344字節。通過strlen查看  ,需要否則數字要變化)

<?php$pi_key =  openssl_pkey_get_private($private_key);// 資源類型$pu_key = openssl_pkey_get_public($public_key);$data = array(    ‘username‘ => ‘張三1‘,    ‘mobile‘ => ‘13321995977‘,    ‘info‘ => ‘14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH  2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6  ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL  3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq  deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYY‘,);$str = json_encode($data);$en = encrypt_rsa($str, $pu_key);$de = decrypt_rsa($en, $pi_key);echo $de;function encrypt_rsa($data, $pu_key){    $split = str_split($data, 100);// 1024bit && OPENSSL_PKCS1_PADDING  不大於117即可    foreach ($split as $part) {        $isOkay = openssl_public_encrypt($part, $en_data, $pu_key);        if(!$isOkay){            return false;        }        // echo strlen($en_data),‘<br/>‘;        $encode_data .= base64_encode($en_data);    }    return $encode_data;}function decrypt_rsa($data, $pi_key){    $split = str_split($data, 172);// 1024bit  固定172    foreach ($split as $part) {        $isOkay = openssl_private_decrypt(base64_decode($part), $de_data, $pi_key);// base64在這裡使用,因為172位元組是一組,是encode來的        if(!$isOkay){            return false;        }        $decode_data .= $de_data;    }    return $decode_data;}

base64建議參考這篇文章:http://www.ruanyifeng.com/blog/2008/06/base64.html

php RSA加密傳輸程式碼範例(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.