tid=166& 本帖最後由 IT_man 於 2014-12-11 22:31 編輯
\3 q' J* t. K+ Y) X- `' P" e) A8 l
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: 9 D: D# u4 `9 A9 u. w
- rpm -qa | grep php-mcrypt
複製代碼 & W8 z" O! B7 Z: H- E
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
" m1 Y! J2 ^6 m7 t. X, h
- <?php; |( A. o) \! Y+ a1 @
- // Show all information, defaults to INFO_ALL; R: i7 M" Q' ]5 @
- phpinfo();
9 N5 V% c9 s& x4 P - ?>
複製代碼
2 j3 B0 y5 I1 k4 d- r然後於browser 執行phpinfo.php,結果如下:+ T' H, c+ ]& z# v, k% W
% q" ^1 h! T h. X/ b: Y) J( Y- b
! I" S! l0 P' T. f" C如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下: 8 d, t* z6 Y; j4 z7 ]; a' Q7 {1 M
- //加密函數撰寫
' ^# [' U# |6 g* C - function encrypt($source,$toencrypt){ : O4 v1 |: C0 m, {6 P* ]- _
- //加密用的key
* J3 s' @0 ^" L" h$ n y - $key = $source;
4 v" f4 \" l, M% r; M - //使用3DES方法加密 / H; B6 X2 e# k. A
- $encryptMethod = MCRYPT_TRIPLEDES; / P- c& z9 ~3 V
- //初始化向量來增加安全性1 h& W8 p8 S) f6 V& Z$ H- i
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 3 l' v5 [6 n' E6 Q+ r' e
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式. U( ]; i3 R# I
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
9 a1 X( B5 r1 D7 Y Q! p4 M - //回傳解密後字串/ `! I( p# o4 z7 g/ R9 d
- return base64_encode($encrypted_toencrypt);
0 t- ^% Q6 y* h# u, a4 E3 N - } 6 R0 I; V# L0 X( C4 G
- //解密函數撰寫
" z# S1 V$ @' K) w& M, I6 f - function decrypt($source,$todecrypt) {
. ?2 v; ?. M- X& a - //解密用的key,必須跟加密用的key一樣 6 x% O! }* Q1 H
- $key = $source;
/ E$ V: V, ?% d u# X4 `. y - //解密前先解開base64碼/ o" T& C0 f1 p: t( \8 y
- $todecrypt = base64_decode($todecrypt);& v6 X- |) i: {4 c8 [$ q( a* x
- //使用3DES方法解密
) M# ?8 k+ H$ S" m# k U - $encryptMethod = MCRYPT_TRIPLEDES; \6 p+ J- O# V0 W8 I1 ]: [
- //初始化向量來增加安全性
3 E4 g8 c2 n4 [6 T. [# K0 l; V - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 6 {4 D9 h; m7 p6 D; W
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
H! u! a2 T( F - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
& E1 N) i6 B" {; [" a6 A6 f - //回傳解密後字串1 v7 m0 h. A4 p ~0 m3 ~# w
- return $decrypted_todecrypt; 3 S4 X9 K8 E% b. P. |
- } - t. a5 \$ @9 M& a7 G
- //寫好加解密的函數之後,就可以來進行測試了
( C2 m. i7 i8 a - //key設定
+ [4 B2 W% x* U2 K - $source ="1234567890";( E9 o8 v' ^8 w
- //要加密的字串
9 B2 w8 m. ^) |5 u& R7 L6 w* K - $string ="www.av4u.co";& l% g7 Y: \( @1 j6 u+ C
- echo "string=".$string."<br>";
! G* T9 q& z# W( r' C# u+ O - //進行加密並顯示加密後的字串3 D( Y2 O) F" H1 B8 N" g
- $encode = encrypt($source,$string);
0 _* b9 Q- B% y3 O& \ - echo "encode=".$encode."<br>";
( _4 L+ b4 ?1 L! z. T0 y - //進行解密並顯示解密後的字串 r( u: f6 ?/ M1 O0 j) d2 Z/ w2 A0 {
- $decode = decrypt($source,$encode);
/ ] O9 o+ x% q$ r - echo "decode=".$decode."<br>";
複製代碼
) P( z* T* A0 C9 p3 ~+ R3 W- c 結果如下:3 _9 Y$ M' z) f# S# Z
, u! M d/ ]/ b: Q
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下: 8 R J* i6 S! r* x: u4 u8 j
|