AES-128-CBC 加密

加密过程

  • 利用random_bytes生成随机密钥KEY
  • 利用random_bytes函数生成随机IV
  • 将加密数据A转成成字符串B
  • 将字符串B,KEY,IV根据AES-128-CBC加密得到密文C
  • 将IV与密文C连接得到D
  • 将D进行BASE64ENCODE得到用于传输的密文E

解密过程

  • 线下沟通得到密钥KEY
  • 将密文E进行BASE64DECODE得到密文D
  • 将密文D切割前16位得到IV
  • 将密文D切割16位之后的数据得到密文C
  • 将密文C,KEY,IV根据AES-128-CBC解密得到字符串数据B
  • 将字符串数据B通过线下约束格式转换成需要的格式

PHP代码

<?php

$strKey = random_bytes(16);

$arrData2 = [
    'type'=>'PING',
    'data'=>[],
    'uuid'=>mt_rand(1000000000,9000000000),
];

class Aes
{
    public $strDataKey ;

    public function __construct($strDatastrKey)
    {
        $this->strKey = $strDatastrKey;
    }

    public  function decode($strData)
    {
        $strData = base64_decode($strData);
        $strDataIv = substr($strData,0,16);
        $strData = substr($strData, 16);
        return openssl_decrypt($strData,"AES-128-CBC",$this->strKey,OPENSSL_RAW_DATA, $strDataIv);
    }

    public  function encode($strData)
    {
        $strDataIv = random_bytes(16);
        return base64_encode($strDataIv.openssl_encrypt($strData,"AES-128-CBC",$this->strKey,OPENSSL_RAW_DATA, $strDataIv));
    }
}

$strData = json_encode($arrData);

$Aes = new Aes($strKey);

$strSignData = $Aes->encode($strData);

echo '加密后数据:'.$strSignData;
echo  PHP_EOL;
echo  PHP_EOL;

$strData =  $Aes->decode($strSignData);

echo '解密后数据:'.$strData;
echo  PHP_EOL;
echo  PHP_EOL;


$arrData = json_decode($strData,true);
print_r($arrData);