本帖最後由 IT_man 於 2014-12-11 22:31 編輯
5 M" V/ a7 y' z5 T% A0 `' |( Y# `; H; J4 H' i
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下:
% [4 a/ e& V7 L7 ^; `' ?
- rpm -qa | grep php-mcrypt
複製代碼
0 s, z) v. h! X: A2 y* |! @或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
. d7 ^1 c: E$ B1 i) c; w7 s
- <?php
: I* O, k3 M) t# g, I, F - // Show all information, defaults to INFO_ALL) r+ a2 I5 N1 @9 g$ W; ~* p0 h% i
- phpinfo();
; O, ^8 j1 g# B- ]# ]" M - ?>
複製代碼
, ~0 z; i% Y' [. e8 j$ y" S& T3 d然後於browser 執行phpinfo.php,結果如下:
) a# j! r" M) P/ E* y+ N. Q
4 X3 B$ e# o& P/ w- t
* ~: k1 ]" B+ g3 k$ Y4 T3 p如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下: ; B7 I1 F7 ~6 h7 Y; ~- l6 x Z- L/ W
- //加密函數撰寫# Z- E- C/ H( X t
- function encrypt($source,$toencrypt){ : h9 ~/ T1 x! D5 q) q0 e: v& e% s
- //加密用的key 5 V$ w2 k+ b, S& ~# |+ D8 X( F
- $key = $source; 6 J$ @6 v9 S. O& M6 ?+ W
- //使用3DES方法加密
; \" D3 C5 }/ j3 U - $encryptMethod = MCRYPT_TRIPLEDES; ( L4 N; `5 o; p! P* O9 d
- //初始化向量來增加安全性8 e+ W' _% o; G( i) X# S$ ]- a8 E3 {
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
7 t7 O) q# Q1 ~ - //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
$ [4 q* ?0 e: O2 y1 s1 j - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv); 5 L& A" r( {1 E: U, T o
- //回傳解密後字串
8 i* X |( r4 @! i, X - return base64_encode($encrypted_toencrypt);
# w0 H: k! D3 G8 V - } ! k0 m, W$ ?7 V' x* u0 A
- //解密函數撰寫3 u& H9 e/ P6 ]
- function decrypt($source,$todecrypt) {
3 \+ x/ }$ F% p- s, h - //解密用的key,必須跟加密用的key一樣
3 o* W2 H7 f+ `; @ - $key = $source; . S4 ]( S& R" q3 p# i5 I, `
- //解密前先解開base64碼& G) @5 k, \1 K, i+ j
- $todecrypt = base64_decode($todecrypt);
6 u6 l) ^' E4 n$ ^! _- M( o0 S) y9 t - //使用3DES方法解密& j4 V3 q$ X% A; ]" ?, l
- $encryptMethod = MCRYPT_TRIPLEDES; , ^% K* G$ U) D2 _. ?+ r; `0 j/ Z
- //初始化向量來增加安全性
) [; e9 A" s" G; j - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
6 N( l! ^- I: q3 f# }1 J* }1 w+ @ - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式 , {7 y6 {: M( t% L0 H2 u J8 C1 g
- $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);* L* h8 u4 z. r) t9 k
- //回傳解密後字串
" t. r' v/ F9 z& o; U% e7 a8 J - return $decrypted_todecrypt;
! r/ @+ s3 b0 e, L- [- } - }
8 a+ z2 P, Z7 m& Y' C* {+ R - //寫好加解密的函數之後,就可以來進行測試了, N$ w F3 Z+ e- O4 z: r- q, o
- //key設定
$ H, ?& \4 Z) F" s9 G4 p$ t8 E - $source ="1234567890";2 i& p8 q5 K' E. {: j( D
- //要加密的字串7 c% G) s8 l& W2 c1 X" O, x0 h
- $string ="www.av4u.co";# y {3 J# S: |7 \/ F F
- echo "string=".$string."<br>";
1 U- H# r+ Z- r) H! x - //進行加密並顯示加密後的字串
# ~0 W8 j: n$ Y! A( n* I7 X3 R - $encode = encrypt($source,$string);
' }: W* Y5 i2 P4 N8 K$ p. U - echo "encode=".$encode."<br>";8 G% g4 E% n. h/ \$ b' w: G8 F. X" I
- //進行解密並顯示解密後的字串
5 }: f) q3 Q/ P2 A. t - $decode = decrypt($source,$encode);
% }$ u5 ^+ T7 s6 L' j: S - echo "decode=".$decode."<br>";
複製代碼7 f" L8 `4 y' v: ^. `7 U- P
結果如下:
% Z! O% d( i! c! d9 x% U4 N u1 K
1 M \. c4 i$ h% F/ O- `
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
# v" e Y& S5 p/ c4 F" k2 \- V: I |
|