资讯专栏INFORMATION COLUMN

PHP DES-ECB加密对接Java解密

jsliang / 2248人阅读

摘要:最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个的,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的工程师对接出来的,在这里记录一下大致的流程。

最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个java的demo,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的Android工程师对接出来的,在这里记录一下大致的流程。
首先说明一下对方要求的接口请求方式,格式为:http://ip:port/interface/method?data=摘要@@16进制字符串
说明:

1. 请求参数需要组合成a=1&b=2&c=3格式的参数串;
2. 摘要的生成方法为md5("a=1&b=2&c=3");
3. 16进制字符串的生成方法是将参数串进行**对称加密(DES-ECB)**后再转成16进制字符串(bin2hex函数);

对方提供的demo(java版本)如下:

public class DesUtils {

    /** 默认密钥 */
    private static String strDefaultKey = "seeyonssokey";

    /** 加密工具 */
    private Cipher encryptCipher;

    /** 解密工具 */
    private Cipher decryptCipher;

    /**
     * 加密字符串
     * @param strIn 需加密的字符串
     * @return 加密后的字符串
     * @throws Exception
     */
    public String encrypt(String strIn) throws Exception {
        return byteArr2HexStr(encryptCipher.doFinal(strIn.getBytes()));
    }

    /**
     * 解密字符串
     * @param strIn 需解密的字符串
     * @return 解密后的字符串
     * @throws Exception
     */
    public String decrypt(String strIn) throws Exception {
        return new String(decryptCipher.doFinal(hexStr2ByteArr(strIn)));
    }

    /**
     * 将 byte 数组转换为表示 16 进制值的字符串, 如: byte[]{8,18} 转换为: 0813 , 和 public static
     * byte[] hexStr2ByteArr(String strIn) 互为可逆的转换过程
     * @param arrB 需要转换的 byte 数组
     * @return 转换后的字符串
     * @throws Exception 本方法不处理任何异常,所有异常全部抛出
     */
    public static String byteArr2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for(int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把负数转换为正数
            while(intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的数需要在前面补0
            if(intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    /**
     * 将 表 示 16 进 制 值 的 字 符 串 转 换 为 byte 数 组 , 和 public static String
     * byteArr2HexStr(byte[] arrB) 互为可逆的转换过程
     * @param strIn 需要转换的字符串
     * @return 转换后的 byte 数组
     * @throws Exception 本方法不处理任何异常,所有异常全部抛出
     * @author LiGuoQing
     */
    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;
        // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2
        byte[] arrOut = new byte[iLen / 2];
        for(int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte)Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    /**
     * 从指定字符串生成密钥,密钥所需的字节数组长度为 8 位 不足 8 位时后面补 0 , 超出 8 位只取前 8 位
     * @param arrBTmp 构成该字符串的字节数组
     * @return 生成的密钥
     * @throws java.lang.Exception
     */
    private static Key getKey(byte[] arrBTmp) throws Exception {
        // 创建一个空的8位字节数组(默认值为0)
        byte[] arrB = new byte[8];
        // 将原始字节数组转换为8位
        for(int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }
        // 生成密钥
        Key key = new SecretKeySpec(arrB, "DES");
        return key;
    }

    public static String encrypt(String strIn, String secretkey) throws Exception {
        Key key = getKey(secretkey.getBytes("utf-8"));
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return byteArr2HexStr(cipher.doFinal(strIn.getBytes("utf-8")));
    }

    public static String decrypt(String strIn, String secretkey) throws Exception {
        Key key = getKey(secretkey.getBytes("utf-8"));
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] param = cipher.doFinal(hexStr2ByteArr(strIn));
        return new String(param, "utf-8");
    }
}

PHP实现加密功能的的方法有两种:

mcrypt方式(适用于php7.0以前的版本):


输出为:990389f0aad8d12014ca6a45cd72cdf7

openssl方式(适用于php7.0以后的版本):


输出为:990389f0aad8d12014ca6a45cd72cdf7

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71989.html

相关文章

  • PHP DES-ECB加密对接Java解密

    摘要:最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个的,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的工程师对接出来的,在这里记录一下大致的流程。 最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个java的demo,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的Android工程师对接出来的,在这里记录一下...

    maybe_009 评论0 收藏0
  • php如何openssl_encrypt加密解密

    摘要:密钥长度是位,超过位数密钥被忽略。跨语言做加密解密经常会出现问题,往往是填充方式不对编码不一致或者加密解密模式没有对应上造成。是为了兼容用加密的结果。 最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了百度和谷歌两个老师后,结合了多篇文档内容后,终于实现了。 一、DES介绍 DES 是对称性加密里面常见一种,全称为 Data Enc...

    JouyPub 评论0 收藏0
  • PHP的openssl加密扩展使用小结

    摘要:非对称加密与对称加密相对的是非对称加密,非对称加密的核心思想是使用一对相对的密匙,分为公匙和私匙,私匙自己安全保存,而将公匙公开。 引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性(没有被人修改过)、数据私密性(密文,无法直接读取)等。虽然现在已经有SSL/TLS协议实现的HTTPS协议,但是因在客户...

    dockerclub 评论0 收藏0
  • PHP AES cbc模式 pkcs7 128加密解密

    摘要:今天在对接一个第三方接口的时候,对方需要模式下的加密。这里简单写一个获取库存,更新价格信息加密结果解密结果加密数据解密数据执行方法加密结果解密结果 今天在对接一个第三方接口的时候,对方需要AES CBC模式下的加密。这里简单写一个demo class Model_Junjingbao extends Model { private static $_partnerKey...

    Jaden 评论0 收藏0
  • 基于 lumen 的微服务架构实践

    摘要:现在的提供了一种更易于使用和维护的计划任务方式。注意事项建议开启这样会极大的加速类的加载。 lumen 为速度而生的 Laravel 框架 官网的介绍很简洁,而且 lumen 确实也很简单,我在调研了 lumen 相关组件(比如缓存,队列,校验,路由,中间件和最重要的容器)之后认为已经能够满足我目前这个微服务的需求了。 任务目标 showImg(https://segmentfault...

    hatlonely 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<