tid=166& 本帖最後由 IT_man 於 2014-12-11 22:31 編輯 " `. I2 R" y Y2 n5 |( X
! K3 A( X1 N; Z( H; ^7 Y- x由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下:
) j7 P, Q/ I+ O9 \# {( c2 Q' i3 U
- rpm -qa | grep php-mcrypt
複製代碼 4 u# t2 t' s" D9 k2 j# b
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
5 k: i* _+ z5 a! v6 F2 I4 b
- <?php8 ^5 I7 v- u8 Q% J
- // Show all information, defaults to INFO_ALL6 k& R/ G6 L; y% I) b* U/ ]
- phpinfo();8 C) }2 {% W9 i: f z. c. M
- ?>
複製代碼
. Z5 M' N/ u% |然後於browser 執行phpinfo.php,結果如下:
5 _7 v) u0 e( ]1 e+ R
4 x r! f+ ]& d$ T5 E5 e # |; H1 u6 f/ u
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
2 S8 i9 w/ ?8 ^- N+ v& r3 `& M/ i
- //加密函數撰寫8 b4 y! |0 @& |/ U8 z
- function encrypt($source,$toencrypt){
- I# h7 V( h: a, @0 a/ [$ o% M - //加密用的key " t' ^4 r' s$ ?1 I
- $key = $source;
( L( M& c; W0 Z+ C! N6 n2 V - //使用3DES方法加密 & [0 e2 y. f+ G
- $encryptMethod = MCRYPT_TRIPLEDES; 5 ]# D% L* [8 ]% p& H/ E1 _; R
- //初始化向量來增加安全性
6 V5 ?8 w4 k: Z0 w - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
" W. I) ^7 e) O+ H - //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
+ h& D2 q1 \, I - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
* L" Y6 X! F5 g7 _% p- Z, v2 ` - //回傳解密後字串( X: P, ^; g$ D8 f2 Z7 r1 Z I' k' |
- return base64_encode($encrypted_toencrypt);
& b& z: Z2 T, [5 A+ v0 u - }
z/ ], c3 J2 ?/ y - //解密函數撰寫6 @( _4 T+ ?9 f/ m. L
- function decrypt($source,$todecrypt) {
: F0 I, N1 P% u - //解密用的key,必須跟加密用的key一樣 0 l, @5 r7 J6 G& X4 \4 o, [
- $key = $source; ; k+ m( U3 Q3 v& y# x
- //解密前先解開base64碼/ C) W% m1 J+ B9 x1 ~
- $todecrypt = base64_decode($todecrypt);
2 k% G6 @# n+ X) n- J# U - //使用3DES方法解密
4 b& `+ V% P! y0 ^ }1 ^& G' _0 { - $encryptMethod = MCRYPT_TRIPLEDES; , }& T8 H8 C; c
- //初始化向量來增加安全性 ( e& [! j1 S9 R# S
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
% `$ O: E5 Q* H - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
/ v& U3 l' Z3 a7 z - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
$ Y/ S0 O( j- X* e4 g r - //回傳解密後字串0 X& o/ v9 a9 @4 |3 C& t
- return $decrypted_todecrypt; 6 }8 d/ `3 h7 N7 L0 R
- } 7 q$ e* {* `7 H. Q0 t+ D( F
- //寫好加解密的函數之後,就可以來進行測試了
, O& i8 w2 t2 y# A% j2 G - //key設定
, m1 }; @/ l6 u% k* B - $source ="1234567890";( I$ B$ i6 r; `5 ~9 y6 q
- //要加密的字串
. d; ?7 e, C) A' N5 Y - $string ="www.av4u.co";
5 A9 V9 B0 R& n( r) e. W8 x - echo "string=".$string."<br>";: L7 @, p" U; ]/ t8 ?: S2 D
- //進行加密並顯示加密後的字串
9 X" ]$ q' a) V" I) d - $encode = encrypt($source,$string);
, n( F, B4 w1 j% f# x U! _' P - echo "encode=".$encode."<br>";' X& V4 R" K3 G. [. t$ B% W. E
- //進行解密並顯示解密後的字串
- I6 ? ^3 a* f2 x( H) r" Y - $decode = decrypt($source,$encode);, {" ^( T2 J1 j4 v& T
- echo "decode=".$decode."<br>";
複製代碼
, K) G# ?! }0 X 結果如下:
2 N! O3 \8 M) c) o
! G( k' B; f2 s$ r; s \9 V- f
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下: $ N% O# S6 B& V, ~5 E
|