aLoNe IT Develop Studio

  • 首页
  • IT前沿
  • Web技术
  • 小姿势
  • 运维管理
  • 随笔
欢迎来到aLoNe.Adams.K的个人博客
  1. 首页
  2. 小姿势
  3. 正文

AES中Java加密PHP解密的坑。。。

2018年5月10日 5321点热度 5人点赞 0条评论

今天需要对接一个java系统中的接口,对方使用了AES加密,根据对方描述基本可以确定对方用的是AES-ECB-128的加密方式,然后使用PKCS5的对齐方式。
我方需要使用openssl_decrypt进行解密,但是在这个过程中死活都无法进行解密。
最后用了一个很奇特的方式进行解密了。。。
先看下java的代码吧:

public static String encrypt(String content, String password) {
    try {
        String ENCRYPT_CHARSET = "UTF-8";
        Security.addProvider(new sun.security.provider.Sun());
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", new sun.security.provider.Sun());
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        secureRandom.setSeed(password.getBytes());
        kgen.init(128, secureRandom);
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
        Cipher cipher = Cipher.getInstance("AES"); // 创建密码器
        byte[] byteContent = content.getBytes(ENCRYPT_CHARSET);
        cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化
        byte[] result = cipher.doFinal(byteContent);
        if (result != null && result.length > 0) {
            /*
                * 注意:
                * return new String(result,ENCRYPT_CHARSET);
                * 会出现javax.crypto.IllegalBlockSizeException:
                * Input length must be multiple of 16 when decrypting with padded cipher
                * 加密后的byte数组是不能强制转换成字符串的,
                * 字符串和byte数组在这种情况下不是互逆的;
                * 需要将二进制数据转换成十六进制表示
                */
            return parseByte2HexStr(result);
        }
    } catch(NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch(NoSuchPaddingException e) {
        e.printStackTrace();
    } catch(InvalidKeyException e) {
        e.printStackTrace();
    } catch(UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch(IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch(BadPaddingException e) {
        e.printStackTrace();
    }
    return null;
}

以上可以看出,java使用了aes加密,然后将加密后的二进制数据转换成了十六进制字符串;
然后再看下我方的解密代码吧。。。

    userObj=JAVA_SECRETTEXT;userObj=hex2bin(userObj);appkey=substr(openssl_digest(openssl_digest(appkey, 'sha1', true), 'sha1', true), 0, 16);deData=openssl_decrypt(userObj, 'aes-128-ecb',appkey, OPENSSL_RAW_DATA , '');

这里注意一下$appkey这行的代码,对解密秘钥进行了2次openssl_digest计算,也就是2次的sha1信息摘要计算,然后再取前16位字符串,就可以正常解密了。。

简直无语。。。。

标签: 暂无
最后更新:2018年5月10日

aLoNe.Adams.K

一只胖菜鸟!

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章分类
  • IT前沿 / 3篇
  • Web技术 / 2篇
  • 小姿势 / 24篇
  • 运维管理 / 5篇
  • 随笔 / 3篇
标签聚合
反向代理 Yum CentOS google 虚表 sqlite Orange Pi debian
最新 热点 随机
最新 热点 随机
团队开发规范培训(代码管理篇) 团队开发规范培训(序) 忆 我的座右铭 DevilBox全程操作记录 香橙派Orange Pi Zero基于Debian进行反向代理配置
改写历史,永久删除git库的物理文件 Avalon2高德地图组件 实在太邪恶!照亮妹纸绝对领域与私处 delphi DSUtil.pas Undeclared identifier :'NULL' 关于Framaroot的PC端控制方法 ThinkPHP6中获取真实客户端IP需要注意的地方
友情连接
  • 李建伟博客
  • 不忘初心的简书
归档
  • 2022年12月 / 5篇
  • 2022年6月 / 1篇
  • 2022年2月 / 3篇
  • 2020年11月 / 1篇
  • 2018年12月 / 1篇
  • 2018年5月 / 1篇
  • 2018年3月 / 1篇
  • 2017年11月 / 1篇
  • 2017年8月 / 1篇
  • 2017年3月 / 2篇
  • 2017年1月 / 1篇
  • 2016年9月 / 16篇

COPYRIGHT © 2022 aLoNe IT Develop Studio. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19021656号-2