笔记:des加解密,php和.net版的实现

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

 1 class STD3Des
 2 {
 3     private $key = "";
 4     private $iv = "";
 5 
 6     /**
 7     * 构造,传递二个已经进行base64_encode的KEY与IV
 8     *
 9     * @param string $key
10     * @param string $iv
11     */
12     function __construct ($key, $iv)
13     {
14         if (empty($key) || empty($iv)) {
15             echo 'key and iv is not valid';
16             exit();
17         }
18         $this->key = $key;
19         $this->iv = $iv;
20     }
21 
22     /**
23     *加密
24     * @param <type> $value
25     * @return <type>
26     */
27     public function encrypt ($value)
28     {
29         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
30         $iv = base64_decode($this->iv);
31         $value = $this->PaddingPKCS7($value);
32         $key = base64_decode($this->key);
33         mcrypt_generic_init($td, $key, $iv);
34         $ret = base64_encode(mcrypt_generic($td, $value));
35         mcrypt_generic_deinit($td);
36         mcrypt_module_close($td);
37         return $ret;
38     }
39 
40     /**
41     *解密
42     * @param <type> $value
43     * @return <type>
44     */
45     public function decrypt ($value)
46     {
47         $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
48         $iv = base64_decode($this->iv);
49         $key = base64_decode($this->key);
50         mcrypt_generic_init($td, $key, $iv);
51         $ret = trim(mdecrypt_generic($td, base64_decode($value)));
52         $ret = $this->UnPaddingPKCS7($ret);
53         mcrypt_generic_deinit($td);
54         mcrypt_module_close($td);
55         return $ret;
56     }
57 
58     private function PaddingPKCS7 ($data)
59     {
60         $block_size = mcrypt_get_block_size('tripledes', 'cbc');
61         $padding_char = $block_size - (strlen($data) % $block_size);
62         $data .= str_repeat(chr($padding_char), $padding_char);
63         return $data;
64     }
65 
66     private function UnPaddingPKCS7($text)
67     {
68         $pad = ord($text{strlen($text) - 1});
69         if ($pad > strlen($text)) {
70             return false;
71         }
72         if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
73             return false;
74         }
75         return substr($text, 0, - 1 * $pad);
76     }
77 }
78 
79 
80 //使用
81 include('STD3Des.class.php');
82 $key='abcdefgh';
83 $iv='abcdefgh';
84 $msg='test string';
85 $des=new STD3Des(base64_encode($key),base64_encode($iv));
86 $rs1=$des->encrypt($msg);
87 echo $rs1.'<br />';
88 $rs2=$des->decrypt($rs1);
89 echo $rs2;

 

.net版本

  1 sealed public class CryptoHelper
  2 {
  3     /// <summary>
  4     /// Encrypts the specified input.
  5     /// </summary>
  6     /// <param name="input">The input.</param>
  7     /// <param name="key">key</param>
  8     /// <param name="iv">iv</param>
  9     /// <returns></returns>
 10     public static string EncryptDes(string input, byte[] key, byte[] iv)
 11     {
 12         if (input == null || input.Length == 0)
 13             return String.Empty;
 14 
 15         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 16         MemoryStream ms = null;
 17         CryptoStream encStream = null;
 18         StreamWriter sw = null;
 19         string result = String.Empty;
 20 
 21         try
 22         {
 23             ms = new MemoryStream();
 24 
 25             // Create a CryptoStream using the memory stream and the 
 26             // CSP DES key.  
 27             //des.Mode = CipherMode.CBC;
 28             //des.Padding = PaddingMode.PKCS7;  
 29             encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
 30 
 31             // Create a StreamWriter to write a string
 32             // to the stream.
 33             sw = new StreamWriter(encStream);
 34 
 35             // Write the plaintext to the stream.
 36             sw.Write(input);
 37 
 38             sw.Flush();
 39             encStream.FlushFinalBlock();
 40             ms.Flush();
 41 
 42 
 43             result = Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));
 44         }
 45         finally
 46         {
 47             //close objects
 48             if (sw != null)
 49                 sw.Close();
 50             if (encStream != null)
 51                 encStream.Close();
 52             if (ms != null)
 53                 ms.Close();
 54         }
 55 
 56         // Return the encrypted string
 57         return result;
 58     }
 59     /// <summary>
 60     /// Decrypts the specified input.
 61     /// </summary>
 62     /// <param name="input">the input.</param>
 63     /// <param name="key">key</param>
 64     /// <param name="iv">iv</param>
 65     /// <returns></returns>
 66     public static string DecryptDes(string input, byte[] key, byte[] iv)
 67     {
 68         byte[] buffer;
 69         try { buffer = Convert.FromBase64String(input); }
 70         catch (System.ArgumentNullException) { return String.Empty; }
 71         // length is zero, or not an even multiple of four (plus a few other cases)
 72         catch (System.FormatException) { return String.Empty; }
 73 
 74         DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 75         MemoryStream ms = null;
 76         CryptoStream encStream = null;
 77         StreamReader sr = null;
 78         string result = String.Empty;
 79 
 80         try
 81         {
 82             ms = new MemoryStream(buffer);
 83 
 84             // Create a CryptoStream using the memory stream and the 
 85             // CSP DES key. 
 86             encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
 87 
 88             // Create a StreamReader for reading the stream.
 89             sr = new StreamReader(encStream);
 90 
 91             // Read the stream as a string.
 92             result = sr.ReadToEnd();
 93         }
 94         finally
 95         {
 96             //close objects
 97             if (sr != null)
 98                 sr.Close();
 99             if (encStream != null)
100                 encStream.Close();
101             if (ms != null)
102                 ms.Close();
103         }
104 
105         return result;
106     }
107 }
108 
109 
110 //调用
111 
112 string key = "abcdefgh";
113 string iv = "abcdefgh";
114 string msg="test string";
115 string rs1 = CryptoHelper.EncryptDes(msg, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));
116 string rs2 = CryptoHelper.DecryptDes(rs1, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));

 

你可能感兴趣的:(.net)