1. 程式人生 > >PHP 3DES 加解密(CBC模式,pkcs5padding填充)

PHP 3DES 加解密(CBC模式,pkcs5padding填充)

ner ech scm blog input 3des解密 tde 結合 rip

1、前言:項目中接入第三方支付遇到3DES加密,以前也沒用過,搜了好多,都不適用,各種不對,後來自己結合搜到的終於弄正確了,檢測地址:http://tool.chacuo.net/crypt3des。

2、下面是類 適用(CBC加密模式,pkcs5padding填充

技術分享

技術分享

代碼:

/**
* @des 3DES加密算法,cbc模式,pkcs5Padding字符填充方式
*/

class TDEA
{
  /**
  * @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 = TDEA::encrypt($plaintext, $key, $iv);//加密
$plaintext2 = TDEA::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;

檢測地址:http://tool.chacuo.net/crypt3des

PHP 3DES 加解密(CBC模式,pkcs5padding填充)