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


Posted in PHP onJune 26, 2014

php代码:

<?php
class 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"));
 }
}
PHP 相关文章推荐
PHP中实现图片的锐化
Oct 09 PHP
WML,Apache,和 PHP 的介绍
Oct 09 PHP
apache2.2.4+mysql5.0.77+php5.2.8安装精简
Apr 29 PHP
php 魔术函数使用说明
Feb 21 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
php生成gif动画的方法
Nov 05 PHP
记录一次排查PHP脚本执行卡住的问题
Dec 27 PHP
微信公众号实现会员卡领取功能
Jun 08 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 24 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 #PHP
ThinkPHP页面跳转success与error方法概述
Jun 25 #PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 #PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 #PHP
ThinkPHP多表联合查询的常用方法
Mar 24 #PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 #PHP
ThinkPHP查询中的魔术方法简述
Jun 25 #PHP
You might like
php桌面中心(一) 创建数据库
2007/03/11 PHP
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
jquery合并表格中相同文本的相邻单元格
2015/07/17 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
vue eslint简要配置教程详解
2019/07/26 Javascript
vuex入门最详细整理
2020/03/04 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
JavaScript常用8种数组去重代码实例
2020/09/09 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python中实现定制类的特殊方法总结
2014/09/28 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
幸福家庭事迹材料
2014/02/03 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
介绍信怎么写
2015/05/05 职场文书
晚会开场白和结束语
2015/05/29 职场文书
装修公司管理制度
2015/08/05 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python