tid=166& 本帖最後由 IT_man 於 2014-12-11 22:31 編輯 : }& n0 p; e W. U9 ^7 ?
0 d) f- m4 l. a/ M6 E
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: 6 N2 h9 Y, {9 \& d, k' o
- rpm -qa | grep php-mcrypt
複製代碼
1 R: o6 D2 G: o! S ~或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module- S6 m3 e0 m# J( @! |+ _) c/ U* A
- <?php
" T( q9 P0 d) w& `4 z! t" i - // Show all information, defaults to INFO_ALL
% X# m0 R! c+ M, h! O+ [ l+ i - phpinfo();0 V9 c3 l2 f& Y0 Q# o$ o7 V/ ?
- ?>
複製代碼
) W6 u* [2 k* ~1 X+ l' ]8 p& N然後於browser 執行phpinfo.php,結果如下:" r' Q$ y8 w V6 O& y3 l
8 V: {- r# o& F# c# y# h
; ?3 Q4 R" O) y$ U' V- p, }: z如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
1 K! N5 Y3 ?( o) H5 i8 o r
- //加密函數撰寫, W8 H5 }( X4 g6 ?
- function encrypt($source,$toencrypt){
3 b* l( L/ Y. O - //加密用的key
% ?6 J8 D9 ?8 h0 g! r; D - $key = $source; ) U4 D6 ` d2 s' S( M. a7 U
- //使用3DES方法加密
/ j3 R! { t% k# N - $encryptMethod = MCRYPT_TRIPLEDES;
, v- g7 ?& k0 ~% H- F - //初始化向量來增加安全性
3 d( f/ g, I' B# d - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
0 E! p% |* |+ Q3 i - //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式, \9 J' z! a( r
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv); " W6 `7 G) Z2 @6 ^7 z; L# k% k
- //回傳解密後字串
# n, u! H& X+ L! a - return base64_encode($encrypted_toencrypt); + ?5 Z4 ^6 {7 G R! _$ j2 z
- }
6 l) @. u- q3 l, A) ` - //解密函數撰寫
6 ~% W C- Q8 f4 D; a+ L - function decrypt($source,$todecrypt) {
. Q+ m) W1 ]+ g - //解密用的key,必須跟加密用的key一樣
6 c' W, Z. n8 @" _ - $key = $source;
3 K/ g( ?# s! @, H2 i( } - //解密前先解開base64碼
: A/ ~# g& [" n4 \! a+ d" ^8 f - $todecrypt = base64_decode($todecrypt);
( {6 D$ I, Q! {# o& ] - //使用3DES方法解密9 E, f. z% \' u4 s* q$ O+ ]: i
- $encryptMethod = MCRYPT_TRIPLEDES;
: z7 B: Z8 Q4 y1 T) w( | - //初始化向量來增加安全性 ( m" y' m/ k. s! F. W
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 7 a4 p6 I4 k8 f
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式 % P0 l* p$ D; e- f# c
- $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);5 D7 N2 m7 o& K% l- i8 ^( U
- //回傳解密後字串 `, n2 b b) {% d
- return $decrypted_todecrypt;
- n( c) ?5 J# y! g, Q5 Q - }
! W9 A7 p' N8 l) a; z) D - //寫好加解密的函數之後,就可以來進行測試了
$ [9 B# M3 O; S( u) i - //key設定% N: p% Y: q \3 B
- $source ="1234567890";
. u. P3 j- y1 Q; m: {5 Z - //要加密的字串( b8 j" k& N; n
- $string ="www.av4u.co";
/ {1 d; u; O2 E, b" ]6 [& q- A: y - echo "string=".$string."<br>";
9 K8 o4 l* T& S9 b& k) L - //進行加密並顯示加密後的字串# ~ h7 f, | \' G1 r
- $encode = encrypt($source,$string);
6 r/ k9 O3 @; Y5 D# d - echo "encode=".$encode."<br>";1 J$ ~- n8 a* w
- //進行解密並顯示解密後的字串
1 b; d# f: _. K5 L q) H/ }, H - $decode = decrypt($source,$encode);
, S& N# D5 Y7 s( Z- \ - echo "decode=".$decode."<br>";
複製代碼% j$ I7 ~; G* n
結果如下:3 r+ z1 k8 v- G& A
z) m1 R( C9 q" u( f+ J
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下: # C( {* ^2 `4 R7 `7 n6 W |
|