aLoNe IT Develop Studio

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

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

2018年5月10日 16520点热度 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篇
  • 小姿势 / 30篇
  • 运维管理 / 6篇
  • 随笔 / 4篇
标签聚合
反向代理 虚表 CentOS sqlite google debian Yum Orange Pi
最新 热点 随机
最新 热点 随机
Docker可用的镜像源 念 Github SSH 22端口连接超时解决办法 VSCode插件推荐 Docker内创建SQLServer服务 Cli模式下ThinkPHP框架Redis对象反序列化异常问题解决方案
实在太邪恶!照亮妹纸绝对领域与私处 解决PostMessage发送字符串造成数据错乱问题 Github SSH 22端口连接超时解决办法 Windows Server 2008 R2 负载平衡入门篇 我的座右铭 Windows平台分布式架构实践 - 负载均衡
友情连接
  • 李建伟博客
  • 不忘初心的简书
归档
  • 2024年6月 / 1篇
  • 2024年3月 / 1篇
  • 2024年1月 / 1篇
  • 2023年7月 / 3篇
  • 2023年6月 / 1篇
  • 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