兼容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连接access数据库
Mar 27 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
php发送post请求函数分享
Mar 06 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
分享一个Laravel好用的Cache宏
Mar 02 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
浅谈php fopen下载远程文件的函数
Nov 18 PHP
php简单计算年龄的方法(周岁与虚岁)
Dec 06 PHP
详解yii2使用多个数据库的案例
Jun 16 PHP
详解php实现页面静态化原理
Jun 21 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开发大型项目的一点经验
2006/10/09 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
php操作memcache缓存方法分享
2015/06/03 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
jquery插件pagination实现无刷新ajax分页
2015/09/30 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
vue router demo详解
2017/10/13 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
Django数据库表反向生成实例解析
2018/02/06 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
python statsmodel的使用
2020/12/21 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
策划创业计划书
2014/02/06 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
团结演讲稿范文
2014/05/23 职场文书
明星员工获奖感言
2014/08/14 职场文书
党委班子对照检查材料
2014/08/19 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers