tid=166& 本帖最後由 IT_man 於 2014-12-11 22:31 編輯
4 h. Y$ I! i* S1 y9 u: o* y. i4 a S+ n4 q7 c
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下:
5 N5 m! Q( {+ N/ R' | X
- rpm -qa | grep php-mcrypt
複製代碼 7 j( j7 B. b- f0 T! v) F
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module: ^$ i7 M' j0 W7 J% S" V
- <?php
" V3 z1 i% S. T - // Show all information, defaults to INFO_ALL
3 Q6 B0 \! F: F5 q9 e$ Q; S - phpinfo();" ?0 z& S0 D5 p* x0 j/ ]
- ?>
複製代碼
3 m6 r% n+ u, U1 C J2 W然後於browser 執行phpinfo.php,結果如下:5 d- D$ Y0 R, c3 q4 v! |
$ @ R8 D/ h# L/ D5 r7 \
2 {* u' R7 o; ~9 V4 o) J. A) X如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下: , C5 c+ W( H: L* ^2 }
- //加密函數撰寫$ }, z* Z/ W6 L8 m4 v4 _: ~
- function encrypt($source,$toencrypt){ / @/ C7 E. V' n7 A9 N7 B0 z+ e
- //加密用的key
. a4 H0 n0 y n2 z( V# L9 B! b - $key = $source; 4 o( q4 Z- a$ `7 t d- b2 y
- //使用3DES方法加密 " c- s0 ?; ~( Q0 I$ s D' X
- $encryptMethod = MCRYPT_TRIPLEDES;
3 M3 @9 W$ R. k5 a; o, N - //初始化向量來增加安全性
' k3 R, t7 ]' b- ~ - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); * O2 J& I9 v- v" e i5 O8 L5 F
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
/ O: q, {' i" C" v& [) B - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
( t+ D8 A# j# m( j - //回傳解密後字串
' m8 x9 { s: S1 U! v# e3 n - return base64_encode($encrypted_toencrypt);
6 j, |6 H* i2 A - } 1 U8 Y7 _$ D7 \+ C* h8 i* F$ K
- //解密函數撰寫# h6 P: l& P; y6 r3 F
- function decrypt($source,$todecrypt) {
* X0 ~5 e3 [% j- O! @! u8 s - //解密用的key,必須跟加密用的key一樣
0 ]% `8 d# w* {% ^ - $key = $source; $ g9 E) t; r N/ h/ _% v" U
- //解密前先解開base64碼
! Z* a3 B9 Y! f5 s5 u: I2 s/ X7 \ - $todecrypt = base64_decode($todecrypt);% P& a- z9 _, I; i
- //使用3DES方法解密. }' o& R2 q. I
- $encryptMethod = MCRYPT_TRIPLEDES;
6 u9 Z- E5 P0 D - //初始化向量來增加安全性
0 D8 I& \3 ^ i: G. H7 Q/ j - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); % D* j$ }0 P5 O0 O
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
* S" }9 z v2 s& |$ X: @+ u - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);# K* N( ]* U$ I* ~' D' G- f
- //回傳解密後字串. S, k; |7 |% Y2 H- {3 m* o' B
- return $decrypted_todecrypt; / v- r" s9 D( w8 Q2 Y7 G
- }
* e! o" I5 u* k" H$ q0 H - //寫好加解密的函數之後,就可以來進行測試了0 s b, M5 t2 s
- //key設定. n9 x6 d. G2 @( z
- $source ="1234567890";
6 @0 `) R `; M5 E6 O - //要加密的字串# d" W ?3 M$ J7 C/ r
- $string ="www.av4u.co";5 W" b7 U7 K, m9 k
- echo "string=".$string."<br>";# ?' s' \/ F) h) C
- //進行加密並顯示加密後的字串
3 w4 Y" S/ ?2 l+ y - $encode = encrypt($source,$string);
# n' w) i- v D - echo "encode=".$encode."<br>";1 k5 v1 d3 w9 N2 i( P. S
- //進行解密並顯示解密後的字串
+ s8 J( }: R' x) Q, L& h& e7 p! ?; v7 T - $decode = decrypt($source,$encode);
8 S& r+ E# A9 A9 U/ ]0 U* c - echo "decode=".$decode."<br>";
複製代碼% O3 ?% R4 z0 d7 y
結果如下:
3 t5 K8 b$ d) C4 P; N+ f( a. T2 I
I# F# C( b* t7 K- ~5 \. M
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下: : a6 _# N% t+ K
|