Posted in PHP onFebruary 27, 2013
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));
PHP和.net中des加解密的实现方法
声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。
Reply on: @reply_date@
@reply_contents@