首页 > 开发 > PHP > 正文

兼容PHP和Java的des加密解密代码分享

2024-05-04 22:20:13
字体:
来源:转载
供稿:网友

php代码:

<?phpclass DES{	var $key;	var $iv; //偏移量 	function DES($key, $iv=0)	{		$this->key = $key;		if($iv == 0)		{			$this->iv = $key;		}		else 		{			$this->iv = $iv;		}	} 	//加密	function encrypt($str)	{				$size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );		$str = $this->pkcs5Pad ( $str, $size ); 		$data=mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv);		//$data=strtoupper(bin2hex($data)); //返回大写十六进制字符串		return base64_encode($data);	} 	//解密	function decrypt($str)	{		$str = base64_decode ($str);		//$strBin = $this->hex2bin( strtolower($str));		$str = mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_DECRYPT, $this->iv );		$str = $this->pkcs5Unpad( $str );		return $str;	} 	function hex2bin($hexData)	{		$binData = "";		for($i = 0; $i < strlen ( $hexData ); $i += 2)		{			$binData .= chr(hexdec(substr($hexData, $i, 2)));		}		return $binData;	} 	function pkcs5Pad($text, $blocksize)	{		$pad = $blocksize - (strlen ( $text ) % $blocksize);		return $text . str_repeat ( chr ( $pad ), $pad );	} 	function pkcs5Unpad($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 );	}}$str = 'abcd';$key= 'asdfwef5';$crypt = new DES($key);$mstr = $crypt->encrypt($str);$str = $crypt->decrypt($mstr); echo $str.' <=> '.$mstr; ?>

java代码:

package com.test; import it.sauronsoftware.base64.Base64; import java.security.Key;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec; public class Main{ public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding"; /**  * DES算法,加密  *  * @param data 待加密字符串  * @param key 加密私钥,长度不能够小于8位  * @return 加密后的字节数组,一般结合Base64编码使用  * @throws CryptException 异常  */ public static String encode(String key,String data) throws Exception {  return encode(key, data.getBytes()); } /**  * DES算法,加密  *  * @param data 待加密字符串  * @param key 加密私钥,长度不能够小于8位  * @return 加密后的字节数组,一般结合Base64编码使用  * @throws CryptException 异常  */ public static String encode(String key,byte[] data) throws Exception {  try  {	 	DESKeySpec dks = new DESKeySpec(key.getBytes()); 	 	SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   //key的长度不能够小于8位字节   Key secretKey = keyFactory.generateSecret(dks);   Cipher cipher = Cipher.getInstance(ALGORITHM_DES);   IvParameterSpec iv = new IvParameterSpec(key.getBytes());   AlgorithmParameterSpec paramSpec = iv;   cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);    byte[] bytes = cipher.doFinal(data);  //   return byte2hex(bytes);   return new String(Base64.encode(bytes));  } catch (Exception e)  {   throw new Exception(e);  } }  /**  * DES算法,解密  *  * @param data 待解密字符串  * @param key 解密私钥,长度不能够小于8位  * @return 解密后的字节数组  * @throws Exception 异常  */ public static byte[] decode(String key,byte[] data) throws Exception {  try  {  	SecureRandom sr = new SecureRandom();	 	DESKeySpec dks = new DESKeySpec(key.getBytes());	 	SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");   //key的长度不能够小于8位字节   Key secretKey = keyFactory.generateSecret(dks);   Cipher cipher = Cipher.getInstance(ALGORITHM_DES);   IvParameterSpec iv = new IvParameterSpec(key.getBytes());   AlgorithmParameterSpec paramSpec = iv;   cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);   return cipher.doFinal(data);  } catch (Exception e)  {   throw new Exception(e);  } }  /**  * 获取编码后的值  * @param key  * @param data  * @return  * @throws Exception  */ public static String decodeValue(String key,String data)  { 	byte[] datas; 	String value = null;		try { 	 		datas = decode(key, Base64.decode(data.getBytes())); 			value = new String(datas);		} catch (Exception e) {			value = "";		} 	return value; }  public static void main(String[] args) throws Exception { 	System.out.println("明:abcd ;密:" + Main.encode("asdfwef5","abcd")); }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表