无能为力者的梦 2019-03-02 12:04 采纳率: 100%
浏览 1861
已采纳

关于PHP和JAVA之间的AES加密互通问题

公司今日接到一个需求,要与银行方面进行对接,接收银行方面 推送过来的加密信息,解密后入库进行统计,由于银行方是JAVA环境,我司是PHP环境,所以需要写一个PHP的解密方法,查阅各种文档后还是无法满足需求,无法进行解密,特来求助.

银行方只有一个加密流程文档:
加密方式:AES/ECB/PKCS5Padding

1、将data中的字段转成json格式如下:

{"userId":"12345678911111233","state":"2","cardNo":"625966","time":"20171212","extInfo":""}

2、URLEncode对josn字符串进行编码UTF-8防止中文乱码

    URLEncoder.encode(data, "UTF-8")

    %7B%22userId%22%3A%2212345678911111233%22%2C%22state%22%3A%222%22%2C%22cardNo%22%3A%22625966%22%2C%22time%22%3A%2220171212%22%2C%22extInfo%22%3A%22%22%7D

3、使用aesKey对URLEncode后的字符串进行AES加密, 得到data:

    aesKey=Spdbccc-testtest

    XBD5nXa7oAnsWo/l843zUfmuhpmWGKEieJoJXxZEHPun1zfQhEPBFKv5kXZMM8i2Vr9RJwZeW/zn6OScGSlRTNVaytu2M5CDABw6B1grqxCqjTu/fKTp3hpMJd0riMB7H7ZK5xGUBu2nGgacjPmVcVl8Xm34fdArx17DkHbHqOWgiwmesk0C/lgKK7hkyuiuVtEQPmc02Ipjx3JGyJ+59g==

我这边先是按照查询的文档中所说直接使用PHP自带的mcrypt扩展进行解密,发现php7.2已经弃用该扩展,换成openssl方式使用AES-128-ECB进行解密返回值是false;后来我转变思路,先用openssl以AES-128-ECB模式对第二步的串进行加密,获取到的结果和步骤三中的完全不一样,我改用先获取openssl的加密模式列表然后循环加密,输出各个加密方式的结果,发现没有一个能对上,到此以我的水平已经不知道该如何进行下一步了,特来求助!

  • 写回答

2条回答

  • 50css 2019-03-02 12:29
    关注

    可以试试下面这种AES加密解密方式看行不行

    class AES {
    
        /**
         *
         * @param string $string 需要加密的字符串
         * @param string $key 密钥
         * @return string
         */
        public static function encrypt($string, $key)
        {
    
            // openssl_encrypt 加密不同Mcrypt,对秘钥长度要求,超出16加密结果不变
            $data = openssl_encrypt($string, 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
    
            $data = strtolower(bin2hex($data));
    
            return $data;
        }
    
    
        /**
         * @param string $string 需要解密的字符串
         * @param string $key 密钥
         * @return string
         */
        public static function decrypt($string, $key)
        {
            $decrypted = openssl_decrypt(hex2bin($string), 'AES-128-ECB', $key, OPENSSL_RAW_DATA);
    
            return $decrypted;
        }
    }
    
    $sk = '0123456789abcdef';
    
    $str = '测试字符串123abc';
    $strEn = Aes::encrypt($str, $sk);//加密
    
    echo '<meta charset="UTF-8">';
    echo '加密后=' , $strEn , '<br>';
    
    $strDe =  Aes::decrypt($strEn, $sk);//解密
    echo '解密后=' , $strDe , '<br>';
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择