|
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));
|
|
|