1. 程式人生 > >php的DES加密演算法

php的DES加密演算法

yii框架的DES程式碼

<?php
/**
 *@see Yii CSecurityManager;
 */
class Des{
 
  public static function encrypt($data,$key){
      $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
      $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
      srand();
      $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
      mcrypt_generic_init($module,$key,$iv);
      $encrypted=$iv.mcrypt_generic($module,$data);
      mcrypt_generic_deinit($module);
      mcrypt_module_close($module);
      return md5($data).'_'.base64_encode($encrypted);
  }
   
  public static function decrypt($data,$key){    
      $_data = explode('_',$data,2);
      if(count($_data)<2){
        return false;
      }
      $data = base64_decode($_data[1]);      
      $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
      $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
      $ivSize=mcrypt_enc_get_iv_size($module);
      $iv=substr($data,0,$ivSize);
      mcrypt_generic_init($module,$key,$iv);
      $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
      mcrypt_generic_deinit($module);
      mcrypt_module_close($module);
      $decrypted = rtrim($decrypted,"\0");       
      if($_data[0]!=md5($decrypted)){
        return false;
      }
      return $decrypted;
  }
   
}


在網上看到了一篇文章,講到:

由於PHP使用mcrypt擴充套件進行3DES加密,填充模式是跟JAVA以及.NET是不一樣的,JAVA和.NET填充模式使用的是PKCS7。
所以PHP端必須自定義一個函式對加密字串進行PKCS7模式補位填充。
另外一點就是雙方的KEY注意進行base64編碼,最後PHP端經過3DES加密後得到的結果也需要進行base64編碼。
以上幾點都做好之後,加密結果就一致了。

下面是相容C#和java的3DES加密的演算法

<?php
class STD3Des
{
    private $key = "";
    private $iv = "";
 
    /**
    * 構造,傳遞二個已經進行base64_encode的KEY與IV
    *
    * @param string $key
    * @param string $iv
    */
    function __construct ($key, $iv)
    {
        if (empty($key) || empty($iv)) {
            echo 'key and iv is not valid';
            exit();
        }
        $this->key = $key;
        $this->iv = $iv;
    }
 
    /**
    *加密
    * @param <type> $value
    * @return <type>
    */
    public function encrypt ($value)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
        $iv = base64_decode($this->iv);
        $value = $this->PaddingPKCS7($value);
        $key = base64_decode($this->key);
        mcrypt_generic_init($td, $key, $iv);
        $ret = base64_encode(mcrypt_generic($td, $value));
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $ret;
    }
 
    /**
    *解密
    * @param <type> $value
    * @return <type>
    */
    public function decrypt ($value)
    {
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
        $iv = base64_decode($this->iv);
        $key = base64_decode($this->key);
        mcrypt_generic_init($td, $key, $iv);
        $ret = trim(mdecrypt_generic($td, base64_decode($value)));
        $ret = $this->UnPaddingPKCS7($ret);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return $ret;
    }
 
    private function PaddingPKCS7 ($data)
    {
        $block_size = mcrypt_get_block_size('tripledes', 'cbc');
        $padding_char = $block_size - (strlen($data) % $block_size);
        $data .= str_repeat(chr($padding_char), $padding_char);
        return $data;
    }
 
    private function UnPaddingPKCS7($text)
    {
        $pad = ord($text{strlen($text) - 1});
        if ($pad > strlen($text)) {
            return false;
        }
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            return false;
        }
        return substr($text, 0, - 1 * $pad);
    }
}
?>


相關推薦

php openssl_sign() 語法+RSA公私鑰加密解密,非對稱加密演算法詳解

其實有時候覺得寫部落格好煩,就個函式就開篇部落格。很小的意見事情而已,知道的人看來多取一舉,或者說沒什麼必要,浪費時間,不知道的人就會很鬱悶。技術就是這樣的,懂的人覺得真的很簡單啊,不知道的人真的好難。。。 一般在跟第三方介面對接資料的時候,為了保證很多都使用的RSA簽名,沒性趣瞭解的同學只需要

國內作戰指揮學院畢業的程式設計師解析:美國國防、銀行和支付的加密演算法

WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——可以通俗的解釋為伺服器主動傳送資訊給客戶端。 區別於MQTT、XMPP等聊天的應用層協議,它是一個傳輸通訊協議。它有著自己一套連線握手,以及資料傳輸的規範。 而本文要講到的SRWebSock

Hbuilder開發app實戰-識歲05-Crypto.js實現各種js加密演算法

前言 js加密,應該說做js開發的很少接觸到這一塊,因為很多時候都是做加密,很少有前端做加密的, 很榮幸我接觸過兩次,找到了crypto.js,很好的東西,可以實現各種js加密。 吐槽 吐槽下前端做加密,一般來說前端做加密這需求是很少的,極少的, 我卻碰到了兩次,

資料安全及加密演算法對比

平時開發中不僅會遇到各種需要保護使用者隱私的情況,而且還有可能需要對公司核心資料進行保護,這時候加密隱私資料就成為了必要。然而市場上存在著各種各樣的抓包工具及解密演算法,甚至一些公司有專門的逆向部門,這就加大了資料安全的風險,本文將通過以下幾個方面對各種加密演算法進行分析對比: Base

PostgreSQL之V10使用者密碼認證及加密演算法scram-sha-256

PG V10官方手冊關於使用者密碼的描述 PostgreSQL資料庫口令獨立於作業系統使用者口令。每個資料庫使用者的口令被儲存在pg_authid系統目錄中。    口令可以用 SQL 命令CREATE USER和ALTER ROLE管理,例如CREATE USE

