首頁 後端開發 php教程 php常用的加密解密演算法的解說(程式碼)

php常用的加密解密演算法的解說(程式碼)

Oct 08, 2018 pm 02:33 PM
加密解密

這篇文章帶給大家的內容是關於php常用的加密解密演算法的講解(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

這裡主要介紹三種常用的加密解密演算法:
方法一:

/**
 * @param $string    要加密/解密的字符串
 * @param string $operation   类型,ENCODE 加密;DECODE 解密
 * @param string $key    密匙
 * @param int $expiry    有效期
 * @return string
 */
function authcode($string, $operation = 'DECODE', $key = 'encrypt', $expiry = 0)
{
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
    $ckey_length = 4;
    // 密匙
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
    // 密匙a会参与加解密
    $keya = md5(substr($key, 0, 16));
    // 密匙b会用来做数据完整性验证
    $keyb = md5(substr($key, 16, 16));
    // 密匙c用于变化生成的密文
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) :
        substr(md5(microtime()), -$ckey_length)) : '';
    // 参与运算的密匙
    $cryptkey = $keya . md5($keya . $keyc);
    $key_length = strlen($cryptkey);
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
    //解密时会通过这个密匙验证数据完整性
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
        sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
    $string_length = strlen($string);
    $result = '';
    $box = range(0, 255);
    $rndkey = array();
    // 产生密匙簿
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    // 核心加解密部分
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        // 从密匙簿得出密匙进行异或,再转成字符
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if ($operation == &#39;DECODE&#39;) {
        // 验证数据有效性,请看未加密明文的格式
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
            substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)
        ) {
            return substr($result, 26);
        } else {
            return &#39;&#39;;
        }
    } else {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
    }
}
登入後複製

使用:

