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...