兼容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