茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    php實(shí)現(xiàn)RSA加密類實(shí)例
    來(lái)源:易賢網(wǎng) 閱讀:7410 次 日期:2015-03-30 11:41:00
    溫馨提示:易賢網(wǎng)小編為您整理了“php實(shí)現(xiàn)RSA加密類實(shí)例”,方便廣大網(wǎng)友查閱!

    這篇文章主要介紹了php實(shí)現(xiàn)RSA加密類,實(shí)例分析了php自定義RSA類實(shí)現(xiàn)加密與解密的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

    本文實(shí)例講述了php實(shí)現(xiàn)RSA加密類。分享給大家供大家參考。具體分析如下:

    通過(guò)openssl實(shí)現(xiàn)的簽名、驗(yàn)簽、非對(duì)稱加解密,需要配合x.509證書(如crt和pem)文件使用。

    由于各種原因,該類并不十分完善,歡迎各種測(cè)試!

    <?php

    /**

    * RSA算法類

    * 簽名及密文編碼:base64字符串/十六進(jìn)制字符串/二進(jìn)制字符串流

    * 填充方式: PKCS1Padding(加解密)/NOPadding(解密)

    *

    * Notice:Only accepts a single block. Block size is equal to the RSA key size!

    * 如密鑰長(zhǎng)度為1024 bit,則加密時(shí)數(shù)據(jù)需小于128字節(jié),加上PKCS1Padding本身的11字節(jié)信息,所以明文需小于117字節(jié)

    *

    * @author: linvo

    * @version: 1.0.0

    * @date: 2013/1/23

    */

    class RSA{

    private $pubKey = null;

    private $priKey = null;

    /**

    * 自定義錯(cuò)誤處理

    */

    private function _error($msg){

    die('RSA Error:' . $msg); //TODO

    }

    /**

    * 構(gòu)造函數(shù)

    *

    * @param string 公鑰文件(驗(yàn)簽和加密時(shí)傳入)

    * @param string 私鑰文件(簽名和解密時(shí)傳入)

    */

    public function __construct($public_key_file = '', $private_key_file = ''){

    if ($public_key_file){

    $this->_getPublicKey($public_key_file);

    }

    if ($private_key_file){

    $this->_getPrivateKey($private_key_file);

    }

    }

    /**

    * 生成簽名

    *

    * @param string 簽名材料

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

    * @return 簽名值

    */

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

    $ret = false;

    if (openssl_sign($data, $ret, $this->priKey)){

    $ret = $this->_encode($ret, $code);

    }

    return $ret;

    }

    /**

    * 驗(yàn)證簽名

    *

    * @param string 簽名材料

    * @param string 簽名值

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

    * @return bool

    */

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

    $ret = false;

    $sign = $this->_decode($sign, $code);

    if ($sign !== false) {

    switch (openssl_verify($data, $sign, $this->pubKey)){

    case 1: $ret = true; break;

    case 0:

    case -1:

    default: $ret = false;

    }

    }

    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){

    $ret = false;

    if (!$this->_checkPadding($padding, 'en')) $this->_error('padding error');

    if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){

    $ret = $this->_encode($result, $code);

    }

    return $ret;

    }

    /**

    * 解密

    *

    * @param string 密文

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

    * @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)

    * @param bool 是否翻轉(zhuǎn)明文(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){

    $ret = false;

    $data = $this->_decode($data, $code);

    if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error');

    if ($data !== false){

    if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){

    $ret = $rev ? rtrim(strrev($result), "\0") : ''.$result;

    }

    }

    return $ret;

    }

    // 私有方法

    /**

    * 檢測(cè)填充類型

    * 加密只支持PKCS1_PADDING

    * 解密支持PKCS1_PADDING和NO_PADDING

    *

    * @param int 填充模式

    * @param string 加密en/解密de

    * @return bool

    */

    private function _checkPadding($padding, $type){

    if ($type == 'en'){

    switch ($padding){

    case OPENSSL_PKCS1_PADDING:

    $ret = true;

    break;

    default:

    $ret = false;

    }

    } else {

    switch ($padding){

    case OPENSSL_PKCS1_PADDING:

    case OPENSSL_NO_PADDING:

    $ret = true;

    break;

    default:

    $ret = false;

    }

    }

    return $ret;

    }

    private function _encode($data, $code){

    switch (strtolower($code)){

    case 'base64':

    $data = base64_encode(''.$data);

    break;

    case 'hex':

    $data = bin2hex($data);

    break;

    case 'bin':

    default:

    }

    return $data;

    }

    private function _decode($data, $code){

    switch (strtolower($code)){

    case 'base64':

    $data = base64_decode($data);

    break;

    case 'hex':

    $data = $this->_hex2bin($data);

    break;

    case 'bin':

    default:

    }

    return $data;

    }

    private function _getPublicKey($file){

    $key_content = $this->_readFile($file);

    if ($key_content){

    $this->pubKey = openssl_get_publickey($key_content);

    }

    }

    private function _getPrivateKey($file){

    $key_content = $this->_readFile($file);

    if ($key_content){

    $this->priKey = openssl_get_privatekey($key_content);

    }

    }

    private function _readFile($file){

    $ret = false;

    if (!file_exists($file)){

    $this->_error("The file {$file} is not exists");

    } else {

    $ret = file_get_contents($file);

    }

    return $ret;

    }

    private function _hex2bin($hex = false){

    $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;

    return $ret;

    }

    }

    測(cè)試demo:

    <?php

    header('Content-Type:text/html;Charset=utf-8;');

    include "rsa.php";

    echo '<pre>';

    $a = isset($_GET['a']) ? $_GET['a'] : '測(cè)試123';

    //////////////////////////////////////

    $pubfile = 'E:\ssl\cert\pwd.crt';

    $prifile = 'E:\ssl\cert\pwd.pem';

    $m = new RSA($pubfile, $prifile);

    $x = $m->sign($a);

    $y = $m->verify($a, $x);

    var_dump($x, $y);

    $x = $m->encrypt($a);

    $y = $m->decrypt($x);

    var_dump($x, $y);

    希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。

    更多信息請(qǐng)查看IT技術(shù)專欄

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:php實(shí)現(xiàn)RSA加密類實(shí)例
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)