本帖最後由 IT_man 於 2014-12-11 22:31 編輯 ( s" m" v- H7 v8 H9 G% C
5 P3 X1 j- ~( ?5 v) f
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: 0 ?: b/ E8 Q! V% f
- rpm -qa | grep php-mcrypt
複製代碼
+ y8 ^6 x Q( P6 A f! ]8 J或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
. q, h7 G) n3 ^# O" y- ]
- <?php
3 M: _- A/ `1 M/ u! b1 H2 @ - // Show all information, defaults to INFO_ALL/ h( j2 b* n, |& s
- phpinfo();; W/ r( y3 q$ H( k3 \# V
- ?>
複製代碼 4 E: L1 S' ~; U) [, U* |3 Z, K
然後於browser 執行phpinfo.php,結果如下:
4 C @$ u9 @7 G- B9 k2 ~
% I+ g" M! n5 V: Y
6 Q2 n! V) m( G* j如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下:
$ \) g* K9 B% }" C
- //加密函數撰寫/ c/ \3 `% h& P$ N6 \* L$ }4 [
- function encrypt($source,$toencrypt){ $ X( K' R2 @* i6 v I G
- //加密用的key
; p8 [6 [3 |7 A6 J - $key = $source;
" D7 I0 T$ x: i5 \( V% { - //使用3DES方法加密 & _9 ]* w4 ], [# H
- $encryptMethod = MCRYPT_TRIPLEDES; % g2 @5 S% b6 s9 z1 x4 a
- //初始化向量來增加安全性
3 ~. p/ ] S/ O) ~' } - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); & Z3 J" g4 k# n0 M
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式, \# a) n5 J2 k7 W% U
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);
% Q, [; Z* n( Z% h - //回傳解密後字串
: |$ q/ Q6 }6 @$ V: ? - return base64_encode($encrypted_toencrypt); : j1 A1 U9 o, J2 \0 \
- } 8 }5 D/ P# Q2 O4 H+ ?# g. J9 F
- //解密函數撰寫" o I5 K3 k* j$ ^; r
- function decrypt($source,$todecrypt) { & C) I) [, F3 t" ]3 z7 q
- //解密用的key,必須跟加密用的key一樣 " Y- x5 } |4 M8 t: t9 {0 b$ k
- $key = $source; 0 W/ \: [7 I4 U, y
- //解密前先解開base64碼& M% f' a8 T' r$ d& L
- $todecrypt = base64_decode($todecrypt);: F' a$ u% r6 V2 x. `/ c
- //使用3DES方法解密
, a9 T0 G; X$ R - $encryptMethod = MCRYPT_TRIPLEDES;
9 v2 Y5 b1 G, F& `' u - //初始化向量來增加安全性
- h6 F3 t. d5 ~0 Y - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);
& t8 n& g5 a/ R* _1 D( j* t - //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
1 |: i; I' Q$ p5 i! i; K) M - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);/ g9 w1 m+ N* z% h* J$ o, w
- //回傳解密後字串4 p$ r3 `% _3 c0 ?
- return $decrypted_todecrypt;
2 Y' F b* l: L0 a. g1 D - } # N+ X# \) w3 O O
- //寫好加解密的函數之後,就可以來進行測試了2 ]# R9 I, x( ~$ M+ p
- //key設定 g- \/ n# K, g2 H F) O
- $source ="1234567890";
/ F! y k+ {: x8 L( j$ g1 D - //要加密的字串
1 }& p/ A1 b0 F) E - $string ="www.av4u.co";) O( g/ e6 F; O6 _. G% k
- echo "string=".$string."<br>";, R) ]9 ^4 B4 P7 ]0 [3 c2 D6 m
- //進行加密並顯示加密後的字串$ w t3 u$ G$ n/ y: M
- $encode = encrypt($source,$string);
2 o# z$ e+ q0 H8 Z - echo "encode=".$encode."<br>";$ `' x) |6 ^" C& v$ a, h
- //進行解密並顯示解密後的字串
! c- _0 }! {4 J0 m5 y2 H, W8 [ - $decode = decrypt($source,$encode);
; E& j9 K% V2 N: C) K9 k5 f - echo "decode=".$decode."<br>";
複製代碼& r4 p# c h- G2 Z' S* j& z q
結果如下:
" L0 L; i0 D* h6 F
8 a2 u! j1 i7 L" V
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
# T) U8 B# |2 ]2 a% s. R/ N, t+ e |
|