PHP和.net中des加解密的实现方法
发布时间:2020-12-13 06:14:34 所属栏目:PHP教程 来源:网络整理
导读: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) {
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 * @return */ 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 * @return */ public function decrypt ($value) { $td = mcrypt_module_open(MCRYPT_3DES,''); $iv = base64_decode($this->iv); $key = base64_decode($this->key); mcrypt_generic_init($td,$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,- 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.' '; $rs2=$des->decrypt($rs1); echo $rs2; .net版本 代码如下: sealed public class CryptoHelper { /// /// Encrypts the specified input. /// /// /// /// /// 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(),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; } /// /// Decrypts the specified input. /// /// /// /// /// public static string DecryptDes(string input,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,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(iv)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |