最新消息: 生命不止,奋斗不息……

图解DES加解密

PHP admin 662浏览 0评论

DES是一种对称加密算法,也就是通过密文和合法的密钥能够将明文还原出来,在程序开发过程中有些接口 可能需要获取原始数据,而发送的数据又比较敏感(比如用户的密码等信息),这时可以选择DES加密算法,DES的安全性还算可靠,只要加密密钥不泄露,目 前破解的方法只有穷举法进行破解。

再说一下应用时需要注意的地方,

1.DES加密时需要的key(密钥)长度不能超过8位,一般我们设置8位就可以了。

2.DES加密后的数据是二进制数据,如果使用GET方式传输应该将其处理一下才可以(比如可以转换成16进制、base64等)。

3.需要加密的数据如果长度不是8字节的倍数,在解密后末尾会有多余的不可预知的东西(不足8字节的部分会自动补齐到8字节),需要进行处理才能得到严格 意义上的原始数据,或者我们在加密原始数据前就将数据补齐到8字节的倍数(比如接口约定原始数据不足8字节的部分用空格填充等)。

接下来是一个简单的流程图来说明DES加密解密过程:

DES加密解密
des_mcrypt.php(加密解密类)

 class Mydes
 {
		//DES 加密
		public function  des($encrypt, $key = '12345678') {
			
			$iv = mcrypt_create_iv ( mcrypt_get_iv_size ( MCRYPT_DES, MCRYPT_MODE_ECB ), MCRYPT_RAND );
			$passcrypt = mcrypt_encrypt ( MCRYPT_DES, $key, $encrypt, MCRYPT_MODE_ECB, $iv );
			return $passcrypt;
		}
		/**
		 * 将二进制数据转换成十六进制
		 */
		public function asc2hex($temp) {
			return bin2hex ( $temp );
		}

		/**
		 * 十六进制转换成二进制
		 *
		 * @param string
		 * @return string
		 */
		public function hex2asc($temp) {
			$len = strlen ( $temp );
			$data = '';
			for($i = 0; $i < $len; $i += 2)
				$data .= chr ( hexdec ( substr ( $temp, $i, 2 ) ) );
			return $data;
		}
		//DES解密
		public function un_des($decrypt, $key = '12345678') {
			
			$iv = mcrypt_create_iv ( mcrypt_get_iv_size ( MCRYPT_DES, MCRYPT_MODE_ECB ), MCRYPT_RAND );
			$decrypted = mcrypt_decrypt ( MCRYPT_DES, $key, $decrypt, MCRYPT_MODE_ECB, $iv );
			return $decrypted;
		}

 }

des.php(加密解密程序)

include './des_mcrypt.php';

 $key = 'abcd1234'; //密钥需要8字节 按需求修改
 $mydes = new Mydes(); //实例化类
 $data = '这是要加密的数据12'; //要加密的数据(注:如果要加密的数据长度不是8字节的倍数 经加密解密后结尾会有不可预知的字符,需要trim)
 echo '待加密数据为: ' . $data . ' 长度为:' . strlen($data);;
 $desdata = $mydes->des($data,$key);//加密 第二个参数为加密key
 echo '加密后的数据是:' . $desdata;
 echo '因为加密后是二进制数据,你看到的以上数据肯定是乱码';
 $encode_data = $mydes->asc2hex($desdata); //将加密后的二进制数据转换为16进制,使之能够get方式传输(当然也可以用其他方式比如base64)
 echo '加密后的数据转换为16进制,结果是:' . $encode_data . ' 接下来可以将数据发送给解密方';




 //接下来你可以将数据发送给解密方 get/post等方式 这里模拟接收方的解密过程
 echo '下面模拟解密过程';
 echo '获取到的待解密数据是:' . $encode_data; //已经转换进制的数据
 $decode_data = $mydes->hex2asc($encode_data); //将待解密数据还原成二进制
 echo '还原成的二进制数据是' . $decode_data;
 echo '因为已经还原成二进制数据,你看到的以上数据肯定是乱码';
 $undesdata = $mydes->un_des($decode_data,$key);//对数据进行解密
 echo '解密后的数据是:' . $undesdata . '长度是:' . strlen($undesdata);
 echo '以上数据时解密后的数据:长度肯定是8的倍数,如果加密前的数据不是8的倍数,将在结尾追加不可预知的东西';
 $data =  trim($undesdata);
 echo '对数据进行trim处理得到的原始数据是: ' . $data . ' 长度为:' . strlen($data);

转载请注明:IT世界 » 图解DES加解密

您必须 登录 才能发表评论!