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

[ PHP ] mcrypt_encrypt 和 openssl_encrypt 加密结果不一致

  •  
  •   captain7 · 2018-05-20 16:10:39 +08:00 · 3393 次点击
    这是一个创建于 2388 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在对接 api,给到的文档代码示例用了 mcrypt_encrypt,但我本机环境是 php7.2,因为 mcrypt_encrypt 在 7.1 后被废除了,那么我尝试这样进行替换:

    mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $json, MCRYPT_MODE_CBC, $iv); 替换成 openssl_encrypt($json, "aes-128-cbc", $privateKey, OPENSSL_RAW_DATA, $iv);

    最后得出的加密结果不一致。 google 一番发现是 pkcs5 和 pkcs7 的区别造成的,openssl_encrypt 默认使用了 pkcs7 填充。

    因为对加密知识一无所知,到了这里无法下手了,请高手解疑: 如何才能顺利获得一致的加密结果,并且解密的时候需要注意什么?

    (不太会排版,逃)

    8 条回复    2018-05-21 09:52:47 +08:00
    lslqtz
        1
    lslqtz  
       2018-05-20 18:01:41 +08:00
    lslqtz
        2
    lslqtz  
       2018-05-20 18:02:14 +08:00   ❤️ 1
    可能可供参考。。。
    sgq1128
        3
    sgq1128  
       2018-05-20 21:50:03 +08:00 via Android   ❤️ 2
    https://www.health666.club/2018/04/12/PHP%E4%B8%80%E4%BA%9B%E5%8A%A0%E8%A7%A3%E5%AF%86DEMO/ 有个 des pkcs5 的
    Seanfuck
        4
    Seanfuck  
       2018-05-21 09:13:09 +08:00   ❤️ 1
    我记得方法参数不是这样对应的,试试 aes-128-cbc*
    openssl_get_cipher_methods 可以列出来
    hhacker
        5
    hhacker  
       2018-05-21 09:23:44 +08:00   ❤️ 2
    ```php
    function aes_encrypt($val,$key)
    {
    $pad_value = 16-(strlen($val) % 16);
    $val = str_pad($val, (16*(floor(strlen($val) / 16)+1)), chr($pad_value));

    if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    return openssl_encrypt($val, 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);
    }else{
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $val, MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM));
    }
    }

    function aes_decrypt($val,$key)
    {
    if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    $decode = openssl_decrypt($val, 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);
    $len = strlen($decode);
    return substr($decode, 0, $len - ord($decode[$len-1]));
    }else{
    $decode = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $val, MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB), MCRYPT_DEV_URANDOM));
    return $decode;
    }
    }
    ```
    captain7
        6
    captain7  
    OP
       2018-05-21 09:43:31 +08:00
    captain7
        7
    captain7  
    OP
       2018-05-21 09:51:41 +08:00
    captain7
        8
    captain7  
    OP
       2018-05-21 09:52:47 +08:00
    感谢大佬们提供了参考资料,大开眼界,尚在尝试解决,有结果再回来终结此贴
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:39 · PVG 21:39 · LAX 05:39 · JFK 08:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.