本帖最後由 IT_man 於 2014-12-11 22:31 編輯 9 r4 B- o$ z* N' L; }/ @
b4 k' h. [ O4 i* _; a: m6 f5 N
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下:
; ]8 J; d! N/ Q9 |
- rpm -qa | grep php-mcrypt
複製代碼 4 L+ Z* w( c2 D' }3 {# W; N
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
/ y7 V0 x& |3 B0 J7 b8 n+ a
- <?php' ^# ^1 B7 r/ K
- // Show all information, defaults to INFO_ALL
" J; Z5 R4 ~3 [7 W! s7 B- G - phpinfo();% |9 G$ G: B2 y- r; R3 `( s2 }& N
- ?>
複製代碼
: M/ c' T7 h( f" Q然後於browser 執行phpinfo.php,結果如下:
7 t$ [$ o- G1 Z, X( a1 r7 P; R
4 G) x4 {4 O- ~+ q( B4 h& b5 u9 q
4 X/ p" F$ s/ m0 z: e! i. ]
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下: 0 j; L' G' i% i/ u, e
- //加密函數撰寫
* P! l. `0 ~( Q" P5 W" ~4 s - function encrypt($source,$toencrypt){
0 S: n! F+ B6 e9 C - //加密用的key 4 G' b# b& Q% E- e: ~. M( j( o
- $key = $source; 0 X! Q& A' b. K9 O4 O
- //使用3DES方法加密 & V! B% l. I7 o% v' y
- $encryptMethod = MCRYPT_TRIPLEDES; - n3 j4 G4 g; p
- //初始化向量來增加安全性
* E( V. d, o( T# E - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
1 [, H- X3 {4 i. Z2 S, v - //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式- k/ |* T& b( B# z5 [
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv); . c5 _: g; a8 R, R# i7 x
- //回傳解密後字串
`0 D" l& h1 N - return base64_encode($encrypted_toencrypt); ; A/ g& E% y1 D9 m1 o/ G
- } / Z2 p5 |8 \/ o; n) ]/ T ]
- //解密函數撰寫; |- B1 ^! ` }/ h4 u% D3 Q
- function decrypt($source,$todecrypt) { ; A8 k1 _8 g/ g- h( H& m1 n+ @% i7 f
- //解密用的key,必須跟加密用的key一樣
" Y5 T2 D7 g0 J T0 v - $key = $source;
$ E8 H0 `; n- H, \ - //解密前先解開base64碼
) r; ~9 @! t, X3 R& L9 N4 d - $todecrypt = base64_decode($todecrypt);
; f" P. I6 y3 }! U - //使用3DES方法解密
2 n1 W8 G; V% O& v: E: y R; C - $encryptMethod = MCRYPT_TRIPLEDES;
- e/ l: j* f$ Q+ { - //初始化向量來增加安全性 Y& V, q+ }, _0 z: f m6 Y/ `
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 7 I% ^, G8 o7 W5 D& [8 k
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式 0 l7 w- R a% m
- $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);5 `$ `5 A& |& _$ \# b
- //回傳解密後字串
- H. r& N5 ^% H; E$ o - return $decrypted_todecrypt;
" g5 p6 f0 v7 k& [1 X* S8 Z - } ' ` {' k( j! J' ~
- //寫好加解密的函數之後,就可以來進行測試了
2 ?- }: p) s( R - //key設定
2 `& O/ O# j. V' K" w, l4 h - $source ="1234567890";3 ?2 S4 u- b" P& r8 D x2 p
- //要加密的字串
; Q/ z/ s% [0 o: J; Y Z* i+ [1 B - $string ="www.av4u.co";8 F# R! k) z8 [, r, a9 W" m8 m! ]
- echo "string=".$string."<br>";
4 u% ?* Q! s# L - //進行加密並顯示加密後的字串7 `/ I- A5 \1 @7 `
- $encode = encrypt($source,$string);9 H! W3 X- a% x8 {$ p( r
- echo "encode=".$encode."<br>";
0 D# H4 N6 q- d( u2 y2 X9 M - //進行解密並顯示解密後的字串
6 f+ @4 x0 u% W7 F0 p! p - $decode = decrypt($source,$encode);
l9 i) y) H' u* j- } - echo "decode=".$decode."<br>";
複製代碼
2 w) r- x. H1 q9 n: } 結果如下:
! c; p1 b; N; s7 W- o+ f
N+ y; I9 A y. H9 z1 J$ ~ 注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
2 x: T: x) r- B9 V- g/ T; ~$ `" _' J |
|