兼容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基础学习笔记
Mar 18 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
Apache服务器无法使用的解决方法
May 08 PHP
php多层数组与对象的转换实例代码
Aug 05 PHP
php中socket通信机制实例详解
Jan 03 PHP
PHP简单获取及判断提交来源的方法
Apr 22 PHP
PHP 将dataurl转成图片image方法总结
Oct 14 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
解决laravel中日志权限莫名变成了root的问题
Oct 17 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 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
php防盗链的常用方法小结
2010/07/02 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP插入排序实现代码
2013/04/04 PHP
php实现监听事件
2013/11/06 PHP
一个不易被发现的PHP后门代码解析
2014/07/05 PHP
Thinkphp和onethink实现微信支付插件
2016/04/13 PHP
制作特殊字的脚本
2006/06/26 Javascript
JavaScript 字符串乘法
2009/08/20 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
javascript实现的闭包简单实例
2015/07/17 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
javascript编程实现栈的方法详解【经典数据结构】
2017/04/11 Javascript
JS表单提交验证、input(type=number) 去三角 刷新验证码
2017/06/21 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python实现两个list对应元素相减操作示例
2017/06/09 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
python代码区分大小写吗
2020/06/17 Python
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
怎样自定义一个异常类
2016/09/27 面试题
大学毕业生个人自荐信范文
2014/01/08 职场文书
中文师范生自荐信
2014/01/30 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
Python机器学习之PCA降维算法详解
2021/05/19 Python
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
python中if和elif的区别介绍
2021/11/07 Python
gojs实现蚂蚁线动画效果
2022/02/18 Javascript