本帖最後由 IT_man 於 2014-12-11 22:31 編輯
$ l0 F. ~0 a P0 a* l: G g$ ~% ^4 s9 @; D
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: , B4 l7 w' j, |
- rpm -qa | grep php-mcrypt
複製代碼 7 ?) Z: X2 [8 v( ]
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
9 P4 e$ F! ^! y% B% a& q6 n
- <?php
B3 I# n; G5 l5 F - // Show all information, defaults to INFO_ALL' I& p2 U- \" [2 G9 Y% H/ ~2 m
- phpinfo();) n6 C; h$ l3 h7 l- ~& o" \
- ?>
複製代碼 - F& L \& G' A- A! L, t# v. p
然後於browser 執行phpinfo.php,結果如下:
7 s* c% V/ O* ^( M, z- J
1 ?: ?: S0 t& N/ B Q0 y1 p$ R3 R4 r
. E& e0 d& s; G
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
5 @/ P6 M2 e: ?5 _% s3 e
- //加密函數撰寫
4 D7 Q1 u4 ~) B1 Z - function encrypt($source,$toencrypt){ " x0 R( L7 q- m7 O ?" I) F
- //加密用的key
5 H1 C! d7 \ f - $key = $source; ; ?( r6 p, N- M* b
- //使用3DES方法加密 8 E8 R$ L" @ c5 t2 C
- $encryptMethod = MCRYPT_TRIPLEDES; # P8 t6 o8 O+ P. _% q
- //初始化向量來增加安全性
% c' t# |& O5 e' y - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); + w8 R* R! v* ?+ }. ^% z
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式) e, t8 @: J8 \+ e
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
' @5 Q( q; H* [. K: ` - //回傳解密後字串
6 ~; m" i% l) w. r" y3 ]* ~' O0 c - return base64_encode($encrypted_toencrypt); / V6 U! [: F2 Q# X4 q% P
- }
4 `9 z( F4 T& j+ \' I0 Q - //解密函數撰寫
$ u9 e `, Y& r( W7 Q/ } - function decrypt($source,$todecrypt) { # }2 ~( m) B: Z3 @: c4 E, ~' N
- //解密用的key,必須跟加密用的key一樣 1 D# S/ T6 @2 o3 c, q5 {- n4 B
- $key = $source;
1 E$ V3 p+ w: p; M& Q) H - //解密前先解開base64碼 V/ W0 d/ f& u! A2 m, _0 S
- $todecrypt = base64_decode($todecrypt);
; m2 x0 V" t8 n9 W - //使用3DES方法解密
8 I8 G- h' ~2 H) x& y - $encryptMethod = MCRYPT_TRIPLEDES;
( ^5 D0 a5 F- V) t# T% U% | - //初始化向量來增加安全性 U* ?: N# W2 ^! E G- ~ C
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
+ I+ h! c. z, b' \5 L$ [ - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式 9 p' \7 P$ j; M, O
- $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
) T+ R- u) P" V$ i0 I x) X5 q - //回傳解密後字串
6 e2 k. O+ v& S! n - return $decrypted_todecrypt;
, A1 C& y5 R' F4 ?5 f5 g T - } 3 K0 g1 N4 O( W( h- f* i4 [
- //寫好加解密的函數之後,就可以來進行測試了6 m0 V: a9 c }: A) J
- //key設定
' s6 D* f, R( B' C1 a: C - $source ="1234567890";1 ]: ^3 m9 z; c& {5 G
- //要加密的字串- K8 D; j: L( u D0 ]3 Q
- $string ="www.av4u.co";4 ?; b- b* k8 V+ T) ~7 F3 }
- echo "string=".$string."<br>";
; V9 @1 r. W7 p9 X# a. _" |1 n - //進行加密並顯示加密後的字串, _$ L1 O* a7 V2 c c2 z
- $encode = encrypt($source,$string);
( G" v% b6 S6 U6 s- @ - echo "encode=".$encode."<br>";3 _9 E7 A* M6 n, A" t$ b2 C
- //進行解密並顯示解密後的字串
& @& N0 Y2 m2 l7 S' g" }; \+ Z: ` - $decode = decrypt($source,$encode);! a7 f$ W5 h1 ~! T
- echo "decode=".$decode."<br>";
複製代碼
5 n3 f; r. Y! s3 J) j 結果如下:. i! n( K0 @- s* m F" x7 H
; V8 }, F: N% }7 P. W- d) d$ l
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
) L7 y( w: f' J( L- j7 F# g |
|