本帖最後由 IT_man 於 2014-12-11 22:31 編輯 4 o6 m9 }8 M/ w, C* E# \
5 N$ g: Q: w$ q t9 n/ M由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: ' i- ^6 n2 Z" H
- rpm -qa | grep php-mcrypt
複製代碼 $ P! i: H4 s- D3 C, i! ?" L
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module' t* _+ A; {% n1 G
- <?php9 ?. j5 K3 c$ t9 z" E( R% }
- // Show all information, defaults to INFO_ALL
6 } a+ l+ `2 x% I: L8 D6 O - phpinfo();) Q8 R2 a5 T2 s: [$ F9 _* w* R* U2 V
- ?>
複製代碼
3 e' M! K# o. m6 h; j' W9 x+ @然後於browser 執行phpinfo.php,結果如下:$ H# l z% a/ R# V; Q
/ V) a& q5 o1 A7 | 6 u& z F' d* B1 r$ B- n, k- G
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
* ^) T: H( [% ?4 S( N" n+ s! Y6 U* D
- //加密函數撰寫
( e( c4 L6 e: g - function encrypt($source,$toencrypt){
3 r# Y; e# l9 K9 z2 u - //加密用的key - N: C0 A h% d) N
- $key = $source; $ s. K' T5 H! B( D4 C. D
- //使用3DES方法加密
9 L) H1 r2 J/ H- L+ o! T: t - $encryptMethod = MCRYPT_TRIPLEDES; / g; F+ w, H- E6 @* L% B! q" N
- //初始化向量來增加安全性
i# \7 X h" V- K6 n - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); ; L/ Z- d9 N. [+ a
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
0 t+ Q1 r# q& \4 k0 ]7 G7 s - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
/ M; Q; b- w' n( x; s. x+ R+ j5 N - //回傳解密後字串
7 @) f4 o+ Z5 U: `2 t# T - return base64_encode($encrypted_toencrypt);
& ]( @7 k4 G. }7 F - }
( y6 l/ X; _6 K: X - //解密函數撰寫- l3 I& G2 i: Q0 }! j9 h8 T
- function decrypt($source,$todecrypt) { / [0 `7 I1 ~' B h; p; S+ g
- //解密用的key,必須跟加密用的key一樣
5 b7 K" A& x, t5 M - $key = $source;
8 q, B- s' C( g+ s - //解密前先解開base64碼
# W; e0 n( e( U) l( C - $todecrypt = base64_decode($todecrypt);& m/ Y: G) x4 b
- //使用3DES方法解密* j) L6 P: m Y5 g
- $encryptMethod = MCRYPT_TRIPLEDES;
# R; }' O/ |: }3 e" H - //初始化向量來增加安全性 7 r% u- D3 ?2 \3 z$ R
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
/ X- Y+ j6 v6 b - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
6 ~# a# b% m5 J7 G) K - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);, a: K4 l2 M; M; _
- //回傳解密後字串* u. Q- e0 s. c" e
- return $decrypted_todecrypt; ! D! T* e. b5 c6 ^- |2 \; ?
- } ; `1 |: U8 m# e& I
- //寫好加解密的函數之後,就可以來進行測試了
3 N% P! \ y C4 |1 o; s2 [ - //key設定
/ Y% h3 `$ T1 m) i - $source ="1234567890";
7 o% f+ J, S r% \% s7 Y) y8 v' f" n7 _ - //要加密的字串7 C% l4 v, a' ?# B
- $string ="www.av4u.co";
" p! |* Q! J4 A7 c$ W" v7 Y8 K6 s - echo "string=".$string."<br>";% h7 [* k2 t0 J4 H; |6 p4 u& B4 X' H+ r
- //進行加密並顯示加密後的字串
( Q$ g, k; k7 }: M, z v7 f - $encode = encrypt($source,$string); i# F& n+ g9 P! N. a
- echo "encode=".$encode."<br>";
U- W4 J* T7 w' r6 ?; C - //進行解密並顯示解密後的字串
% r: }; i3 A; l! u - $decode = decrypt($source,$encode);* H$ r4 `' q5 T
- echo "decode=".$decode."<br>";
複製代碼
$ o: J" f! [" ^ B8 x) d# d I. v) s 結果如下:
% T. S# O" b9 N! e9 G5 L5 t0 L
6 C8 z) I$ }, e; E8 S+ @ 注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
: t0 I& Q2 D' ~. E# {0 P |
|