兼容PHP和Java的des加密解密代码分享
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:关于加密技术,本站还提供了如下加密工具供大家参考使用:
MD5在线加密工具:http://tools.jb51.net/password/CreateMD5Password
Escape加密/解密工具:http://tools.jb51.net/password/escapepwd
在线SHA1加密工具:http://tools.jb51.net/password/sha1encode
短链(短网址)在线生成工具:http://tools.jb51.net/password/dwzcreate
短链(短网址)在线还原工具:http://tools.jb51.net/password/unshorturl
高强度密码生成器:http://tools.jb51.net/password/CreateStrongPassword