本帖最後由 IT_man 於 2014-12-11 22:31 編輯
' R K% ^& F" j% M1 x5 @. y
2 J+ s& q- w4 G. {4 S( r由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: . d& N" k: N# e2 [$ l" S
- rpm -qa | grep php-mcrypt
複製代碼 * u; R9 s& ]1 {/ D. |' h
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module! Q/ Q1 M; [4 }' c) i
- <?php
7 ?$ D& {: j1 @ - // Show all information, defaults to INFO_ALL
1 ~7 d4 l+ ?$ o; {/ B - phpinfo();
; X2 k4 U7 B% N( m! Z - ?>
複製代碼
5 W; w' W7 h' s3 B2 ^ D然後於browser 執行phpinfo.php,結果如下:
- [' U; \7 Y! e/ G9 W' y; }& G
9 @: D- O- v6 q( K5 P% i6 H
, j- x) o8 A* |- q) y如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
9 s$ [3 Z# W" Z+ \
- //加密函數撰寫
$ h4 q% l* W$ i$ v& a - function encrypt($source,$toencrypt){
9 g2 m) x# @5 q" E) y- q9 G/ p - //加密用的key
4 t# u, n* M: r3 B2 P - $key = $source; 4 Y- m7 X& d6 c! g1 v
- //使用3DES方法加密
4 r% W! h a* E+ o - $encryptMethod = MCRYPT_TRIPLEDES; 6 i- d3 x' Y' E; N( V
- //初始化向量來增加安全性
8 @' D( L) ?7 j$ h" Q8 e - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
& J% m4 A/ L; N# v - //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
3 \1 ~6 L) S. F) }* k; r6 L: c6 n - $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
/ }) u! b" D! e$ e+ N1 U - //回傳解密後字串2 T$ h1 v, L& [0 Y# L
- return base64_encode($encrypted_toencrypt); ( b/ X, j/ T2 N( L2 E# S
- }
6 O! _0 f0 u s+ d - //解密函數撰寫2 Q' l2 W4 X" [7 A0 H
- function decrypt($source,$todecrypt) {
+ P6 J2 Z; \' M% v6 _ - //解密用的key,必須跟加密用的key一樣 2 \1 n9 P- m& d3 s3 o, ]
- $key = $source;
$ J. `0 ^1 o1 Y6 {6 O7 @( I - //解密前先解開base64碼
: d. N& k, |' N - $todecrypt = base64_decode($todecrypt);
, m. a& U; \( s+ A) j. F) S: a8 a6 z$ ? - //使用3DES方法解密
. Q) Y L; B9 C7 ]. G0 G - $encryptMethod = MCRYPT_TRIPLEDES;
9 G9 K! u2 \9 J6 x2 U0 k) V i" R - //初始化向量來增加安全性 ( e) T( t' n$ W) [' c( U
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
. L! }- p3 P6 {/ {2 Y7 U - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式 H. \, l' ]. C5 ?0 `- K
- $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);/ p4 y7 D$ |. y6 x, Z" P
- //回傳解密後字串7 [, n3 R1 ^( T6 v* p6 {- i
- return $decrypted_todecrypt;
1 W; K1 y2 U1 E/ ?- R( B6 K0 m - }
8 E% ?$ U5 W7 v0 }. p - //寫好加解密的函數之後,就可以來進行測試了) P) X& E1 ?8 I* @+ S3 F" w
- //key設定2 V- I2 ^2 r9 `5 t3 Z1 q
- $source ="1234567890";: P9 X3 S- F9 d5 ~ i# O5 R
- //要加密的字串* c* K& y( r V
- $string ="www.av4u.co";7 A0 T9 j4 ?% q' f8 s
- echo "string=".$string."<br>";
; t N# o0 v3 ^8 C' A - //進行加密並顯示加密後的字串- U4 |# _/ F' m2 W A6 H' V' ]' n
- $encode = encrypt($source,$string);
5 F( X9 L: ], D8 F2 F9 m - echo "encode=".$encode."<br>"; ]2 n( v2 X- f! [
- //進行解密並顯示解密後的字串2 }) O9 j; O) A+ \# j
- $decode = decrypt($source,$encode);
: I$ z# e: q; } - echo "decode=".$decode."<br>";
複製代碼: b$ S; P+ G J4 {8 o' H7 \
結果如下:
2 G# Y n7 k. J6 d
/ Q% Y3 [$ ~2 N5 K 注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
, |2 ^- l) v3 p& n# }9 l |
|