成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php-rsa 加密解密

livem / 3103人閱讀

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

1.什么是RSA加密

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

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

2.使用場(chǎng)景

為移動(dòng)端(IOS,安卓)編寫(xiě) API 接口

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

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

3.生成私鑰、公鑰

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

apt-get install openssl

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

openssl genrsa -out rsa_private_key.pem 1024

注:這里生成了一個(gè)長(zhǎng)度為 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

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

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

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

apt-get install php7.0-openssl

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

好了,現(xiàn)在我們來(lái)編寫(xiě)一個(gè) php-RSA 的服務(wù)器類庫(kù),這個(gè)類庫(kù)的工作其實(shí)很簡(jiǎn)單,就是封裝一些 php 針對(duì) 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 ("密鑰或公鑰的文件路徑錯(cuò)誤");
        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 類,對(duì)數(shù)據(jù)進(jìn)行加密解密

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

$origin_data = "這是一條測(cè)試數(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;

最后我們看到輸出:

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/26126.html

相關(guān)文章

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

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

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

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

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

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

    Half 評(píng)論0 收藏0
  • PHP RSA2 簽名算法

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

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

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

    lcodecorex 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<