PHP使用3DES演算法加密解密字串

2021-07-15 09:58:48 字數 3205 閱讀 1554

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

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

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

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

3des解密過程為:m=dk1(ek2(dk3(c)))

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

<?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->_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_init($td, $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)欄位來儲存加密資料。

Des與3Des加密解密

des和3des演算法 public class des b ret.tostring return ret.tostring 3des加密 金鑰不能每8位重複,例如 123456781234567812345678,如果這樣則演算法退化為des,c 會檢測,不能使用 明文 金鑰 public st...

iOS AES加密 解密 3DES加密 解密

加密步驟 字串經過aes加密得到nsdata型別,然後在對加密後的nsdata型別進行base64轉碼,得出最終的字串。解密步驟 對要解密的字串進行base64解碼,然後進行解密,得出原字串。首先建立乙個nsdata jkencrypt類別,寫完的.件如下 import inte ce nsdata...

3des演算法加密

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