PHP中3DES加密,DESede/CBC/PKCS5Padding

2021-10-21 16:29 php分享 77 梁俊威

项目中接入第三方支付遇到3DES加密,以前也没用过,搜了好多,都不适用,各种不对,后来自己结合搜到的终于弄正确了。文末有附件下载

<?php

class Des
{
  /**
  * @param string $crypt 需要加密的字符串
  * @param string $key 加密使用的密钥
  * @param string $vi 加密使用的向量
  * @return string $crypt 加密后的字符串
  * @des 3DES加密
  */
  final static public function encrypt($input, $key, $iv, $base64 = true) {
    $size = 8;
    $input = self::pkcs5_pad($input, $size);
    $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
    mcrypt_generic_init($encryption_descriptor, $key, $iv);
    $data = mcrypt_generic($encryption_descriptor, $input);
    mcrypt_generic_deinit($encryption_descriptor);
    mcrypt_module_close($encryption_descriptor);
    return base64_encode($data);
  }
  
  /**
  * @param string $crypt 需要解密的字符串
  * @param string $key 加密使用的密钥
  * @param string $vi 加密使用的向量
  * @return string $input 解密后的字符串
  * @des 3DES解密
  */
  final static public function decrypt($crypt, $key, $iv, $base64 = true) {
    $crypt = base64_decode($crypt);
    $encryption_descriptor = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
    mcrypt_generic_init($encryption_descriptor, $key, $iv);
    $decrypted_data = mdecrypt_generic($encryption_descriptor, $crypt);
    mcrypt_generic_deinit($encryption_descriptor);
    mcrypt_module_close($encryption_descriptor);
    $decrypted_data = self::pkcs5_unpad($decrypted_data);
    return rtrim($decrypted_data);
  }

  final static private function pkcs5_pad($text, $blocksize) {
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
  }
  final static private function pkcs5_unpad($text) {
    $pad = ord($text{strlen($text) - 1});
    if ($pad > strlen($text)){
      return false;
    }
    return substr($text, 0, -1 * $pad);
  }
}


调用测试

$plaintext = "3DES加密测试";
$key = "r0uScmDuH5FLO37AJV2FN72J";// 加密所需的密钥
$iv = "1eX24DCe";// 初始化向量
$ciphertext = Des::encrypt($plaintext, $key, $iv);//加密
$plaintext2 = Des::decrypt($ciphertext, $key, $iv);//解密


echo "<b>String:</b> $plaintext <br><br>";
echo "<b>Encrypted:</b>";
echo $ciphertext;
echo"<br><br><b>Decrypt:</b> ";
echo $plaintext2;


本站提供的所有资源文件禁止用于一切违法、商业行为,若发生一切后果均由下载人员承担。

本文附件:3Des.zip [ 点我下载 ]

若无特殊说明,本站点所有内容均为原创,转载请说明出处!

原文链接:https://www.ljwei.com.cn/read/358.html

QQ客服

QQ客服

微信客服

微信客服

微信客服二维码
意见反馈

意见反馈

一键置顶