PHP和.net中des加解密的实现方法

  php5.x版本,要添加php扩展php_mcrypt。

  PHP版:

  

复制代码 代码如下:

  class STD3Des

  {

  private $key = "";

  private $iv = "";

  /**

  * 构造,传递二个已经进行base64_encode的KEY与IV

  *

  * @param string $key

  * @param string $iv

  */

  function __construct ($key, $iv)

  {

  if (empty($key) || empty($iv)) {

  echo 'key and iv is not valid';

  exit();

  }

  $this->key = $key;

  $this->iv = $iv;

  }

  /**

  *加密

  * @param <type> $value

  * @return <type>

  */

  public function encrypt ($value)

  {

  $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

  $iv = base64_decode($this->iv);

  $value = $this->PaddingPKCS7($value);

  $key = base64_decode($this->key);

  mcrypt_generic_init($td, $key, $iv);

  $ret = base64_encode(mcrypt_generic($td, $value));

  mcrypt_generic_deinit($td);

  mcrypt_module_close($td);

  return $ret;

  }

  /**

  *解密

  * @param <type> $value

  * @return <type>

  */

  public function decrypt ($value)

  {

  $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');

  $iv = base64_decode($this->iv);

  $key = base64_decode($this->key);

  mcrypt_generic_init($td, $key, $iv);

  $ret = trim(mdecrypt_generic($td, base64_decode($value)));

  $ret = $this->UnPaddingPKCS7($ret);

  mcrypt_generic_deinit($td);

  mcrypt_module_close($td);

  return $ret;

  }

  private function PaddingPKCS7 ($data)

  {

  $block_size = mcrypt_get_block_size('tripledes', 'cbc');

  $padding_char = $block_size - (strlen($data) % $block_size);

  $data .= str_repeat(chr($padding_char), $padding_char);

  return $data;

  }

  private function UnPaddingPKCS7($text)

  {

  $pad = ord($text{strlen($text) - 1});

  if ($pad > strlen($text)) {

  return false;

  }

  if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {

  return false;

  }

  return substr($text, 0, - 1 * $pad);

  }

  }

  //使用

  include('STD3Des.class.php');

  $key='abcdefgh';

  $iv='abcdefgh';

  $msg='test string';

  $des=new STD3Des(base64_encode($key),base64_encode($iv));

  $rs1=$des->encrypt($msg);

  echo $rs1.'<br />';

  $rs2=$des->decrypt($rs1);

  echo $rs2;

  .net版本

  

复制代码 代码如下:

  sealed public class CryptoHelper

  {

  /// <summary>

  /// Encrypts the specified input.

  /// </summary>

  /// <param name="input">The input.</param>

  /// <param name="key">key</param>

  /// <param name="iv">iv</param>

  /// <returns></returns>

  public static string EncryptDes(string input, byte[] key, byte[] iv)

  {

  if (input == null || input.Length == 0)

  return String.Empty;

  DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  MemoryStream ms = null;

  CryptoStream encStream = null;

  StreamWriter sw = null;

  string result = String.Empty;

  try

  {

  ms = new MemoryStream();

  // Create a CryptoStream using the memory stream and the

  // CSP DES key.

  //des.Mode = CipherMode.CBC;

  //des.Padding = PaddingMode.PKCS7;

  encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);

  // Create a StreamWriter to write a string

  // to the stream.

  sw = new StreamWriter(encStream);

  // Write the plaintext to the stream.

  sw.Write(input);

  sw.Flush();

  encStream.FlushFinalBlock();

  ms.Flush();

  result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));

  }

  finally

  {

  //close objects

  if (sw != null)

  sw.Close();

  if (encStream != null)

  encStream.Close();

  if (ms != null)

  ms.Close();

  }

  // Return the encrypted string

  return result;

  }

  /// <summary>

  /// Decrypts the specified input.

  /// </summary>

  /// <param name="input">the input.</param>

  /// <param name="key">key</param>

  /// <param name="iv">iv</param>

  /// <returns></returns>

  public static string DecryptDes(string input, byte[] key, byte[] iv)

  {

  byte[] buffer;

  try { buffer = Convert.FromBase64String(input); }

  catch (System.ArgumentNullException) { return String.Empty; }

  // length is zero, or not an even multiple of four (plus a few other cases)

  catch (System.FormatException) { return String.Empty; }

  DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  MemoryStream ms = null;

  CryptoStream encStream = null;

  StreamReader sr = null;

  string result = String.Empty;

  try

  {

  ms = new MemoryStream(buffer);

  // Create a CryptoStream using the memory stream and the

  // CSP DES key.

  encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);

  // Create a StreamReader for reading the stream.

  sr = new StreamReader(encStream);

  // Read the stream as a string.

  result = sr.ReadToEnd();

  }

  finally

  {

  //close objects

  if (sr != null)

  sr.Close();

  if (encStream != null)

  encStream.Close();

  if (ms != null)

  ms.Close();

  }

  return result;

  }

  }

  //调用

  string key = "abcdefgh";

  string iv = "abcdefgh";

  string msg="test string";

  string rs1 = CryptoHelper.EncryptDes(msg, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));

  string rs2 = CryptoHelper.DecryptDes(rs1, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));