$string = &#39;加密字符串&#39;;
// 加密
$encode = authcode($string, &#39;ENCODE&#39;);
echo $encode . &#39;</br>&#39;;       // a2f4bSYyUrTum1nAAA9X9BrC4Z3DZazcSa4eLcvDoCnmYc1LTdvtqS4aCds
// 解密
$decode = authcode($encode, &#39;DECODE&#39;);
echo $decode;     // 加密字符串
登入後複製

方法二:

/**
 * @param $string    要加密/解密的字符串
 * @param $operation    类型,E 加密;D 解密
 * @param string $key   密钥
 * @return mixed|string
 */
function encrypt($string, $operation, $key = &#39;encrypt&#39;)
{
    $key = md5($key);
    $key_length = strlen($key);
    $string = $operation == &#39;D&#39; ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = &#39;&#39;;
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if ($operation == &#39;D&#39;) {
        if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
            return substr($result, 8);
        } else {
            return &#39;&#39;;
        }
    } else {
        return str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
    }
}
登入後複製

使用:

$string = &#39;加密字符串&#39;;
// 加密
$encode = encrypt($string, &#39;E&#39;);
echo $encode . &#39;</br>&#39;;       // 0Jzym5UzkRKH726U7Pyt7ixzLz9YEEA
// 解密
$decode = encrypt($encode, &#39;D&#39;);
echo $decode;     // 加密字符串
登入後複製

方法三:

#
/**
 * @param $data  要加密的字符串
 * @param $key   密钥
 * @return string
 */
function encrypt($data, $key = &#39;encrypt&#39;)
{
    $key = md5($key);
    $x = 0;
    $len = strlen($data);
    $l = strlen($key);
    $char = &#39;&#39;;
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= $key{$x};
        $x++;
    }
    $str = &#39;&#39;;
    for ($i = 0; $i < $len; $i++) {
        $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    }
    return base64_encode($str);
}


/**
 * @param $data    要解密的字符串
 * @param $key     密钥
 * @return string
 */
function decrypt($data, $key = &#39;encrypt&#39;)
{
    $key = md5($key);
    $x = 0;
    $data = base64_decode($data);
    $len = strlen($data);
    $l = strlen($key);
    $char = &#39;&#39;;
    for ($i = 0; $i < $len; $i++) {
        if ($x == $l) {
            $x = 0;
        }
        $char .= substr($key, $x, 1);
        $x++;
    }
    $str = &#39;&#39;;
    for ($i = 0; $i < $len; $i++) {
        if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
            $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
        } else {
            $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
        }
    }
    return $str;
}
登入後複製

使用:

$string = &#39;加密字符串&#39;;
// 加密
$encode = encrypt($string);
echo $encode . &#39;</br>&#39;;       // Gr0DHeHrRw7KGBLcSOzj
// 解密
$decode = decrypt($encode);
echo $decode;     // 加密字符串
登入後複製

以上是php常用的加密解密演算法的解說(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用 React Query 和資料庫進行資料加密和解密 使用 React Query 和資料庫進行資料加密和解密 Sep 26, 2023 pm 12:53 PM

標題:使用ReactQuery和資料庫進行資料加密和解密簡介:本文將介紹如何使用ReactQuery和資料庫進行資料加密和解密。我們將使用ReactQuery作為資料管理庫,並結合資料庫進行資料的加密和解密操作。透過結合這兩種技術,我們可以安全地儲存和傳輸敏感數據,並在需要時進行加密和解密操作,確保資料的安全性。正文:一、ReactQue

Win11加密功能怎麼加入到右鍵選單? Win11加密解密右鍵快速新增方法 Win11加密功能怎麼加入到右鍵選單? Win11加密解密右鍵快速新增方法 Jan 07, 2024 am 08:45 AM

這篇文章是本站跟大家分享的在不使用第三方加解密工具情況下對文件進行加解密方法,Win11右鍵選單添加加密解密方法教程,由於需要修改註冊表,大家一定要做好備份再進行操作。 1.首先,按鍵盤上的【Win+R】組合鍵,打開運行,然後輸入【regedit】命令,按【確定或回車】可以打開註冊表編輯器;2、用戶帳戶控制窗口,你要允許此應用程式對你的裝置進行更改嗎?點選【是】;3、登錄編輯器窗口,依序展開到以下路徑:HKEY_CURRENT_USER\Software\Microsoft\Windows\Curr

微信小程式中PHP開發的加密與解密實作方法 微信小程式中PHP開發的加密與解密實作方法 Jun 01, 2023 am 08:12 AM

隨著微信小程式在行動應用市場中越來越流行,它的開發也受到越來越多的關注。在小程式中,PHP作為一種常用的後端語言,經常用於處理敏感資料的加密和解密。本文將介紹在微信小程式中如何使用PHP實作加密和解密。一、什麼是加密解密?加密是將敏感資料轉換為不可讀的形式,以確保資料在傳輸過程中不會被竊取或竄改。解密是將加密資料還原為原始資料。在小程式中,加密和解密通常包括

使用Yii框架中間件加密和解密敏感數據 使用Yii框架中間件加密和解密敏感數據 Jul 28, 2023 pm 07:12 PM

使用Yii框架中間件加密和解密敏感資料引言:在現代的網路應用中,隱私和資料安全是非常重要的問題。為了確保用戶的敏感資料不會被未經授權的訪客取得,我們需要對這些資料進行加密。 Yii框架為我們提供了一種簡單且有效的方法來實現加密和解密敏感資料的功能。在本文中,我們將介紹如何使用Yii框架的中間件來實現這一目標。 Yii框架簡介Yii框架是一個高效能的PHP框架,

PHP 信箱開發:實作郵件的加密與解密功能 PHP 信箱開發:實作郵件的加密與解密功能 Sep 12, 2023 am 10:40 AM

PHP郵箱開發:實現郵件的加密和解密功能隨著訊息傳遞的日益發達,電子郵件已成為人們重要的溝通方式之一。然而,隨之而來的安全問題也逐漸引起人們的注意。為了保護郵件的安全性,加密和解密成為了發送和接收郵件的重要環節。本文將介紹如何使用PHP開發郵件加密與解密功能,以提升電子郵件的安全性。一、加密的原理和作用郵件加密是將郵件內容使用特定的演算法轉換,使得除了收件

Java 函式庫中都有哪些常用加密解密工具? Java 函式庫中都有哪些常用加密解密工具? May 05, 2024 am 08:54 AM

Java函式庫提供了豐富的加密解密工具,包括JCE、JCA、ApacheCommonsCrypt等。 JCE提供了加密演算法和功能,JCA提供介面存取加密服務提供者,ApacheCommonsCrypt包含更多加密演算法和工具。實戰案例展示如何使用JCE對文字進行AES加密,產生Base64編碼的密文。

如何利用Go的SectionReader模組實作檔案指定部分的內容加密與解密? 如何利用Go的SectionReader模組實作檔案指定部分的內容加密與解密? Jul 23, 2023 am 08:24 AM

如何利用Go的SectionReader模組實作檔案指定部分的內容加密與解密?引言:在開發中,文件的內容加密與解密是一個很常見的需求。 Go語言提供了豐富的函式庫和模組來滿足這一需求。其中,SectionReader是一個非常實用的模組,它可以讓我們在一個大檔案中指定內容的範圍,並進行讀取、加密和解密操作。本文將介紹如何使用Go的SectionReader模組來實

PHP騰訊雲端伺服器API介面對接中的資料加密與解密範例 PHP騰訊雲端伺服器API介面對接中的資料加密與解密範例 Jul 05, 2023 pm 06:16 PM

PHP騰訊雲端伺服器API介面對接中的資料加密與解密範例隨著雲端伺服器的廣泛應用,越來越多的開發者開始將自己的應用程式部署到雲端伺服器上。而在與騰訊雲端​​伺服器API介面對接過程中,資料的加密與解密是一個重要的環節。本文將介紹一種在PHP中進行資料加密與解密的範例。在對接騰訊雲端伺服器API介面時,我們通常需要對一些敏感資料進行加密,以確保資料的安全。同時,也需要在接

See all articles