携程供应商接口数据解密PHP方法AES/CBC/PKCS5Padding

swingcoder · · 120 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

    function aes128_cbc_encrypt($key, $data, $iv) {
        if(16 !== strlen($key)) $key = hash('MD5', $key, true);
        if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
        $padding = 16 - (strlen($data) % 16);
        $data .= str_repeat(chr($padding), $padding);
        return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
    }

    function aes128_cbc_decrypt($key, $data, $iv) {
        if(16 !== strlen($key)) $key = hash('MD5', $key, true);
        if(16 !== strlen($iv)) $iv = hash('MD5', $iv, true);
        $data = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
        $padding = ord($data[strlen($data) - 1]);
        return substr($data, 0, -$padding);
    }

    function decode_bytes($text){
        $bytes=array();
        for($i=0;$i<strlen($text);$i+=2){
            $char=$text[$i];
            $bytes[$i/2]=chr((ord($char)-ord('a'))<<4);
            $char=$text[$i+1];
            $bytes[$i/2]=chr(ord($bytes[$i/2])+(ord($char)-ord('a')));
        }

        return join('',$bytes);
    }


    function test(){
        $key='';
        $vt='';
        $encrypted='jojihabbaogpamnnggmlkpflpmogmlclkeoglcikapgpbconldjjmlfjapfblhnobglgakiehkcgfnnmbojfpgmbcnfbjlcfjpjgcgjoanihcaiiafggfgnnjflfccgj';
        $foo = $this->aes128_cbc_decrypt($key,$this->decode_bytes($encrypted),$vt);
        pr($foo);
        
    }

PKCS5Padding与PKCS7Padding当数据块大小是8时是一样的效果,事实上PKCS5Padding不能直接用户在AES上,因为AES要求的数据块至少是16字节以上。所以PKCS5Padding实际上是PKCS7Padding的别名来用。

Credit https://gist.github.com/RiANOl/1077723

本文来自:开源中国博客

感谢作者:swingcoder

查看原文:携程供应商接口数据解密PHP方法AES/CBC/PKCS5Padding

120 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet