数据加密标准(DES,Data Encryption Standard)是一种使用密钥加密的块密码,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法。这个算法因为包含一些机密设计元素,相对短的密钥长度以及被怀疑内含美国国家安全局(NSA)的后门而在开始时是有争议的,因此DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。

DES现在已经不被视为一种安全的加密算法,主要因为它使用的56位密钥过短。1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以得到应用。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。

<?php
 
class Des_Crypt {
     
private $key;
     
     
function __construct($key) {
         
$this->key = $key;
     }

     
function encrypt($string) {
         
$size = mcrypt_get_block_size('des', 'ecb');
         
$string = mb_convert_encoding($string, 'GBK', 'UTF-8');
         
$string = $this->pkcs5_pad($string, $size);
         
$key = $this->key;
         
$td = mcrypt_module_open('des', '', 'ecb', '');

         
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

         @mcrypt_generic_init(
$td, $key, $iv);
         
$data = mcrypt_generic($td, $string);
         mcrypt_generic_deinit(
$td);
         mcrypt_module_close(
$td);
         
$data = base64_encode($data);
         
return $data;
     }

     
function decrypt($string) {
         
$string = base64_decode($string);
         
$key =$this->key;
         
$td = mcrypt_module_open('des','','ecb','');
         
//使用MCRYPT_DES算法,cbc模式
         $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
         
$ks = mcrypt_enc_get_key_size($td);
         @mcrypt_generic_init(
$td, $key, $iv);

         
//初始处理
         $decrypted = mdecrypt_generic($td, $string);

         
//解密
         mcrypt_generic_deinit($td);
         
//结束
         mcrypt_module_close($td);

         
$result = $this->pkcs5_unpad($decrypted);
         
$result = mb_convert_encoding($result, 'UTF-8', 'GBK');
         
return $result;
     }

     
function pkcs5_pad ($text, $blocksize) {
         
$pad = $blocksize - (strlen($text% $blocksize);
         
return $text . str_repeat(chr($pad), $pad);
     }

     
function pkcs5_unpad($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);
     }
 }

 
$key = "123456";
 
$string1 = "lina||vigo||60.191.34.147||3478";
 
$string2 = "这是中文测试";
 
$des = new Des_Crypt($key);
 
$encryption = $des->encrypt($string1);
 
$decryption = $des->decrypt($encryption);
 
echo "原始值:".$decryption;
 
echo "<br />";
 
echo "加密值:".$encryption;
 
?>