兼容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中PDO的错误处理
Sep 04 PHP
Admin generator, filters and I18n
Oct 06 PHP
PHP将整个网站生成HTML纯静态网页的方法总结
Feb 05 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP对文件进行加锁、解锁实例
Jan 23 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
zend framework中使用memcache的方法
Mar 04 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
使用adodb lite解决问题
2006/12/31 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
js中widow.open()方法使用详解
2013/07/30 Javascript
JSON序列化与解析原生JS方法且IE6和chrome测试通过
2013/09/05 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
详解Js中的模块化是如何实现的
2017/10/18 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
Vue组件生命周期运行原理解析
2020/11/25 Vue.js
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
python 字典套字典或列表的示例
2019/12/16 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
工商企业管理实习自我鉴定
2013/12/04 职场文书
校园文明标语
2014/06/13 职场文书
奉献家乡演讲稿
2014/09/13 职场文书
学校通报表扬范文
2015/05/04 职场文书
预备党员表决心的话
2015/09/22 职场文书
五年级作文之成长
2019/09/16 职场文书