V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjwshisb
V2EX  ›  PHP

关于 PHP 和 Java 的加密解密问题,困扰一天了

  •  
  •   zjwshisb · 2020-09-10 16:12:47 +08:00 · 1621 次点击
    这是一个创建于 1533 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要对接的接口是 java 写的,其中加密的代码是

    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_PKCS5);
    byte[] raw = sKey.getBytes();
    SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
    IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
    byte[] encrypted = cipher.doFinal(sSrc.getBytes(CHARSET_ENCODING));
    rtnStr = Base64.encodeBase64String(encrypted);
    

    其中
    key:999c09e1ba2e4dccb44aaf8d;
    iv:c4881489376b4d12;
    加密方式:AES/CBC/PKCS5Padding
    加密后的密文是:odnPsVDQN6vBY5JZGwRFkTfmvfJ9tXjRwpu7IFL+YrgHJH7ctSXfjSQO36KZAuVpLqEB9X9fLIZauCjyUXrsUIYBX5KJmH/kksSU+us+bv+6RzrWmJmUJBiUnBBuBFbWPOHl4if54x0N3qwAZCp3vYDiQzAFSSQKSQ+Pz/gZRd/YdLxhMsPAQyv4VWDbNrk+9L1EtDOzgUfgDWxoK4ajjA==
    用 Php 怎么才可以加密解密出同样的数据?弄了一天还没找到可以解决的方法

    第 1 条附言  ·  2020-09-10 17:55:10 +08:00
    已经解开了,openssl_decrypt(base64_decode($input),'aes-192-cbc',1,$iv);
    之前看网上都说是 aes-128-cbc,根本就不行,中间的数字根据 key 的长度来, 192 = 8 * strlen($key)
    还是找到一个 composer 包里面有相关的同样的加密才解决的
    14 条回复    2020-09-11 11:42:26 +08:00
    zgcwkj
        1
    zgcwkj  
       2020-09-10 16:19:57 +08:00
    我不管啥语言,方法都是转成十六进制的文本进行传输,可以避免转码问题。希望能帮到你!
    ben1024
        2
    ben1024  
       2020-09-10 16:24:27 +08:00
    最简单的方案协调对方提供接口
    lyz1990
        3
    lyz1990  
       2020-09-10 16:40:59 +08:00
    好歹给个原文
    lyz1990
        4
    lyz1990  
       2020-09-10 16:41:39 +08:00
    key 就是原文嘛?
    wangritian
        5
    wangritian  
       2020-09-10 16:45:15 +08:00
    openssl_decrypt('odnPsVDQN6vBY5JZGwRFkTfmvfJ9tXjRwpu7IFL+YrgHJH7ctSXfjSQO36KZAuVpLqEB9X9fLIZauCjyUXrsUIYBX5KJmH/kksSU+us+bv+6RzrWmJmUJBiUnBBuBFbWPOHl4if54x0N3qwAZCp3vYDiQzAFSSQKSQ+Pz/gZRd/YdLxhMsPAQyv4VWDbNrk+9L1EtDOzgUfgDWxoK4ajjA==', 'AES-128-CBC', '999c09e1ba2e4dccb44aaf8d', 2, 'c4881489376b4d12')
    有结果,不知道对不对
    nicevar
        6
    nicevar  
       2020-09-10 16:55:41 +08:00
    这个 java 、php 、js 我以前都做过,网上那些文章基本上就是坑,很多都是自己都没理解瞎写一通的,最好的办法就是你跟一下 java 代码,看一下内存数据,然后 php 同样跟一下,就好处理了,一般 php 问题就出在方式如 DES-EDE3-CBC 选择,还有调用 openssl_encrypt 之前的 padding 填充,再就是输出的格式,仔细一点一定能解决的
    chihiro2014
        7
    chihiro2014  
       2020-09-10 16:59:59 +08:00
    之前遇到过,js 和 java 后台加密转换这方面的问题,可以去 git 上搜搜对应的实现
    radiocontroller
        8
    radiocontroller  
       2020-09-10 17:05:38 +08:00
    楼主 id 有点东西
    aeo13
        9
    aeo13  
       2020-09-10 17:15:21 +08:00
    之前做过类似的,加密方式也是 AES/CBC/PKCS5Padding,你试试看我的方法

    private $iv = "1234567890123456";//密钥偏移量 IV,可自定义
    private $encryptKey = "mtz44tvgegjl9mjy";//AESkey,可自定义

    //加密
    public function encrypt($encryptStr) {
    $localIV = $this->iv;
    $encryptKey = $this->encryptKey;

    //Open module
    $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);

    //print "module = $module <br/>" ;

    mcrypt_generic_init($module, $encryptKey, $localIV);

    //Padding
    $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $pad = $block - (strlen($encryptStr) % $block); //Compute how many characters need to pad
    $encryptStr .= str_repeat(chr($pad), $pad); // After pad, the str length must be equal to block or its integer multiples

    //encrypt
    $encrypted = mcrypt_generic($module, $encryptStr);

    //Close
    mcrypt_generic_deinit($module);
    mcrypt_module_close($module);

    return base64_encode($encrypted);

    }
    cbasil
        10
    cbasil  
       2020-09-10 17:35:41 +08:00
    php 用 openssl 解密就可以了。
    openssl_decrypt(base64_decode($input),'AES-128-ECB',1,$iv);
    问一下对方 CIPHER_ALGORITHM_PKCS5 对应的字符串是哪个?检查一下加密方式是不是 AES/CBC/PKCS5Padding,key 准不准确
    lxk11153
        11
    lxk11153  
       2020-09-10 17:44:19 +08:00
    已解开, call d3gvcXE6IDQ0M+WWnTnkups3NDE1OQ== (8ase64)
    zjwshisb
        12
    zjwshisb  
    OP
       2020-09-10 17:54:14 +08:00
    已经解开了,openssl_decrypt(base64_decode($input),'aes-192-cbc',1,$iv);
    之前看网上都说是 aes-128-cbc,根本就不行,中间的数字根据 key 的长度来, 192 = 8 * strlen($key)
    还是找到一个 composer 包里面有相关的同样的加密才解决的
    zpfhbyx
        13
    zpfhbyx  
       2020-09-10 18:04:50 +08:00 via iPhone
    @zjwshisb 我记得是填充的问题。5 对应的是 0
    gz911122
        14
    gz911122  
       2020-09-11 11:42:26 +08:00
    @zgcwkj 什么乱七八糟的...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5331 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.