溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能

發(fā)布時(shí)間:2021-01-21 15:47:00 來源:億速云 閱讀:149 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

原因:

調(diào)試的時(shí)候發(fā)現(xiàn),直接原因是因?yàn)殚_放平臺(tái)里面填寫的授權(quán)事件(該授權(quán)事件每十分鐘會(huì)通送一次事件來更新ticket),即:

怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能

這個(gè)地方填寫的url,調(diào)試發(fā)現(xiàn),這個(gè)URL沒錯(cuò),微信也有每10分鐘推送過來,但是到最后一直接收不到ticket,看代碼發(fā)現(xiàn)是因?yàn)榻饷芪⑿胚^來的數(shù)據(jù)的時(shí)候報(bào)錯(cuò)了:

<?php 
 
function aes_decode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 }

即這個(gè)地方,由于我的環(huán)境是PHP 7.1,查找資料發(fā)現(xiàn)PHP 7.1已經(jīng)廢棄了Mcrypt,所以這個(gè)代碼里面的mcrypt_*都是無法運(yùn)行的。

解決:

查找資料發(fā)現(xiàn),可以通過OpenSSL來代替Mcrypt(前提是已經(jīng)安裝了OpenSSL擴(kuò)展,不過一般都是默認(rèn)安裝的)

openssl是一個(gè)功能強(qiáng)大的工具包,它集成了眾多密碼算法及實(shí)用工具。我們即可以利用它提供的命令臺(tái)工具生成密鑰、證書來加密解密文件,也可以在利用其提供的API接口在代碼中對傳輸信息進(jìn)行加密。

所以上面的代碼可以改為:

<?php 
 
function aes_decode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 
 /* mcrypt對稱解密代碼在PHP7.1已經(jīng)被拋棄了,所以使用下面的openssl來代替 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 $decrypted = openssl_decrypt($ciphertext_dec, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 }

補(bǔ)充:

上面的解密已經(jīng)修改了,那么對應(yīng)的Mcrypt加密也需要修改,如果不改的話會(huì)導(dǎo)致不能全網(wǎng)發(fā)布以及不能推送消息等事件
加密的源代碼如下:

<?php 
function aes_encode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 $text = random(16) . pack("N", strlen($message)) . $message . $appid; 
 $iv = substr($key, 0, 16); 
 
 $block_size = 32; 
 $text_length = strlen($text); 
 $amount_to_pad = $block_size - ($text_length % $block_size); 
 if ($amount_to_pad == 0) { 
 $amount_to_pad = $block_size; 
 } 
 $pad_chr = chr($amount_to_pad); 
 $tmp = ''; 
 for ($index = 0; $index < $amount_to_pad; $index++) { 
 $tmp .= $pad_chr; 
 } 
 $text = $text . $tmp; 
 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
}

修改后的代碼為:

<?php 
function aes_encode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 $text = random(16) . pack("N", strlen($message)) . $message . $appid; 
 $iv = substr($key, 0, 16); 
 
 $block_size = 32; 
 $text_length = strlen($text); 
 $amount_to_pad = $block_size - ($text_length % $block_size); 
 if ($amount_to_pad == 0) { 
 $amount_to_pad = $block_size; 
 } 
 $pad_chr = chr($amount_to_pad); 
 $tmp = ''; 
 for ($index = 0; $index < $amount_to_pad; $index++) { 
 $tmp .= $pad_chr; 
 } 
 $text = $text . $tmp; 
 /* mcrypt對稱加密代碼在PHP7.1已經(jīng)被拋棄了,所以使用下面的openssl來代替 
 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 
 $encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
}

特別注意:凡是涉及到微信開發(fā)的流程,如果已經(jīng)升級到PHP 7.1的話,那么很有必要需要檢查一下是否是使用Mcrypt對稱加解密的,微信開發(fā)文檔中使用的demo也是使用Mcrypt加解密的,這一點(diǎn)需要注意。

關(guān)于怎么在PHP 7.1中利用OpenSSL實(shí)現(xiàn)一個(gè)加解密功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI