首頁 後端開發 php教程 深入研究 UCenter API 之 PHP加密与解密

深入研究 UCenter API 之 PHP加密与解密

Jun 20, 2016 pm 01:02 PM
api介面

深入研究 UCenter API 之 PHP加密与解密

UCenter API 中的加密解密函数,被称为 php 领域的经典之作,也是康盛公司为 php 做的一大贡献

这个函数,可以通过一个 KEY ,生成动态的密文,并可以再通过这个 KEY 来解

 

  
// $string: 明文 或 密文   
// $operation:DECODE表示解密,其它表示加密   
// $key: 密匙   
// $expiry:密文有效期   
//字符串解密加密   
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {   
     // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙   
    $ckey_length = 4;   // 随机密钥长度 取值 0-32;   
                // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。   
                // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方   
                // 当此值为 0 时,则不产生随机密钥   
    // 密匙   
    $key = md5($key ? $key : UC_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('1303808563'), -$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));   
     }   
}  
echo authcode(&#39;123456&#39;, &#39;INCODE&#39;, &#39;scutephp&#39;, 0);  
echo "";  
echo authcode(&#39;3575ijqlNCR+R3s7Aakwy1HlvDzHw5g4oKp82qhE7q5FS88&#39;, &#39;DECODE&#39;, &#39;scutephp&#39;, 0);  

登入後複製

 


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

PHP中的郵件傳送API介面指南 PHP中的郵件傳送API介面指南 May 21, 2023 pm 12:12 PM

隨著電子郵件在我們日常生活中的普及,郵件發送成為了許多應用程式中必不可少的功能。 PHP作為一種流行的Web開發語言,也提供了對應的郵件發送API介面。本文將為初學者和開發者介紹PHP中的郵件發送API接口,包括如何配置郵件伺服器、如何使用PHP內建的郵件函數以及如何使用第三方郵件發送庫。一、設定郵件伺服器在使用PHP發送郵件之前,你需要先設定一個SMTP服

免費的api介面網站有哪些 免費的api介面網站有哪些 Jan 05, 2024 am 11:33 AM

免費的api介面網站:1、UomgAPI:提供穩定、快速免費API服務的平台,擁有超百個API介面;2、free-api:提供多個免費API介面;3、JSON API:提供免費的資料API介面;4、高德開放平台:提供地圖相關的API介面;5、人臉辨識Face++:提供人臉辨識相關的API介面;6、極速資料:提供超百個免費API接口,適用於需要多種資料來源的場合;7、聚合資料等等。

api接口是乾嘛的 api接口是乾嘛的 Apr 23, 2024 pm 01:51 PM

API介面是軟體元件之間互動的規範,用於實作不同應用程式或系統之間的通訊和資料交換。 API介面充當“翻譯器”,將開發人員的指令轉換為電腦語言,讓應用程式協同工作。其優點包括便利的資料共享、簡化開發、提高效能、增強安全性、提升生產效率和互通性。

api接口類型主要有哪些 api接口類型主要有哪些 Apr 23, 2024 pm 01:57 PM

API介面類型豐富多樣,主要包括RESTful API、SOAP API、GraphQL API等。 RESTful API透過HTTP協定進行通信,設計簡潔高效,是當下主流的Web API設計風格。 SOAP API基於XML,著重在語言和平台的互通性,多應用於大型企業和政府機構。 GraphQL API是一種新型查詢語言和執行時間環境,支援靈活的資料查詢和回應。

開發API文件:PHP API介面的步驟指南 開發API文件:PHP API介面的步驟指南 Jan 22, 2024 am 11:20 AM

隨著Web應用程式的日益普及,API(應用程式介面)越來越重要,在Web開發中扮演越來越重要的角色。 WebAPI是一種允許使用者透過Internet來存取應用程式的技術,是將不同的應用程式組合在一起的基礎工具。 PHP是一種被廣泛使用的程式語言,特別是在Web開發領域。開發人員可以透過開發PHPAPI介面來允許其他應用程式使用他們的應用程式功能。為了實現這

如何使用PHP呼叫API介面並實現資料互動? 如何使用PHP呼叫API介面並實現資料互動? Sep 05, 2023 am 09:30 AM

如何使用PHP呼叫API介面並實現資料互動?隨著Web應用程式的發展,許多開發人員需要使用API​​(ApplicationProgrammingInterface)介面來實現與第三方服務的資料互動。 PHP作為一種常用的後端開發語言,提供了強大的功能來呼叫API介面進行資料傳輸和處理。本文將介紹如何使用PHP呼叫API接口,並提供一些程式碼範例來幫助讀者更好地

如何使用Go語言和Redis建構API介面 如何使用Go語言和Redis建構API介面 Oct 27, 2023 pm 01:23 PM

如何使用Go語言和Redis建立API介面概述:Go語言(Golang)是一種簡潔、高效、強大的程式語言,而Redis是一個開源的記憶體資料庫,它提供了豐富的資料結構和強大的查詢功能。本文將介紹如何使用Go語言和Redis建構API接口,並提供具體的程式碼範例。步驟1:安裝和設定Go語言環境首先,需要在電腦上安裝Go語言,並設定好相關環境變數。在完成這一步之後

用PHP建構一個微信公眾號API介面 用PHP建構一個微信公眾號API介面 May 13, 2023 pm 12:01 PM

在當今網路時代,微信公眾號成為了越來越多企業的重要行銷管道。想要自己的微信公眾號實現更多的功能,常常需要寫對應的介面。本文將以PHP語言為例,介紹如何建構一個微信公眾號API介面。一、前置準備在編寫微信公眾號API介面之前,需要開發者擁有一個微信公眾號的帳號,並且在微信公眾平台中申請開發者介面權限。申請成功後,可以取得相關的開發者AppID和AppSe

See all articles