tid=166& 本帖最後由 IT_man 於 2014-12-11 22:31 編輯
7 v/ }) N9 |. I4 R
6 f3 o9 C6 g; ^, @由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。 3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。 首先先檢查linux是否有安裝mcrypt模組,方法如下: % R: q* g2 M" I( h' }7 C" J
- rpm -qa | grep php-mcrypt
複製代碼
* s' J% o9 m7 t4 a0 l或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module7 l: {: E. M% q) E# b3 Y& V% T) f7 e
- <?php
+ D' W* r5 p. p2 ?2 E - // Show all information, defaults to INFO_ALL
" J) R1 }2 B* T' f - phpinfo();
# W+ f# {- a" n - ?>
複製代碼
; ^0 B" x- e9 H然後於browser 執行phpinfo.php,結果如下:
8 \* q9 e5 D) w7 j- s5 L
$ ]5 ?4 v. j- p) j1 g: C) B0 x8 a ' q, ~$ @/ M- F6 F
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。 之後就可以撰寫加密程式如下: 6 ]- K1 ~0 U3 i; t
- //加密函數撰寫
I' N7 [7 @5 }! E. C$ ^% ?9 T7 a - function encrypt($source,$toencrypt){ 3 r/ ~* O1 i( h/ A( N% K
- //加密用的key Q. K0 v* K, I: l% x9 e( r
- $key = $source;
- `% Y# g1 m5 D! H& q - //使用3DES方法加密
% o1 Z5 w: _/ w; M9 k# r6 w0 T - $encryptMethod = MCRYPT_TRIPLEDES; ' w+ Q+ k( R. k a
- //初始化向量來增加安全性
# |" J, }# ~) K) ~ - $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); 3 H& A; H- r3 Z
- //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式/ v) {" C: p/ p: T* K1 I: u
- $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv); ( U% [8 r- y; ~% x! S( r
- //回傳解密後字串% o5 T, l4 O8 g8 P7 }1 v* K' O# a
- return base64_encode($encrypted_toencrypt);
+ t. i- B7 ?2 ]& I - } : B/ y% Q9 t" V) n8 [2 g, B
- //解密函數撰寫
8 o& K [$ c, C. O - function decrypt($source,$todecrypt) {
/ ^4 C6 q: k5 B& r! G5 f - //解密用的key,必須跟加密用的key一樣
% h1 t5 L% | p. B" E' [# I# h5 d+ U - $key = $source; , ]2 B# z1 b/ N5 s" }: b: q% s" n
- //解密前先解開base64碼$ \$ G+ y) k$ y: [4 G. [
- $todecrypt = base64_decode($todecrypt);# \0 u/ Z* j3 q s' W
- //使用3DES方法解密
1 z: \' F3 g7 P5 g$ q - $encryptMethod = MCRYPT_TRIPLEDES; 8 S% W+ F" q; X: x
- //初始化向量來增加安全性 - C3 n8 p' p4 l. v5 ]
- $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND); * |* f% H& m& c' F( Q B+ T
- //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式
- u: ` B; h8 C% d& p$ s# ]4 ` - $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);0 l& ]- W1 L" V& ?; G
- //回傳解密後字串& `. h4 S' i7 `& S0 i: n+ X1 \6 s
- return $decrypted_todecrypt; + @8 o# `7 w; W$ g
- } * h$ \- X8 a& p3 w8 P
- //寫好加解密的函數之後,就可以來進行測試了
/ ]: ^( J3 o$ e9 A8 V1 t - //key設定; \( ~/ |7 z r7 t0 }4 G: H$ K
- $source ="1234567890";6 o/ k3 w+ Y `+ l
- //要加密的字串; o% q. e% p% P* W
- $string ="www.av4u.co";1 M1 o5 v4 ^* a7 g8 y y
- echo "string=".$string."<br>";* B% t2 _1 O, ]: x+ z
- //進行加密並顯示加密後的字串8 r( G. L4 {7 F: y4 J; `; u
- $encode = encrypt($source,$string);3 d' {6 e4 B1 V3 P. U8 Q$ K) G
- echo "encode=".$encode."<br>";
9 B/ I% k' ]9 S4 x5 b - //進行解密並顯示解密後的字串
( D, q0 G+ U: |. r2 s - $decode = decrypt($source,$encode);
6 g/ p9 u9 H. e! a5 f - echo "decode=".$decode."<br>";
複製代碼! X0 o0 V& u7 Z* x* F$ p ?
結果如下:4 m, z- ]# @( d4 W X3 D
6 y) p# G+ }* K. S0 F
注意: 如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下: % P1 T0 d b! j! |' Q0 a
|