主页 > PHP > PHP与.NET的3DES加密代码

PHP与.NET的3DES加密代码

2014 年 05 月 12 日 没有评论
<?php
if (! function_exists('mcrypt_generic_init')) {
	echo ('Snda needs the mcrypt_generic_init PHP extension.');
	exit();
}
if (! function_exists('mcrypt_module_open')) {
	echo ('Snda needs the mcrypt_module_open PHP extension.');
	exit();
}

class Crypt3Des {
  /**
   * 使用3DES加密源数据
   * @param string $oriSource 源数据
   * @param string $key       密钥
   * @param string $defaultIV 加解密向量
   * @return string $result   密文
   */
  public function encryptByTDES($oriSource, $key, $defaultIV='') {
    $key = base64_decode ( $key ); //结果为24位
    $iv = base64_decode ( $defaultIV ); //结果为8位
    $oriSource = $this->addPKCS7Padding ( $oriSource );
    $td = mcrypt_module_open ( MCRYPT_3DES, '', MCRYPT_MODE_ECB, '' );
    @mcrypt_generic_init ( $td, $key, $iv );
    $result = mcrypt_generic ( $td, $oriSource );
    mcrypt_generic_deinit ( $td );
    mcrypt_module_close ( $td );
    $result = base64_encode ( $result );
    return $result;
  }

  /**
   * 使用3DES解密密文
   * @param string $encryptedData 密文
   * @param string $key           密钥
   * @param string $defaultIV     加解密向量
   * @return string $result       解密后的原文
   */
  public function decryptByTDES($encryptedData, $key, $defaultIV) {
    $key = base64_decode ( $key ); //结果为24位
    $iv = base64_decode ( $defaultIV ); //结果为8位
    $encryptedData = base64_decode ( $encryptedData );
    $td = mcrypt_module_open ( MCRYPT_3DES, '', MCRYPT_MODE_CBC, '' );
    mcrypt_generic_init ( $td, $key, $iv );
    $result = mdecrypt_generic ( $td, $encryptedData );
    mcrypt_generic_deinit ( $td );
    mcrypt_module_close ( $td );
    $result = $this->stripPKSC7Padding ( $result );
    return $result;
  }

  /**
   * 为字符串添加PKCS7 Padding
   * @param string $source    源字符串
   */
  private function addPKCS7Padding($source) {
    $block = mcrypt_get_block_size ( 'tripledes', MCRYPT_MODE_ECB );
    $pad = $block - (strlen ( $source ) % $block);
    if ($pad <= $block) {
      $char = chr ( $pad );
      $source .= str_repeat ( $char, $pad );
    }
    return $source;
  }

  /**
   * 去除字符串末尾的PKCS7 Padding
   * @param string $source    带有padding字符的字符串
   */
  public function stripPKSC7Padding($source) {
    $block = mcrypt_get_block_size ( 'tripledes', MCRYPT_MODE_ECB );
    $char = substr ( $source, - 1, 1 );
    $num = ord ( $char );
    if ($num > 8) {
      return $source;
    }
    $len = strlen ( $source );
    for($i = $len - 1; $i >= $len - $num; $i --) {
      if (ord ( substr ( $source, $i, 1 ) ) != $num) {
        return $source;
      }
    }
    $source = substr ( $source, 0, - $num );
    return $source;
  }
}

?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>