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

关于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条回答 默认 最新

  • ycyuyuan
    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>';
    
    点赞 评论
  • ldTrueLove
    林子懿 2019-03-04 11:32

    他们可能使用的是对称加密,用的是二进制,你这个的问他们的技术 如何实现的,看一下Java的代码

    点赞 评论

相关推荐