兼容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 相关文章推荐
15种PHP Encoder的比较
Mar 06 PHP
PHP实现采集程序原理和简单示例代码
Mar 18 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
Jun 20 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
Codeigniter的一些优秀特性总结
Jan 21 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php生成短域名函数
Mar 23 PHP
PHP命令行与定时任务
Apr 01 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
德生PL330的评价与改造
2021/03/02 无线电
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
两款万能的php分页类
2015/11/12 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
List Installed Software Features
2007/06/11 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
jQuery中:file选择器用法实例
2015/01/04 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
[01:15:56]2018DOTA2亚洲邀请赛3月30日 小组赛A组 TNC VS Newbee
2018/03/31 DOTA
详解Python爬虫的基本写法
2016/01/08 Python
Python3中使用PyMongo的方法详解
2017/07/28 Python
Django在win10下的安装并创建工程
2017/11/20 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
python实现日常记账本小程序
2018/03/10 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
Django框架实现分页显示内容的方法详解
2019/05/10 Python
Python中常见的数制转换有哪些
2020/05/27 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
C#基础面试题
2016/10/17 面试题
人事专员岗位职责
2013/11/20 职场文书
聚美优品陈欧广告词
2014/03/14 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
老员工辞职信范文
2015/05/12 职场文书
培根随笔读书笔记
2015/07/01 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python