zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

JAVAPHP加密解密代码 分享 兼容 DES
2023-06-13 09:15:32 时间

php代码:

<?php
classDES
{
	var$key;
	var$iv;//偏移量

	functionDES($key,$iv=0)
	{
		$this->key=$key;
		if($iv==0)
		{
			$this->iv=$key;
		}
		else
		{
			$this->iv=$iv;
		}
	}

	//加密
	functionencrypt($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));//返回大写十六进制字符串
		returnbase64_encode($data);
	}

	//解密
	functiondecrypt($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;
	}

	functionhex2bin($hexData)
	{
		$binData="";
		for($i=0;$i<strlen($hexData);$i+=2)
		{
			$binData.=chr(hexdec(substr($hexData,$i,2)));
		}
		return$binData;
	}

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

	functionpkcs5Unpad($text)
	{
		$pad=ord($text{strlen($text)-1});
		if($pad>strlen($text))
			returnfalse;
		if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad)
			returnfalse;
		returnsubstr($text,0,-1*$pad);
	}
}
$str="abcd";
$key="asdfwef5";
$crypt=newDES($key);
$mstr=$crypt->encrypt($str);
$str=$crypt->decrypt($mstr);

echo$str."<=>".$mstr;

?>

java代码:

packagecom.test;

importit.sauronsoftware.base64.Base64;

importjava.security.Key;
importjava.security.SecureRandom;
importjava.security.spec.AlgorithmParameterSpec;

importjavax.crypto.Cipher;
importjavax.crypto.SecretKeyFactory;
importjavax.crypto.spec.DESKeySpec;
importjavax.crypto.spec.IvParameterSpec;

publicclassMain
{
publicstaticfinalStringALGORITHM_DES="DES/CBC/PKCS5Padding";
/**
*DES算法,加密
*
*@paramdata待加密字符串
*@paramkey加密私钥,长度不能够小于8位
*@return加密后的字节数组,一般结合Base64编码使用
*@throwsCryptException异常
*/
publicstaticStringencode(Stringkey,Stringdata)throwsException
{
returnencode(key,data.getBytes());
}
/**
*DES算法,加密
*
*@paramdata待加密字符串
*@paramkey加密私钥,长度不能够小于8位
*@return加密后的字节数组,一般结合Base64编码使用
*@throwsCryptException异常
*/
publicstaticStringencode(Stringkey,byte[]data)throwsException
{
try
{
		DESKeySpecdks=newDESKeySpec(key.getBytes());

		SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
KeysecretKey=keyFactory.generateSecret(dks);
Ciphercipher=Cipher.getInstance(ALGORITHM_DES);
IvParameterSpeciv=newIvParameterSpec(key.getBytes());
AlgorithmParameterSpecparamSpec=iv;
cipher.init(Cipher.ENCRYPT_MODE,secretKey,paramSpec);

byte[]bytes=cipher.doFinal(data);


//returnbyte2hex(bytes);
returnnewString(Base64.encode(bytes));
}catch(Exceptione)
{
thrownewException(e);
}
}

/**
*DES算法,解密
*
*@paramdata待解密字符串
*@paramkey解密私钥,长度不能够小于8位
*@return解密后的字节数组
*@throwsException异常
*/
publicstaticbyte[]decode(Stringkey,byte[]data)throwsException
{
try
{
	SecureRandomsr=newSecureRandom();
		DESKeySpecdks=newDESKeySpec(key.getBytes());
		SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
KeysecretKey=keyFactory.generateSecret(dks);
Ciphercipher=Cipher.getInstance(ALGORITHM_DES);
IvParameterSpeciv=newIvParameterSpec(key.getBytes());
AlgorithmParameterSpecparamSpec=iv;
cipher.init(Cipher.DECRYPT_MODE,secretKey,paramSpec);
returncipher.doFinal(data);
}catch(Exceptione)
{
thrownewException(e);
}
}

/**
*获取编码后的值
*@paramkey
*@paramdata
*@return
*@throwsException
*/
publicstaticStringdecodeValue(Stringkey,Stringdata)
{
	byte[]datas;
	Stringvalue=null;
		try{

			datas=decode(key,Base64.decode(data.getBytes()));

			value=newString(datas);
		}catch(Exceptione){
			value="";
		}
	returnvalue;
}

publicstaticvoidmain(String[]args)throwsException
{
	System.out.println("明:abcd;密:"+Main.encode("asdfwef5","abcd"));
}
}

PS:关于加密技术,本站还提供了如下加密工具供大家参考使用: