最近在做项目中,遇到des加密解密的问题。

场景是安卓app端用des加密,php这边需要解密。之前没有接触过des这种加密解密算法,但想着肯定会有demo。因此百度,搜了代码来用。网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了。为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密。结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来。

要来java的des算法代码,研究加密的过程,其中各种调试测试,外加各种百度,必应。发现能够正确解密的规则,其中非常重要的三点就是,加密解密过程,双方的key、加密模式(例如ECB、CBC等),以及iv(有些地方叫它偏移量,有些地方叫它向量,没有深入研究)需要一致。需要着重说明的是这个iv,在ECB加密模式(java默认的加密模式)时,是不需要这个iv的,即使写了,也不会影响加密的结果;而当加密模式为CBC时,则需要iv这个参数,否则会随机生成该参数,这样每次加密的结果会变。而关键在于,java端定义了iv,那么php这边也需要跟java端保持一致,这样才能够正确解密出来。

后面就胶着在这个iv上面。查看java端代码,iv是一个byte[],即字节数组,想都没有想就去网上找php将字符串转化为byte[]类型的,也试过强制转换,解密失败。最后才想起来去看php的数据类型,呃呃呃,压根就没有type类型的。真是基础不牢,又想当然,觉得java有该数据类型,php也会有。。。惯性思维真的害人啊。这怎么办呢?既需要byte[]去解密,又没有该数据数据类型,已经感觉无解了。

通常这个时候,需要休息,休息一会儿。后面突然念头闪过,php中有函数可以des解密,该函数肯定不会用php没有的数据类型去解密,所以我试着将java加密中转换成byte[]类型前的字符串作为php的iv,测试,终于解密成功。

附上java端加密代码,采用CBC模式:

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec; public class DES { //加密数据入口
public static String encryptString(String message, String key)
throws Exception {
byte[] bytes = encrypt(message, key);
return toHexString(bytes).toUpperCase();
}   public static byte[] encrypt(String message, String key) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); return cipher.doFinal(message.getBytes("UTF-8"));
}
}

附上对应的php端解密代码:

class DES
{
public static function decrypt($str, $key)
{
$midstr = hex2bin(strtolower($str));
     //第二个参数$key就是三个重点中的$key,而最后一个参数$key是iv,只是java加密时采用了与第二个参数相同的字符串,根据具体情况来定就好
     $str = mcrypt_decrypt(MCRYPT_DES, $key, $midstr, MCRYPT_MODE_CBC, $key);
     $pad = ord($str[($len = strlen($str)) - 1]);
     return substr($str, 0, strlen($str) - $pad);
  }
}

其中hex2bin是将十六进制转换成二进制,php自带该函数,不需要再另行定义(网上看到很多该函数的代码)。解密可以看作是加密的逆操作,所以java端将加密后字符串转成十六进制,并大写,解密时自然需要转换回来。

可以看看下面这个链接,写得不错:

http://zhidao.baidu.com/link?url=vKbwbKxibbLc8K7oo40cJ17aYz2i2MdfZlaytdj6GLsqBwrPoc_OwHhsi7IjdaFId9fZb52SkhdDBG_U502CKNyCQDPE3ZSKr-adXB46CEO

des加密解密——java加密,php解密的更多相关文章

  1. 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码

    JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...

  2. Aes 加密解密 java加密解密

    使用AES加密解密代码详解 首先,如果是使用nodejs + vue 写的前端, 那么你需要npm 加载一个js文件 npm i crypto-js --save --save-exact npm i ...

  3. JS客户端RSA加密,Java服务端解密

    常用语网页客户端对密码加密,在后端java解密还原 java代码依赖    <dependency>      <groupId>commons-codec</group ...

  4. php RSA 加密 与java加密互交,java解密

    <? php class encrypt{ var $pub_key; function redPukey() { $pubKey = "MIIDhzCCAm+gAwIBAgIGASY ...

  5. encryptjs 加密 前端数据(vue 使用 RSA加密、java 后端 RSA解密)

    1.index.html引入 <script src="./static/js/jsencrypt.min.js"></script> 或者 npm i j ...

  6. coding++:MD5加密(JAVA加密 与 JS加密不一致问题)

    要求:根据指定 字符加密   JS中的加密方法 要和 JAVA中的算法保持一致,解决如下: var rotateLeft = function (lValue, iShiftBits) { retur ...

  7. 使用C# DES解密java DES加密的字符串

    转自 microAllen   最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解 ...

  8. 用 Java 解密 C# 加密的数据(DES)(转)

    今天遇到java解密url的问题.我们的系统要获取外部传过来的URL,URL是采用 DES 算法对消息进行加密,再用 BASE64 编码.不过对方系统是用 C# 写的. 在网上搜了几篇文章终于找到一篇 ...

  9. Java加密和C#解密=>DES方法

    Java加密代码: import javax.crypto.*; import javax.crypto.*; import java.io.UnsupportedEncodingException; ...

随机推荐

  1. iOS开发 GET、POST请求方法(NSURLSession篇)

    NSURLConnection,在iOS9被宣布弃用,本文不使用NSURLConnection进行网络编程,有兴趣的童鞋可以参考: [iOS开发 GET.POST请求方法(NSURLConnectio ...

  2. Asp.net Core基于MVC框架实现PostgreSQL操作

    简单介绍 Asp.net Core最大的价值在于跨平台.跨平台.跨平台.重要的事情说三遍.但是目前毕竟是在开发初期,虽然推出了1.0.0 正式版,但是其实好多功能还没有完善.比方说编译时的一些文件编码 ...

  3. 虚拟机下linux安装mysql,apache和php

    由于腿伤了,卧床在家折腾下linux,尝试用虚拟机装mysql,apche和php.中间各种波折,装了好几天,觉得有些经验还是要记录下来,让自己别忘了:) 按照下面这篇文章的方法,基本可以顺利安装成功 ...

  4. 【MySQL】 GTID使用

    参考:http://hcymysql.blog.51cto.com/5223301/1579197 参考:http://blog.itpub.net/29733787/viewspace-146255 ...

  5. JVM内存模型与性能调优

    堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...

  6. 细说 webpack 之流程篇

    摘自: http://taobaofed.org/blog/2016/09/09/webpack-flow/ 引言 目前,几乎所有业务的开发构建都会用到 webpack .的确,作为模块加载和打包神器 ...

  7. java闭包

    闭包就是在一个外部类A中声明了一个内部类B,然后这个内部类可以访问他自己B的作用域和外部类A的作用域.然后现在用另外一个类C创建了一个内部类B,那么这个内部类B可以访问C的作用域. 如果没有闭包,那B ...

  8. WeedFS依赖库 0.6.1

    WeedFS依赖库 版本 0.6.1 =======================================================================glog====== ...

  9. Redis配置文件参数说明

    Redis配置文件参数说明   1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis ...

  10. 【转】Selenium 面试题总结(乙醇Blog记录的面试题)

    原文链接:http://www.cnblogs.com/tsbc/p/4922368.html ###selenium中如何判断元素是否存在? - isElementPresent   ###sele ...