<?php

namespace xmvc\test;

use xmvc\MVC;
use xmvc\Encoder;

/**
 * 加解密/编码测试
 */
class EncoderTest
{
    /** md5 的 63 进制, 比md5短 20个字符长度左右
     * - 适用于一些有大量的键的场景可以节省内存与数据库空间，以及比较速度
     */
    public function md6()
    {
        $hash = md6('12345');
        return R($hash);
    }

    /** 密码 BCRYPT 算法, 固定 60 字符长度 */
    public function password()
    {
        $hash = Encoder::password('123456');

        //验证
        $state = false;
        if (password_verify('123456', $hash)) {
            $state = true;
        }
        return R([$hash, $state]);
    }

    /**
     * 可以安全用于网址传参的 bse64 变种
     * - GET, POST, php://input 可以直接传对应类型的编码过来
     * - MVC 会自动解码, 无需手动
     */
    public function base64()
    {
        // 字符串
        //$hash = Encoder::encode('123456');
        //$data = Encoder::cdcode($hash);

        // 数组
        $arr = [1, 2, 3, 4, 5, 6];
        $hash = Encoder::encodeForArray($arr);
        $data = Encoder::decodeForArray($hash);

        // 对象
        $obj = new \stdClass();
        $obj->name = 'name1';
        $obj->sex = '男';
        $hash = Encoder::encodeForObject($obj);
        $data = Encoder::decodeForObject($hash);

        return R([$hash, $data]);
    }

    /**
     * 加解密 AES-128-ECB
     */
    public function cryptRAW()
    {
        //加密
        $encryptData = Encoder::encryptRAW('123456');

        //解密
        $data = Encoder::decryptRAW($encryptData);

        // $encryptData 是 RAW 字符串, 转不了json 用 dump(输出结果)
        dump($encryptData);
        dd($data);
    }

    /**
     * 加解密返回base64字符串 AES-128-ECB
     */
    public function crypt()
    {
        //加密
        $encryptData = Encoder::encrypt('123456');

        //解密
        $data = Encoder::decrypt($encryptData);

        return R([$encryptData, $data]);
    }
}
