亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

php-rsa 加密解密

livem / 3170人閱讀

摘要:公鑰密碼加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼,常用的算法有。其中用公鑰加密需要私鑰解密,稱為加密。由于私鑰是不公開的,確保了內(nèi)容的保密,沒有私鑰無法獲得內(nèi)容用私鑰加密需要公鑰解密,稱為簽名。

1.什么是RSA加密

RSA (詳見維基百科)算法是現(xiàn)今使用最廣泛的公鑰密碼算法,也是號稱地球上最安全的加密算法,與 md5sha1 不同,到目前為止,也只有極短的RSA加密被破解。
那么什么是公匙密碼算法呢,根據(jù)密鑰的使用方法,可以將密碼分為對稱密碼和公鑰密碼,接下來我們來簡單說明下它們兩個。
對稱密碼:加密和解密使用同一種密鑰的方式,常用的算法有 DES 以及 AES。
公鑰密碼:加密和解密使用不同的密碼的方式,因此公鑰密碼通常也稱為非對稱密碼,常用的算法有 RSA

由于本文討論的是 phpRSA 加密實(shí)例,這里就不詳細(xì)說明了,對于 RSA 算法有興趣的朋友可以查看下面的文章
《帶你徹底理解RSA算法原理》
對于 php 更多加密方式有興趣的朋友可以查看下面的文章
《PHP數(shù)據(jù)加密技術(shù)與密鑰安全管理》

2.使用場景

為移動端(IOS,安卓)編寫 API 接口

進(jìn)行支付、真實(shí)信息驗(yàn)證等安全性需求較高的通信

與其他第三方或合作伙伴進(jìn)行重要的數(shù)據(jù)傳輸

3.生成私鑰、公鑰

既然 RSA 是非對稱加密,那么就先必須生成所需要的私鑰和公鑰,以 ubuntu 為例。首先下載開源 RSA 密鑰生成工具 openssl (通常為 linux 系統(tǒng)自帶),如果沒有,可以通過以下命令進(jìn)行安裝

apt-get install openssl

當(dāng) openssl 安裝完畢后,我們就可以開始生成私鑰、公鑰了。首先,生成原始 RSA 私鑰文件

openssl genrsa -out rsa_private_key.pem 1024

注:這里生成了一個長度為 1024bit 的密鑰,轉(zhuǎn)化為字節(jié)就是 128byte

其次,將原始 RSA 私鑰轉(zhuǎn)換為 pkcs8 格式

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

最后,生成 RSA 公鑰

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

在需要使用的時候,我們將私鑰 rsa_private_key.pem 放在服務(wù)器端,公鑰發(fā)放給需要與我們進(jìn)行加密通信的一方就可以了。

4.php-rsa 加密解密實(shí)例

現(xiàn)在我們可以使用 php 進(jìn)行 RSA 的加密解密了,但在此之前,你首先要看看你有沒有安裝或開啟 phpopenssl 擴(kuò)展,可以通過文件輸出 phpinfo() 或者通過命令行輸出 php -m | less 來查看是否安裝開啟了此擴(kuò)展,也可以通過 extension_loaded() 函數(shù)來判斷擴(kuò)展是否開啟,如果沒有,則通過該命令進(jìn)行安裝(以 ubuntu 為例):

apt-get install php7.0-openssl

當(dāng)然,如果你是 Windows 操作系統(tǒng),可以下載對應(yīng)版本的 php_openssl.dll。

好了,現(xiàn)在我們來編寫一個 php-RSA 的服務(wù)器類庫,這個類庫的工作其實(shí)很簡單,就是封裝一些 php 針對 RSA 操作的函數(shù),方便我們加密解密。

class Rsa
{
    private $_config = [
        "public_key" => "",
        "private_key" => "",
    ];

    public function __construct($private_key_filepath, $public_key_filepath) {
        $this->_config["private_key"] = $this->_getContents($private_key_filepath);
        $this->_config["public_key"] = $this->_getContents($public_key_filepath);
    }

    /**
     * @uses 獲取文件內(nèi)容
     * @param $file_path string
     * @return bool|string
     */
    private function _getContents($file_path) {
        file_exists($file_path) or die ("密鑰或公鑰的文件路徑錯誤");
        return file_get_contents($file_path);
    }

    /**     
     * @uses 獲取私鑰
     * @return bool|resource     
     */ 
    private function _getPrivateKey() {
       $priv_key = $this->_config["private_key"];
       return openssl_pkey_get_private($priv_key);
    }

    /**     
     * @uses 獲取公鑰
     * @return bool|resource     
     */    
    private function _getPublicKey() {        
        $public_key = $this->_config["public_key"];
        return openssl_pkey_get_public($public_key);
    }

    /**     
     * @uses 私鑰加密
     * @param string $data     
     * @return null|string     
     */    
    public function privEncrypt($data = "") {        
        if (!is_string($data)) {
            return null;       
        }
        return openssl_private_encrypt($data, $encrypted, $this->_getPrivateKey()) ? base64_encode($encrypted) : null;
    }

    /**     
     * @uses 公鑰加密     
     * @param string $data     
     * @return null|string     
     */    
    public function publicEncrypt($data = "") {        
        if (!is_string($data)) {
            return null;        
        }        
        return openssl_public_encrypt($data, $encrypted, $this->_getPublicKey()) ? base64_encode($encrypted) : null;
    }

    /**     
     * @uses 私鑰解密     
     * @param string $encrypted     
     * @return null     
     */    
    public function privDecrypt($encrypted = "") {        
        if (!is_string($encrypted)) {
            return null;        
        }
        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->_getPrivateKey())) ? $decrypted : null;
    }    

    /**     
     * @uses 公鑰解密     
     * @param string $encrypted     
     * @return null     
     */    
    public function publicDecrypt($encrypted = "") {        
        if (!is_string($encrypted)) {
            return null;        
        }        
           return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->_getPublicKey())) ? $decrypted : null;
    }
}

好了,現(xiàn)在我們調(diào)用 Rsa 類,對數(shù)據(jù)進(jìn)行加密解密

$private_key = "private_key.pem"; // 私鑰路徑
$public_key = "rsa_public_key.pem"; // 公鑰路徑
$rsa = new Rsa($private_key, $public_key);

$origin_data = "這是一條測試數(shù)據(jù)";

$ecryption_data = $rsa->privEncrypt($origin_data);

$decryption_data = $rsa->publicDecrypt($ecryption_data);

echo "私鑰加密后的數(shù)據(jù)為:" . $ecryption_data;
echo PHP_EOL;
echo "公鑰解密后的數(shù)據(jù)為: " . $decryption_data;
echo PHP_EOL;

最后我們看到輸出:

最后要說明的是,公鑰、私鑰都可以加密,也都可以解密。其中:用公鑰加密需要私鑰解密,稱為“加密”。由于私鑰是不公開的,確保了內(nèi)容的保密,沒有私鑰無法獲得內(nèi)容;用私鑰加密需要公鑰解密,稱為“簽名”。由于公鑰是公開的,任何人都可以解密內(nèi)容,但只能用發(fā)布者的公鑰解密,驗(yàn)證了內(nèi)容是該發(fā)布者發(fā)出的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/26126.html

相關(guān)文章

  • 登陸認(rèn)證、web api接口調(diào)用、支付接口調(diào)用等場合經(jīng)常涉及到:md5、sh、 rsa等算法

    摘要:簡介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見端見特點(diǎn)便于理解,使用廣泛。這就使加密的計算量很大。對方收到信息后,用不同的密鑰解密并可核對信息摘要。 PHP-RSA簡介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...

    Bryan 評論0 收藏0
  • 登陸認(rèn)證、web api接口調(diào)用、支付接口調(diào)用等場合經(jīng)常涉及到:md5、sh、 rsa等算法

    摘要:簡介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見端見特點(diǎn)便于理解,使用廣泛。這就使加密的計算量很大。對方收到信息后,用不同的密鑰解密并可核對信息摘要。 PHP-RSA簡介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...

    Charles 評論0 收藏0
  • 登陸認(rèn)證、web api接口調(diào)用、支付接口調(diào)用等場合經(jīng)常涉及到:md5、sh、 rsa等算法

    摘要:簡介地址實(shí)際項(xiàng)目中的登陸認(rèn)證接口調(diào)用支付接口調(diào)用等場合經(jīng)常涉及到等算法。各大銀行接口中經(jīng)常使用算法對調(diào)用接口參數(shù)進(jìn)行簽名防篡改。使用端見端見特點(diǎn)便于理解,使用廣泛。這就使加密的計算量很大。對方收到信息后,用不同的密鑰解密并可核對信息摘要。 PHP-RSA簡介 github 地址 https://github.com/lmxdawn/PH... 實(shí)際項(xiàng)目中的登陸認(rèn)證、web api接口調(diào)...

    Half 評論0 收藏0
  • PHP RSA2 簽名算法

    摘要:什么是是在原來簽名算法的基礎(chǔ)上,新增了支持的簽名算法。的簽名算法會繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議使用的簽名算法。 什么是RSA2? RSA2是在原來SHA1WithRSA簽名算法的基礎(chǔ)上,新增了支持SHA256WithRSA的簽名算法。 該算法在摘要算法上比SHA1WithRSA有更強(qiáng)的安全能力。 SHA1WithRSA的簽名算法會繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議...

    derek_334892 評論0 收藏0
  • 聊聊加密那點(diǎn)事——PHP加密最佳實(shí)踐

    摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對稱加密算法由于對稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先]有任何意義的字符,必須通過事先約定的解密規(guī)則才能將...

    lcodecorex 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<