[分享]ECC加密演算法入門介紹 【演算法乾貨】

前言 同RSA(Ron Rivest,Adi Shamir,Len Adleman三位天才的名字)一樣,ECC(Elliptic Curves Cryptography,橢圓曲線密碼編碼學)也屬於公開金鑰演算法。目前,國內詳細介紹ECC的公開文獻並不多(反正我沒有找到)。有一些簡介,也是

應用加密一;非對稱加密演算法揭祕

非對稱加密演算法   使用過程:   乙方生成兩把金鑰(公鑰和私鑰) 甲方獲取乙方的公鑰,然後用它對資訊加密。   乙方得到加密後的資訊,用私鑰解密,乙方也可用私鑰加密字串   甲方獲取乙方私鑰加密資料,用公鑰解密   優點:   更安全,金鑰越長,它就越難破解   缺點:   加密速度慢

破解學校飯卡加密演算法

0x00 起因 rtz在除錯NFC時無意發現學校的飯卡是 Mifare S50 卡 然而這種型別的卡片安全性非常低,網際網路上有大量破解該型別卡片的工具 所以rtz決定破解一下學校的飯卡練練手。 0x01 工具 ACR122U 讀卡器一臺 無源全加密偵測卡一張 此次破解的關鍵是無源全加密

陽光寬頻加密演算法破解,找出隱藏真實地址。

首先,用charles手機抓包(怎麼抓包就不介紹了。網上很多介紹)。抓出今日頭條應用西瓜視訊列表頁。 列表頁網址類似於: http://iu.snssdk.com/api/news/feed/v64/? 引數: FP = FlTqL25rL2cuFlctPlU1FlFSFzwu&VERS

Java之加密演算法

加密演算法主要分為對稱加密、非對稱加密、Hash加密。 一、何為對稱加密?   對稱加密是指對稱密碼編碼技術,它的特點是檔案加密和解密使用相同的金鑰加密。 對稱機密的金鑰一般小於256bit。因為就金鑰而言,如果加密的金鑰越大,則其計算的複雜度越高,所需要的時間越長,而如果使用的金鑰較小,則很容易破解,

加密演算法(MD5、RSA、AES)

加密技術通常分為兩大類:"對稱式"和"非對稱式"。 對稱性加密演算法:對稱式加密就是加密和解密使用同一個金鑰。資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行加解密了。對稱加密演算法用來對敏感資料等資訊進行加密。 非對稱演算法:非對稱式加密就是加密和解密所使用的

工作中加密演算法實踐

遊戲中需要對接銀聯渠道 對方需求是需要使用非對稱加密演算法 簽名機制: 對於報文的簽名處理機制如下:首先,對報文中出現簽名域(sign)之外的所有資料元採用key=value的形式按照名稱排序,然後以&作為連線符拼接成待簽名串。其次,對待簽名串使用SHA-1演算法做摘要,再使用接入

RSA加密演算法簡單分析

         預備知識       1)RSA是第一個比較完善的公開金鑰演算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest,

安全不安全003:C#實現MD5加密演算法

MD5是一種資訊-摘要演算法,一種單向函式演算法(也就是HASH演算法)。將不同輸入長度的資訊進行雜湊計算,得到固定長度的輸出。它的主要特點是,不可逆 和唯一性。即不能由結果計算出輸入值;且不同的輸入值計算得到的固定長度輸出是唯一的。 目前使用的面向物件程式語言中,基本都有類庫實現好的MD5方法

Java工具類-加密演算法

    import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub

RSA非對稱加密演算法(表單提交時,前端js加密,後端java解密)

RSA非對稱加密演算法(表單提交時,前端js加密,後端java解密 非對稱加密演算法 需要的工具 前端jsp頁面 js程式碼 加密解密的工具類 產生公鑰的類 處理登陸請求的類 加密成功的密碼 非對稱加密演算

區塊鏈的加密演算法__一,從維吉尼亞到RSA(未完待續)

密碼學源於數學。處於一些特殊的需要,自從數學有所發展的時候,就有了加密者與解密者。 一開始的密碼學加密法都是對稱加密法,這種情況一直到上個世紀中葉RSA加密法誕生。如今區塊鏈所使用的各種各樣的加密法都為不對稱加密,而最早的不對稱加密法就是RSA加密法,是它開啟了公鑰密碼學的新時代,以及如今的區塊

區塊鏈教程區塊鏈背後的資訊保安2DES、3DES加密演算法原理二

Feistel輪函式 每次Feistel輪函式內部,均經過4種運算,即: 1、擴充套件置換:右側32位做擴充套件置換,擴充套件置換將32位輸入擴充套件成為48位輸出,使得擴充套件後輸出資料長度與48位子金鑰等長。 2、異或運算:右側32位擴充套件置換為48位後,與48位子金鑰做異或運算。 3

CAS統一登入認證(18): ldap sha加密演算法

在我寫的 CAS統一登入認證(13): ldap 批量匯入使用者 一文中,沒有解決程式產生ldap,sha密碼問題,後來,找到,在php中的程式碼 public function ldap_sha($password) { $ldap_passwd = “{SHA}”

加密技術:加密演算法AES在資訊保安中的應用

隨著網路資訊科技的迅猛發展,網路資料加密的要求也日益提高,AES的應用首先體現在網路資訊保安領域中,以下四點就能很好的證明AES加密演算法的廣泛應用。 1. 無線 網路應用由於無線網路的通訊通道較有線網路更為開放,安全性的要求更高。目前,無線網路主要有兩個標準 :一是用於 WLAN的IEEE803.11協議