本帖最後由 IT_man 於 2014-12-11 22:31 編輯
5 D, b# t2 U1 k) N9 S
. {, N; ]3 M0 D& z w! o& w- J; w+ d @由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下:
* E+ O K z7 r( \8 W* e3 ~
- rpm -qa | grep php-mcrypt
複製代碼 * n) U6 Z7 I' l
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
- U m- Z2 J- c% @% r
- <?php- E2 N' D- Q) \
- // Show all information, defaults to INFO_ALL
9 ?0 y) Q1 Z1 s; q# F9 d - phpinfo();
. g9 e @; ]6 N9 q - ?>
複製代碼 9 S/ ?9 t. E/ L0 \0 f
然後於browser 執行phpinfo.php,結果如下:
7 J0 v1 e& ]# U/ X* @, `- Y
' t* m7 n5 e6 ^1 _
" O7 L8 g. B0 n! _! b3 D, _0 e- q如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
) _& L Y5 q) ^0 |+ w
- //加密函數撰寫/ ^: a w0 W/ ~8 v+ N* B
- function encrypt($source,$toencrypt){
' ?: K( `" Y3 F. V - //加密用的key 1 F# f) F, o& [) Z2 R+ L# B0 _4 i5 \
- $key = $source;
0 a# N4 @6 N) M# P - //使用3DES方法加密
, j; y4 }+ t2 X* g - $encryptMethod = MCRYPT_TRIPLEDES; : _3 C& ^& }' u% E
- //初始化向量來增加安全性2 q9 \8 q1 g) } e4 Z' ?
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); F7 q) S; O( n" a/ c4 o; J! {
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
2 W; @% X* e- \2 @# | - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv); / y9 Q+ Y! b1 }) Y, g
- //回傳解密後字串
$ A: V$ H/ `- b, u# \: U- Z/ w - return base64_encode($encrypted_toencrypt);
1 ]3 c, o) {/ P# i - } 0 w0 c/ _+ p8 ~
- //解密函數撰寫9 Y- O- ^6 N/ X/ `7 k9 m! ?9 v
- function decrypt($source,$todecrypt) { # D& {7 d# f/ d% j
- //解密用的key,必須跟加密用的key一樣
5 l; `% [7 @: M+ Z( C7 f - $key = $source;
: o/ f( m7 Q( a5 Q - //解密前先解開base64碼
: n1 D, J% |! T - $todecrypt = base64_decode($todecrypt);
( ~4 Y" @: ?; O: o6 m% K. R5 C - //使用3DES方法解密3 v$ U$ R5 Z$ F$ Y8 S1 x
- $encryptMethod = MCRYPT_TRIPLEDES;
8 g2 a* z: q& V6 L; a4 m: { - //初始化向量來增加安全性 2 M2 l- x9 N) o* {
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 9 j. d1 K- G, k' L9 j+ @1 k
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
7 L1 M. u; a8 X2 r. u3 l( V; u - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
( V. f) w( f+ z' C( y n - //回傳解密後字串
0 B' b9 i* f) q3 t+ }# C2 w - return $decrypted_todecrypt; ; O3 g# B" z! \4 R0 |
- }
3 e, Z% n2 x6 u/ J - //寫好加解密的函數之後,就可以來進行測試了
+ ?& t6 A) x; J' X9 L u - //key設定5 y% ~8 h' v4 i( l
- $source ="1234567890";2 A/ Q$ J* w e. ^
- //要加密的字串$ o' @+ v6 ]1 T- g' P0 X* P9 ~
- $string ="www.av4u.co";
3 R% w! ]6 u8 \3 d: G! Y( n* { - echo "string=".$string."<br>";% l1 r$ g1 U! x9 S
- //進行加密並顯示加密後的字串6 J2 p( Q' B& R. k- t
- $encode = encrypt($source,$string);
- S! x4 u# @% F/ R8 }0 S9 [# h+ {6 A4 R - echo "encode=".$encode."<br>";; a0 L' K P3 [4 f8 K% B
- //進行解密並顯示解密後的字串; L# t- e1 x$ q" G& n: I! s5 I1 a5 N1 H
- $decode = decrypt($source,$encode);
& i! p, h& ~, t4 H8 F' b - echo "decode=".$decode."<br>";
複製代碼
) u2 O, x& M5 @ 結果如下:
& s" Z7 b1 x( _$ M2 o
0 e9 b* B9 L9 p6 B2 `: j
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
5 V! j" i8 y4 d/ j! u! C0 ^ |
|