兼容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中的时间显示
Jan 18 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP扩展模块memcached长连接使用方法分析
Dec 24 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
PHP使用递归方式列出当前目录下所有文件的方法
Jun 02 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
php接口实现拖拽排序功能
Apr 23 PHP
PHP实现文字写入图片功能
Feb 18 PHP
如何让PHP编码更加好看利于阅读
May 12 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
简单的页面缓冲技术
2006/10/09 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
2011/12/05 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
2015/01/26 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
php精度计算的问题解析
2019/06/21 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
JavaScript 继承的实现
2009/07/09 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
jQuery创建DOM元素实例解析
2015/01/19 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
js密码强度校验
2015/11/10 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python3远程监控程序的实现方法
2019/07/15 Python
python字符串的index和find的区别详解
2020/06/20 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
Python requests接口测试实现代码
2020/09/08 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
华为智利官方商店:Huawei Chile
2020/05/09 全球购物
饲料采购员岗位职责
2013/12/19 职场文书
2015年市场部工作总结
2015/04/30 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
MySQL去除密码登录告警的方法
2022/04/20 MySQL