php的RSA非對稱加密

2022-07-02 15:48:11 字數 4219 閱讀 8639

php服務端與客戶端互動、提供開放api時,通常需要對敏感的部分api資料傳輸進行資料加密,這時候rsa非對稱加密就能派上用處了,下面通過乙個例子來說明如何用php來實現資料的加密解密

加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以)

通過私鑰能生成對應的公鑰,因此我們將私鑰用在伺服器端,公鑰發放給android、ios等前端。

以下是加密類檔案(rsa.class.php)**:

<?php /*

* * rsa演算法類

* 簽名及密文編碼:base64字串/十六進製制字串/二進位制字串流

* 填充方式: pkcs1padding(加解密)/nopadding(解密)

* * notice:only accepts a single block. block size is equal to the rsa key size!

* 如金鑰長度為1024 bit,則加密時資料需小於128位元組,加上pkcs1padding本身的11位元組資訊,所以明文需小於117位元組 */

class

rsa }

/*** 讀取公鑰和私鑰

* @param string $public_key_file 公鑰檔案(驗籤和加密時傳入)

* @param string $private_key_file 私鑰檔案(簽名和解密時傳入)

*/public

function init($public_key_file = '', $private_key_file = '')

if ($private_key_file

) }

/*** 自定義錯誤處理

*/private

function _error($msg

)

/*** 檢測填充型別

* 加密只支援pkcs1_padding

* 解密支援pkcs1_padding和no_padding

** @param int 填充模式

* @param string 加密en/解密de

* @return bool

*/private

function _checkpadding($padding, $type

)

} else

}return

$ret

; }

private

function _encode($data, $code

)

return

$data

; }

private

function _decode($data, $code

)

return

$data

; }

private

function _getpublickey($file

)

}private

function _getprivatekey($file

)

}private

function _readfile($file

) is not exists");

} else

return

$ret

; }

private

function _hex2bin($hex = false

)

/*** 生成rsa公鑰和私鑰

* @param int $private_key_bits 建議:[512, 1024, 2048, 4096]

* @return array

*/public

function generate($private_key_bits = 2048)

/*** 生成簽名

** @param string 簽名材料

* @param string 簽名編碼(base64/hex/bin)

* @return bool|string 簽名值

*/public

function sign($data, $code = 'base64')

return

$ret

; }

/*** 驗證簽名

** @param string 簽名材料

* @param string 簽名值

* @param string 簽名編碼(base64/hex/bin)

* @return bool

*/public

function verify($data, $sign, $code = 'base64')

}return

$ret

; }

/*** 加密

** @param string 明文

* @param string 密文編碼(base64/hex/bin)

* @param int 填充方式(貌似php有bug,所以目前僅支援openssl_pkcs1_padding)

* @return string 密文

*/public

function encrypt($data, $code = 'base64', $padding =openssl_pkcs1_padding)

return

$ret

; }

/*** 解密

** @param string 密文

* @param string 密文編碼(base64/hex/bin)

* @param int 填充方式(openssl_pkcs1_padding / openssl_no_padding)

* @param bool 是否翻轉明文(when passing microsoft cryptoapi-generated rsa cyphertext, revert the bytes in the block)

* @return string 明文

*/public

function decrypt($data, $code = 'base64', $padding = openssl_pkcs1_padding, $rev = false

)

}return

$ret

; }

}

下面是測試檔案(user.php)**:

<?php 

if (!class_exists("rsa"))

$private_key_file = __dir__ . "/private_key.pem";

$public_key_file = __dir__ . "/public_key.pem";

$rsa = new

rsa(); //

沒有就生成一對

if (!file_exists($private_key_file) || !file_exists($public_key_file

))

else //

顯示資料

echo "private_key:\n" . $key['private_key'] . "";

echo "public_key:\n" . $key['public_key'] . ""; //

要加密的資料

$data = "123456";

echo '加密的資料:' . $data, "";

$rsa->init($public_key_file, $private_key_file);

//加密$encrypt = $rsa->encrypt($data

);echo "公鑰加密後的資料: " . $encrypt . ""; //

解密$decrypt = $rsa->decrypt($encrypt

);echo "私鑰解密後的資料: " . $decrypt, ""; //

簽名$sign = $rsa->sign($data

);echo "簽名的資料(私鑰加密): " . $sign . ""; //

驗證$verify = $rsa->verify($data, $sign

);echo "驗證的資料: " . $verify . "";

執行結果如下圖:

PHP非對稱加密 RSA

對稱加密演算法是在加密和解密時使用同乙個金鑰。與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰 公開金鑰 public key 和私有金鑰 private key 進行加密和解密。公鑰和金鑰是一對,如果公開金鑰對資料進行加密,只有對應私有金鑰才能解密 如果用私有金鑰對資料加密,那麼只有對應公有金鑰...

RSA非對稱加密

現實網路中,web應用的開發少不了需要對敏感資訊來進行加密,但是加密又不能草草了事,過於簡單。一旦被鑽了空子,就成了事故。比如密碼。之前用到了非對稱加密沒做記錄,這次又用到了,所以記錄下來!rsa是目前最有影響力的公鑰加密演算法,該演算法基於乙個十分簡單的數論事實 將兩個大素數相乘十分容易,但那時想...

RSA非對稱加密

對稱加密 演算法 在加密和解密時使用的是同乙個秘鑰 而 非對稱加密演算法 需要兩個 金鑰 來進行加密和解密,這兩個秘鑰是 公開金鑰 public key,簡稱公鑰 和私有金鑰 private key,簡稱私鑰 與對稱加密 演算法 不同,非對稱加密演算法 需要兩個 金鑰 公開金鑰 publickey ...