PHP實現基於3DES演算法加密解密字串示例

2022-09-28 18:30:14 字數 3471 閱讀 5841

3des(或稱為triple des)是三重資料加密演算法(tdea,triple data encryption algorithm)塊密碼的通稱。它相當於是對每個資料塊應用三次des加密演算法。由於計算機運算能力的增強,原版des密碼的金鑰長度變得容易被暴力破解;3des即是設計用來提供一種相對簡單的方法,即通過增加des的密程式設計客棧鑰長度來避免類似的攻擊,而不是設計一種全新的塊密碼演算法。

專案位址:

一、為什麼要進行資料加密

資料的安全性越來越得以重視。舉個例子說,儲存在資料庫中的使用者密碼並不是明文儲存的,而是採用md5加密後儲存,這樣即使資料庫被脫庫,仍能保證使用者密碼安全。但是,md5是不可逆的,開發人員根本就不知道使用者的密碼到底是什麼。有些時候,我們希望加密後儲存的資料是可逆的,比如一些介面金鑰,這樣即使資料庫被脫庫,如果沒有對應的解密方式,攻擊者盜取的金鑰也是不能使用的。

二、3des加密簡介

3des(即triple des)是des向aes過渡的加密演算法(2023年,nist將3-des指定為過渡的加密標準),加密演算法,其具體實現如下:設ek()和dk()代表des演算法的加密和解密過程,k代表des演算法使用的金鑰,m代表明文,c代表www.cppcns.com密文,這樣:

3des加密過程為:c=ek3(dk2(ek1(m)))

3des解密過程為:m=dk程式設計客棧1(ek2(dk3(c)))

三、使用php實現3des加密

1. 使用php實現3des流程圖

要使用以上的函式,在編譯php的時候必須新增--with-mcrypt選項。

2. php實現3des**

<?php /**

* 3des加解密類

* @author: 黎志斌

* @version: v1.0

* 2023年7月21日

*/class encrypt

/*** 對字串進行3des加密

* @param string 要加密的字串

* @return mixed 加密成功返回加密後的字串,否則返回false

*/public function encrypt3des($str)

//檢查加密key,iv的長度是否符合演算法要求

$key = $this->fixlen($this-&vfopyxslqigt;_key, mcrypt_enc_get_key_size($td));

$iv = $this->fixlen($this->_iv, mcrypt_enc_get_iv_size($td));

//加密資料長度處理

$str = $this->strpad($str, mcrypt_enc_get_block_size($td));

if (mcrypt_generic_init($td, $key, $iv) !== 0)

$result = mcrypt_generic($td, $str);

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

return $result;

} /**

* 對加密的字串進行3des解密

* @param string 要解密的字串

* @return mixed 加密成功返回加密後的字串,否則返回false

*/public function decrypt3des($str)

//檢查加密key,iv的長度是否符合演算法要求

$key = $this->fixlen($this->_key, mcrypt_enc_get_key_size($td));

$iv = $this->fixlen($this->_iv, mcrypt_enc_get_iv_size($td));

if (mcrypt_generic_ $key, $iv) !== 0)

$result = mdecrypt_generic($td, $str);

mcrypt_generic_deinit($td);

mcrypt_module_close($td);

return $this->strunpad($result);

} /**

* 返回適合演算法長度的key,iv字串

* @param string $str key或iv的值

* @param int $td_len 符合條件的key或iv長度

* @return string 返回處理後的key或iv值

*/private function fixlen($str, $td_len)

else if($str_len < $td_len)

return $str;

} /**

* 返回適合演算法的分組大小的字串長度,末尾使用\0補齊

* @param string $str 要加密的字串

* @param int $td_group_len 符合演算法的分組長度

* @return string 返回處理後字串

*/private function strpad($str, $td_group_len)

/*** 返回適合演算法的分組大小的字串長度,末尾使用\0補齊

* @param string $str 要加密的字串

* @return string 返回處理後字串

*/private function strunpad($str) }

$key = 'abcedfghijklmnopq';

$iv = '0123456789';

$des = new encrypt($key, $iv);

$str = "abcdefghijklmnopq";

echo "source: ,len: ",strlen($str),"\r\n";

$e_str = $des->encrypt3des($str);

echo "entrypt: ", $e_str, "\r\n";

$d_str = $des->decrypt3des($e_str);

echo "dntrypt: ,len: ",strlen($d_str),"\r\n";

注意,如果要在資料庫中儲存加密後的資料,建議base64_encode之後再儲存,以下是php官網上的建議:

如果你在例如 mysql 這樣的資料庫中儲存資料, 請注意 varchar 型別的字段會在插入資料時自動移除字串末尾的「空格」。 由於加密後的資料可能是以空格(ascii 32)結尾, 這種特性會導致資料損壞。 請使用 tinyblob/tinytext(或 larger)欄位來儲存加密資料。

ps:關於加密解密感興趣的朋友還可以參考本站**工具:

**des加密/解密工具

md5**加密工具:

**雜湊/雜湊演算法加密工具:

**md5/hash/sha-1/sha-2/sha-256/sha-512/sha-3/ripemd-160加密工具:

**sha1/sha224/sha256/sha384/sha512加密工具:

3des演算法加密

實現的原理 public class encryption 執行3des加密 param secretkey 秘鑰 param datastring 明文 return base64編碼文字 public static string encryptdes string secretkey,strin...

PHP進行3des加密

封裝加密解密類 use think controller header content type text html charset utf 8 class encrypt extends controller 檢查加密key,iv的長度是否符合演算法要求 key this fixlen key,m...

3DES加密演算法

des是乙個經典的對稱加密演算法,但也缺陷明顯,即56位的金鑰安全性不足,已被證實可以在短時間內破解。為解決此問題,出現了3des,也稱triple des,3des為des向aes過渡的加密演算法,它使用3條56位的金鑰對資料進行三次加密。為了相容普通的des,3des並沒有直接使用 加密 加密 ...