php服務端與客戶端互動、提供開放api時,通常需要對敏感的部分api資料傳輸進行資料加密,這時候rsa非對稱加密就能派上用處了,下面通過乙個例子來說明如何用php來實現資料的加密解密
加密解密的第一步是生成公鑰、私鑰對,私鑰加密的內容能通過公鑰解密(反過來亦可以)
通過私鑰能生成對應的公鑰,因此我們將私鑰用在伺服器端,公鑰發放給android、ios等前端。
以下是加密類檔案(rsa.class.php)**:
<?php /*下面是測試檔案(user.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
; }
}
<?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 ...